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 043fa62f6ef..09f735c72a0 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 d268c12aa87..c7595de0eeb 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 a75ae33f861..1bfb248d94a 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 46404de0c8a..0216302c651 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 a7a39678192..3081c1d0d9f 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 b50bdf9734b..ec7c729d597 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 4b47014af48..e6a7f827f1e 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 0af5aaf2c76..924559e3e90 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 cd3e704f624..25de6862bdb 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 89f005b7469..378f1b8fbcb 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 32066c67b7a..bc1f4a038b4 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 7679b97d62e..687fefa94e2 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 126a2432cb0..cbaf8d43a77 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 45c123fa2fe..ba1855247fe 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 a73919844c1..07a1c8b6e5f 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 21f552b4163..cefeda04097 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 ce21aa53d27..d5b303a51f0 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 7749c419ca0..7d0753a9de2 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 460c99618bd..6b774e9d5ce 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 14ab79b2d20..0ddb661cf85 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 bc4f5fc3393..45473d6f448 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 f71791e019f..1223f3525c4 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 c9612a7ded7..37617192dd5 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 151021a45f8..803fd6c3ab3 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 ecb38ef5774..367b9ceda8a 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 d8ca8031390..1aaeb154dc2 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 13e8029b512..2c439407c71 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 949957ae8ec..fbf49ffc67f 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 5df084a11a4..a4ba1a41fee 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 c12f2ccfd3e..7051ec046d8 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 b4ad0a556b2..2f9944db3e0 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 9aa3c62e76c..1f8176968d8 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 2d5f2412d85..a494e78bdc7 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 c34a46a8b82..8b9f3355930 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 dde092dd1fa..002b032fa92 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 6950929ee80..e54fcff139d 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 8a54c745695..a49802ea96f 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 8152a76feec..e2bb85c9f84 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 014c46fd73c..6684a5b882b 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 f22a169a102..e61c4cea6b0 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 d7551abebc1..d992c28746c 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 e2cc0dd31e2..300927abefa 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 e0c48062dfb..edac0e6e3ec 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 056105f8071..c2974678faa 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 6a528a66ba6..d16722525f9 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 0724f9f9b45..80557caeca6 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 fd8ffeeaaf0..ae0e55ae51f 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 202c5885887..65bbd9affee 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 01c010c4971..341451522d4 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 e063fc49f2f..19fad984b27 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 7630169dcad..beb1c1cda82 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 fbe9824d067..f698a9d27d9 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 05ad0783fac..b4f15a2999e 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 9fbe3eff822..3895e172024 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 bc402b46fb2..ad0c590b87d 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 294fcc2518f..e3a9c09b5d9 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 4d508ce2d81..7c2a35938b2 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 0205bb308be..61bdb9a2862 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 a7ddcc08314..09af5ad5c44 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 1d53525ab37..ff5aff6fe50 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 7d23e15a4e7..024af9b1580 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 edd3388e74f..88103ec94c1 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 1750e9b0ff4..52a82184dcc 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 f5316350091..fd3958344f5 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 0407a1a0fe2..c2b67758152 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 56d5bcacc47..4cfb2b0a26d 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 16c8deac72e..214bdf302ea 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 c489dd8e382..e411cd82045 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 6201348f21c..3365e5b10c8 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 dde71d14a9c..b17313925a8 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 b13906b44f5..4a58f8f43c2 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 d0b8d8c1163..3c67e2fd558 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 4fd86d078a0..dccc4ac0765 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 50f897e3a85..f2f79f5ed7d 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 e936898d7fb..74554f2afc2 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 b8ddec20440..afc83458aaf 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 1d38764710a..f0ec885a8fe 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 e0039f29e58..249adf04af8 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 aec68af6076..12fff2f479b 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 c1bd7070f53..ba831c3a1a9 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 4c67156c787..40a592f89c9 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 d4bb5566e34..ddf7e61a3f6 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 f19548c4aee..b0e16e412b3 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 4aabcbc75c5..78e4c43a0e7 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 bfc4407458a..16c2aa53462 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 28d20d0db4b..8db9cb6fa37 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 5200c6b0c12..7a12f617740 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 580ffd606f3..0d07133b396 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 e5b0dc8b6ea..822a7988d0d 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 f45c81a0007..9f8ea5607d9 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 4939c0c83e5..b00a0d0d9d5 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 6c02e430ba4..b60cf9457a9 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 b25cf977d83..1585de4b462 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 ec28649d70f..16bb1ee6deb 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 3da77d6d943..c584440874a 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 f77244a584e..8b7867fdc06 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 0f15b6e937b..69acc97130d 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 eff11554a39..663635cd06a 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 2db20662a77..b447018e799 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 3739f77e69d..c82cf14228b 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 3c4cd464d44..df5f6af1695 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 006929c7345..8399719e861 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 30542db5e23..c26c3f5e68a 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 e86b3dd42e8..d84c408e43a 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 a08f7dbedc4..b417c128913 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 324565aae50..70fe1ef0b6d 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 f78966253b7..31f2f88dac7 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 33392c51be8..c2d938f6ed7 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 054028b5629..b3635dcb1f4 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 4674da420b2..9609af42f65 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 b8665fae9ef..9ba008a56ef 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 148a7db2b64..ab50e6dcc4b 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 fa47ac35ee3..3340e0ad603 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 d4294788fdd..6034c24e31a 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 cbe760c06bf..5b268266dda 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 9233b3d152d..46f4de2784f 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 a08f9522c4b..bc9ef9f9e79 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 7c1b0ece4bf..271db41ac22 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 e708504ff7e..103ec694d83 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 232540ee47b..83a1af981db 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 aad62aed486..e366f6bb3e3 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 2895bde0bf7..d249cc5ac94 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 ace47a56d2c..eb9c9c90c4b 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 c3c9138eb89..004dd36ed4a 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 bb1179bb1e7..d54e6dd968f 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 8c9c9e1a6fa..4ace2c6eea1 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 50a219bf7a1..851823385dc 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 45cccef9766..937119ff6d4 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 8991ce4c65b..df918d3dd77 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 14fc6996378..3e3232f2b91 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 7948782479b..52560ea2732 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 f4a6b55dd18..a5caac00123 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 a5a7f320d93..9e95f3cc05b 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 1deb564133e..6081f1dfca6 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 72507b3d148..ee9969c9974 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 f084c135e47..dbb650a8b48 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 358056d7ef6..0850bec6c9b 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 07e96a45fce..43494ec485f 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 b46771e574b..5efb73c2a01 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 ad82cd9e79f..ad1b27f1fe0 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 9c83dbce804..16239e0c98c 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 e2c92d07f9c..14f3549b2a3 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 f4d9f97fe42..87f55fd6b2d 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 4ae39787335..a74381b8a85 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 db1ba60364e..0ca1f950448 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 cec481a2eb4..24ed68c792d 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 5988019e66f..b8c05ead076 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 ad8ea45ffd6..4b6d99da200 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 4fcebe73478..07acf6057a1 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 fa72ab184e1..7a41d237781 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 ae032a8b35f..533238ac5e7 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 a7e49f681c4..2c95198f348 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 befbfc001ba..ed71e05bf5f 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 29e24b510e5..3c06a75fb71 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 1491c10777f..57c4fbe6199 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 3b94991312a..3fb5491ea62 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 6611cbaf9eb..ec9c6bb1f36 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 2ff31a8fd4f..a6b36a71d1c 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 6b9004595bb..2ec3467e0db 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 21bb5bcf993..ae999afe305 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 0a0b9f0fe88..a40529b6fe4 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 cfbb221c164..b8c2bc277f0 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 ca19feba5ef..f450fb6283c 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 0cbc59f76c4..3239eef2b2e 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 a5d9daf91d9..e4419872e5a 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 24b0563890b..c4ad22abb2f 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 9dd8695b9b2..10a7bc38c05 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 afcfd7071e7..c00c19be42a 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 2f9944db3e0..9bc22ae6689 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 e9cdb897115..43ccb6b8ad3 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 3239eef2b2e..2b87df584b2 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 e4419872e5a..543c0a00683 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 663635cd06a..62c0d3dd2c1 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 b447018e799..a7e7eedef34 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 c82cf14228b..b2f8e272983 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 24150c513df..7f48c7ee22c 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 2b87df584b2..d3d1f669df9 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 543c0a00683..24986a574a1 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 f4c36d988b1..a70d87673d0 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 5ad59da5dee..841fbb68178 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 1f1b7088b29..fe6526a16eb 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 8fdde34470b..0124ca1cc24 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 e0bb1c3bb9f..781fcdeae82 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 fd94601db50..4acf75fbdd9 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 50b758f01af..03e079c0170 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 58728225de7..61116adfb60 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 0df019de02c..0547e35f064 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 9a280ffe9e6..b89dbfeb700 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 bee73644890..e733bbd8abb 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 b57f3fbe143..bbd90442cd9 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 eb0236cf3be..293fe4c647a 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 57004191064..5625204c762 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 13a7913e190..b34c90bc35a 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 196e8d704e1..96e5feb532d 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 1f9df527c28..333da7dceea 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 002b032fa92..ce2ecb89d8f 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 e54fcff139d..c00510b563a 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 a49802ea96f..92e07a0547e 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 49a1bced577..5e5597f50da 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 e2bb85c9f84..6f7e3796309 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 03e4437b257..10f8d670108 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 e61c4cea6b0..2e848168b49 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 c914319aa42..ca76552a4cc 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 432b25ac602..b5eac4f9afe 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 5c8c0d6a75c..cea09e97dba 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 b14592d1b78..67dc07f68df 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 595144013b6..022878c8276 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 876c7a1f05b..90ab4087754 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 beb1c1cda82..62c57daf19d 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 a6eaa21ae35..fe131e4dab4 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 ad0c590b87d..f109103a99c 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 bb25d2d619d..0b99224bf7f 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 88103ec94c1..98d625cbb1d 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 52a82184dcc..3319ce6bee7 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 4cfb2b0a26d..db72c87a4a3 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 65b7b1f6f6e..28b577354d2 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 214bdf302ea..97ddd95f50c 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 bb115650061..cec550d24d9 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 e411cd82045..19f3344fb81 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 70a15a0dac5..749a3e83217 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 1de1a4bd6c5..ae5df387884 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 e86d6f7d836..d9500c7a000 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 f2f79f5ed7d..5cd270d5008 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 8db9cb6fa37..dd67cc28783 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 822a7988d0d..702f3146f8e 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 9f8ea5607d9..96e0eef68ad 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 e5853fce5ca..9c1c4b54367 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 8b7867fdc06..8181e54640d 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 69acc97130d..c719febdb58 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 73a28aa121f..b486e907ee3 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 f75e3a692f3..92442479091 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 ac36cc1eb44..aedfe9018f7 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 57b9bdb61fa..f5f23f2f114 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 89d2c1c01da..a0f1dc57c94 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 34a2a1a42b6..07b0453fca6 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 c2d938f6ed7..6ad030078b1 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 a4ba1a41fee..7be0c64ee1b 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 4f9ae7fb733..971b8174993 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 5936b5c3343..e342b2d341e 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 9ba008a56ef..b33f2623b9d 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 bc736a1ede6..9394c568a73 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 21ac9eefdb2..b232e2e63c5 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 6034c24e31a..8a240794580 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 5b268266dda..4a9be339a1c 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 ca5d77b2a82..982c0fe2bab 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 34689c4dccf..3149ae56063 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 c1f51ab269a..41db6c26930 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 4ace2c6eea1..ea32183b511 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 e7f341c90b2..db37f4669d3 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 9632997ac1b..88d6681a804 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 5277a330976..c79ee15db59 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 5bf9b8061ad..b3a7e8758a0 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 c621a12943b..c408080524e 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 14f3549b2a3..b2b8aaa6f35 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 a74381b8a85..6be07dfb1f4 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 07acf6057a1..eae8c17edcd 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 7a41d237781..14f63084709 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 3c06a75fb71..f5f3e03b765 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 59863464d21..2f69b98bcbc 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 ff7b47d6010..9d9c9dfb8e9 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 024af9b1580..5af8d1eb65a 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 5f7e46510f9..69ed44cb7da 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 18c0825b6a1..30421756d22 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 bc59be0d1f3..734f67906ce 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 428de1a683c..df623a2fc20 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 59a4b0306d0..9a6b22b51a2 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 250a0fe26a8..1c40f352ff0 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 3a456dec531..d9d513198ce 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 8fdcc9b8f86..9790a8a7131 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 62c4bc3a065..ab5d562ffc8 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 0be5957a29a..677487945be 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 4a712ba053e..8474849bdaa 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 00000000000..8bc7c220833 --- /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 d3d1f669df9..e5916a146fe 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 24986a574a1..d1bfa69bbd6 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 00000000000..1e598b35892 --- /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 12268d48bb7..1193f90ff8e 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 9265c57bbf3..d9155ece2d3 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 0757770d2f7..d57d3ad9920 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 5885aa01e6f..00df728fb36 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 9790a8a7131..f39d458bbe0 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 4d358bde770..6d19022f959 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 0963d151490..f93d5190350 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 dcadd4d4369..61648c85ada 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 df623a2fc20..126cb37f14f 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 b52641105e4..dc1b943686f 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 81a41b8fb47..d0cbb4351c7 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 e5916a146fe..52010147131 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 d1bfa69bbd6..b1977b187aa 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 0adcdb188d0..f57ad20f5d5 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 973d09a384f..2f2ed8f2fa2 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 fa0a91bfab1..09cf8e25a10 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 ca95c0754a6..4c5b2ceb7d8 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 267b5727b83..ade167e1b3e 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 00000000000..03ece744d41 --- /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 00000000000..dcf16ede58c --- /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 8bb1ab2dc42..31879c5c118 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 a5b7139803c..283b1ee2286 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 d6351db17b2..a6ae0e96c45 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 84be74cee36..45e24d8193a 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 52010147131..66254138e51 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 b1977b187aa..73cea897aa4 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 56554efaa07..b90e6120444 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 97759e96b69..938bc09f59a 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 96e361e260f..1a1cdc16f49 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 00000000000..cef4081c607 --- /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 b74fcd64da0..8e2290a9c40 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 2c439407c71..587cd85a2a5 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 fbf49ffc67f..7ff47f7a221 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 7be0c64ee1b..86b6097ad13 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 c661b1a59ad..df3d9e89392 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 c6ce4391294..d58f483d441 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 00000000000..40faa097d9b --- /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 1c47be45651..2bc5f5040d4 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 ec1848bf1ed..d0ed9a9d33c 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 beb6679e308..2eae581bdc7 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 66254138e51..87228d52078 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 73cea897aa4..8e408e1d24a 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 bbbc6561a87..eb8d16d0c0a 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 87228d52078..95bdb6f7bc1 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 8e408e1d24a..c7278c57b38 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 7aa185c2c39..29cece92e64 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 95f31b67826..a9b5656a0b3 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 f4062458d91..36698db87e1 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 ffab0e0846f..af9a721f1a4 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 29cece92e64..60ca91b0052 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 126cb37f14f..ad8ec114eaf 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 52560ea2732..c6d6656f134 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 dccca97a1cc..d9adf6015c9 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 365f84cf7a3..e4bdd140faa 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 ad8ec114eaf..6f7910f9120 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 26ee7cb8bd4..97be043402f 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 97be043402f..26ee7cb8bd4 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 cbaf8d43a77..254d841aebc 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 1be06876baf..5325544bf15 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 851922e4f3a..c41d5afe169 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 00000000000..cd8c0d27c36 --- /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 5657e646be5..ce59c959133 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 00000000000..2c48b14bb03 --- /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 00000000000..9693d59fc6e --- /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 e7394356c64..1a28c3076e7 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 e06eb3a8ef4..6868d21ce1f 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 00000000000..5539c6f82df --- /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 dd0342a06a3..1584d342db4 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 95bdb6f7bc1..a820ea3423d 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 c7278c57b38..9d050e7288b 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 00000000000..21252facd75 --- /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 00000000000..21fcb4798db --- /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 3d179c63adb..4d88cdef0f2 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 a32a28993ca..416918e6f43 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 a820ea3423d..e1d63b4b754 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 9d050e7288b..e5b86bf59da 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 47c7a98023c..d497aec0dca 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 8f1155aa5f9..bb01114a5e3 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 121262065fd..fcdee98a74d 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 cd8c0d27c36..ca868b8ebd9 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 1907d9d23ca..a4ab9123b48 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 bc41d3d2df0..6a5074c6e4a 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 7e837ca5ff9..8b1c413b205 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 6bbe75a8019..0aa75438f7b 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 00000000000..ab556519e07 --- /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 0c5e213ea0d..34dd01d06b6 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 00000000000..f9fa46b6667 --- /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 655000662ec..afdea87956b 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 0124ca1cc24..d42a647c82f 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 5c45e272e91..d57d80c7911 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 2eae581bdc7..0cb788eeee7 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 e1d63b4b754..6724b83d8b4 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 e5b86bf59da..83255df5714 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 734568606b2..1720c2c58c8 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 8834f730bce..888ad87a848 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 795f12266fb..43cb993cec3 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 885cfacca41..2436ce6298b 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 d463ebca36a..bb7ae3f75b0 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 6724b83d8b4..6ebf1213c63 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 83255df5714..307113e9b18 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 868bf44a11b..e630f201e12 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 f1ddc4abba6..034fa23a3af 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 f860c1cec4f..7678712db51 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 86b6097ad13..2b9a959deb2 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 d5cb3db3aba..44bb25b3fd9 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 5325544bf15..aea8ecadaff 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 27c16fac3a1..f933b9c9929 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 9b2c95dd7c9..e4fb72db91b 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 5172322a63d..e47ac69be5b 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 dcf9c36474f..dea116b3905 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 293fe4c647a..9b8a5637de2 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 1f8176968d8..aa8d19dc40f 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 f4efd0de355..b7df82961c7 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 c19a0033f86..76fe619cc1c 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 5d709ab1e63..afa5013b339 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 7d16f072b98..900b1caaf97 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 6bbf30b000e..0fc3e55a587 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 515b7cbc614..3157a00aa9f 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 257407bb763..484bd708489 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 09af5ad5c44..9a8d6177214 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 f8a10017cab..53ce1c0634b 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 ceef8acf7c3..a824d5f8ee9 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 603aa826123..88fe94eac48 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 94a171d9c2a..95e7e2cc400 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 554ae59f397..919a20d0e4c 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 3c67e2fd558..5c4aa762b5c 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 6eb539c19ce..efd1a74f5a2 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 a0a0f6ea18d..2679170b03d 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 e9a0df5c983..ae798bf4c08 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 ba831c3a1a9..61ae05fa010 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 40a592f89c9..7f1cd547c02 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 b0e16e412b3..a2adda95b3b 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 5bc0c1bc53b..e5bbe88edfb 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 1bc9c116cda..16b25e4f85d 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 4c9b6343f2b..6baa3a63f9f 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 42f1f62d10a..8814c8968a0 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 b33f2623b9d..76b225bd93a 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 55c2371aabb..fb0df36d4cb 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 9384c58db81..6efd4c849aa 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 40ec4179cd1..e5afa272c40 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 27a81b2a667..d11ff84a73c 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 ef9d9b1ddce..24bfd77f762 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 ad1b27f1fe0..c891c698cf6 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 c9b4aa53fe5..fe5b1dcf3af 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 c6aaeea7ac9..9955a650cd3 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 3fb5491ea62..f1b76075ae8 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 4cbb7a23496..bf6db55a2da 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 145bb42af5b..c724b9e890d 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 9136b53ff0b..28161cfa18b 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 306402cd2b9..1c5224d89c3 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 4d4c7d3d900..5cbf0d411a0 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 1c9d412d974..c98833a7daa 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 061d2c5c99a..621dc09930d 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 60e73d48978..520c3b516df 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 00000000000..cdfdff404ec --- /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 00000000000..3d2b30f1079 --- /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 00000000000..c4f1d0efa3a --- /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 b90dd8a0531..0d0edb841c1 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 fee99235681..877fdf51f0a 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 23b62bb0331..da3c432a6af 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 63102c29687..4f585d964a8 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 af5266ed4b3..7d09e248893 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 9ac0a36ff9c..60ebeeb1566 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 00000000000..d8dec2c40cf --- /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 ab3c3e6adb9..a7ae6d45573 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 1584d342db4..e00cd1b5936 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 649cf9af6a5..5574c93c515 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 b94a40135d8..2c15d3e4182 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 2c2e2b86388..72651d6eda4 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 c27a72865fd..9e5fa983ed0 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 00000000000..52ba55b509c --- /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 79cb4adedfb..62cd47f831c 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 9ff6cb4058b..a6208726451 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 fa63ce63454..fefa07ffa6e 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 362bdbeddc0..d1b2209294a 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 136227ffa71..732a331681b 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 9e84815d636..c915c5ead0f 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 ba09068e7e6..c41afad4759 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 3abeab32262..768ef108969 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 ab0409694d1..c42901cd6c5 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 13fa67a8b6b..e6e9110b33a 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 6ebf1213c63..1eacae0399c 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 307113e9b18..65453aeff2b 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 0a7973709c1..c7e708e3207 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 368d610c226..5741af47a07 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 67fcbebe9a2..3e3d63965d3 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 1eacae0399c..713679395a8 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 65453aeff2b..d3ad10c676f 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 c6430546bf2..b73b749cddf 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 713679395a8..9a03a72d30b 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 b0808d83d68..3171b8e953b 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 f450fb6283c..3258f0fb2f2 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 9a03a72d30b..ed8a0dd98e1 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 d3ad10c676f..bc8276cf458 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 a0eee38c3f8..446fe898aaa 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 b91b815d58e..62e5ed891ff 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 e8b4e92327c..bf2468b704c 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 2fb184848ea..d78b5eb2641 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 3258f0fb2f2..d0253ad723e 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 ed8a0dd98e1..9fd3e1a303b 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 e0daacd98bf..89205d4ee8a 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 f7140bdb400..540e39f8f44 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 c77e0b3254d..02b0e2ea455 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 9fd3e1a303b..358d8aa62e2 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 bc8276cf458..4a6308c8908 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 6dd431aac69..f9362799224 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 54dd684f6b1..aaeaf19c5f9 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 7cb45296506..bd5a0c72047 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 36dcbc950be..4306ce4e719 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 df3d9e89392..b7952077223 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 0fc747ffaa9..0f48ef6376d 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 3081c1d0d9f..d5487bbe29f 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 689b279c5e7..47a7f5a2037 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 ec7c729d597..9ce3809bfe8 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 687fefa94e2..85851bcf696 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 254d841aebc..a59beae1d34 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 ba1855247fe..f8c10516f24 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 d5b303a51f0..03e22cd72e2 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 7d0753a9de2..6de462b9020 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 8c925bdf315..71e694f6807 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 6b774e9d5ce..6ef1c0aab86 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 60ca91b0052..861b2fa30e8 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 0ddb661cf85..9e774bfdf1e 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 687d0d31263..9ecd2ffd155 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 eabd4a7f74f..51503142692 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 358d8aa62e2..0805d384c99 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 4a6308c8908..8f62b8427b7 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 b63acf4ab4c..cdaa30dc049 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 8a540a96b0e..b0da48ab713 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 d0253ad723e..fdb7f8f18d9 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 0805d384c99..cbac7186ed4 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 8f62b8427b7..7a35896b496 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 ce59c959133..1e8e2e20b2d 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 2c48b14bb03..0a55a21f6ed 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 9693d59fc6e..ac8008f7f9b 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 ed1bc1c8f7d..a588f68ea4e 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 e468c516676..649be55e94e 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 113957d140e..93b98a7c9ce 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 b2b04816616..d9a79d6555c 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 c17c79ccbc8..17caa1f7478 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 6e1c3d9f8f4..fc140420d7b 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 46b3a9943f8..f5519ea903b 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 51503142692..c8dace4e87b 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 eac1c36401a..85ff4a3f5b1 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 ddb4954794c..8a3f2f3f96a 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 02b0e2ea455..0bcd25569a5 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 1509402d720..0414dd0e8d9 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 80dc959c136..335befa937b 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 4c36cc0dd22..c7086bb2e8f 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 1859f084bf1..e86a187793f 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 756fb56acc1..d5c7dc6853d 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 ca38f26ff1f..2eb72f6bd35 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 80c245b8d8f..e4cd0e27a39 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 9824b20db2a..06ab3ab1483 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 93c88655d34..ff1faf39827 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 d47e5dea96a..6144ccc6870 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 c7220d8e059..dad5fc88e80 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 4bfcff4ce76..abcc46cadad 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 8c4bc1b3cc0..fd6950a88a5 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 99c84da6334..c92837d2417 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 f5181a7d33f..60fe7204034 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 5fea6c3f2e2..9101e342a23 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 d076d71b24a..891b485bd97 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 df0de2079de..db9d8c7d3b9 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 0061aecade9..f4dd2cb6ae8 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 5908523e6d8..643f42b4201 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 f5795a55f04..1f400470943 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 b498e4476ec..0d3639040f7 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 ba934b804d7..2f22b9f6344 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 bc887505cd7..2b5c3c87a5d 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 f7f704e998b..2a8e2a78cac 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 8922249e3fa..cd402b3db90 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 cb063c4c047..5508f4b6869 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 aded8c1c9ac..4266d55926b 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 58eaad4648b..9ed57d2d982 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 b871fa029cf..aa55cdba355 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 d756fa457d3..36ec1c79e58 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 ac18b14682e..8681c308ba3 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 6a3591b001b..f02e964fb61 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 2e032dedfe7..6afeed701e8 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 c7910a1254b..fdfcb4de047 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 493940329f8..9479f76c7d8 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 204327043f9..3e7a9359614 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 18e5a4b5ed9..55d700c6496 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 e2b49ccfec1..b8c711c1dda 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 48d8c58dfe1..1b5fad1b588 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 f6217eeed18..729219d8f1d 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 cfdda5a0d84..bd72cb8c06c 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 7c9e7bc348c..41be3251b10 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 2741ad358f6..2ead58c0fe8 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 3f9c0043a3e..f6e88ce2899 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 348f6148386..6e8899c79d6 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 614fb0d98ef..f9d4cf09e04 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 af1d9d889df..9e3f0e956e5 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 2448f87778b..88443e86722 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 1b4dc73810f..ca62e91f09e 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 42670d510da..201c01fa709 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 ed7f7270bd5..bdace6c35f5 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 69adb76d3cb..169132515d2 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 1c9724b7dd8..e8473910abd 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 cbe95684715..be2feb9d207 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 caf1aafcacf..e198813dbee 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 63c0494c2f1..d403d96ce6f 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 d68703eee84..f094109ba84 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 4912f72b906..ef1b91225f4 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 75ee7c8ad36..07726bc8cb0 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 f61b674aa3a..4759a356d9d 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 324abf792df..f30f7d041a0 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 fdaa649b344..8dda93b16b9 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 df6aa5b03de..9ea32a9e5df 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 52d2d40a99b..ca4a44c55c6 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 b6ae27346f2..9ef6fddcb0d 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 393d3f45104..2402c41402e 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 058bbf341e8..be59b2fbaf9 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 d7d3752392b..dbd79896718 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 6b6311c6b0d..6dcfecefc22 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 13537c53d0c..854b42f68d3 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 a179ca9c066..74ec59195df 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 7f48c7ee22c..7dc77d958ad 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 dfc1a385c6b..0737e506785 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 bb6c5e783fd..448e3af1d24 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 4af42fb28de..68f0cf9e461 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 fde6dc6e546..adf3e74c7a6 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 0c474584f36..5f677a433c8 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 5f604322b16..359cb471ada 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 85dc005a6a8..94d786c8825 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 abcff158bfb..1ae68100c06 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 e3a2400ac8b..ed8e10c1956 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 be0b64dc0b1..e8817507672 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 dc26006d711..62216290b80 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 3a61d0636bc..45248bf1e7d 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 0cdcddb56df..b485cf831b1 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 4c83116747b..972903e53e6 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 c9d6d14c109..d10f9641846 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 488997378ef..1470832e899 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 dadb28c0392..53ae0cbe533 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 a10da6e1cc0..520fce157cd 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 18f048d1efc..ee72e056b30 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 75b9ec2619f..f5d3390d005 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 4ac1f55b2b0..5d950ccbe2d 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 44beaaa213a..d22d526d01c 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 22585f7766b..5a062996ab9 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 5caab7fe89c..9b7aa80e2cc 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 dfd05475703..8d134792bbd 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 2aa7e64587a..e3f827f2718 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 27698a7b94a..e0d2b2bd3b4 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 c55b6895e80..966de82f219 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 9d625ebcc7e..ffb1a33ed7b 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 e0060490cfe..97ae62bc3b0 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 5d5db4b0741..57dfd0d360a 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 56079887450..acd0fa80423 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 7e2decb2bff..4f7a8f489bf 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 0041895a290..bc0ebd17d40 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 68e73525291..3c106027d8b 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 f22c7b252df..ab1a4bf0438 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 788d72b707f..3da130fd799 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 8407aee07d5..053e0ea0ba1 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 7e8f44648f1..3cd4be6f9d3 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 6d64c313039..624d812f5f3 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 d9b193e6dc6..5f63e7c6a50 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 162091de9ad..508483732fc 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 a752642335f..a289004ffeb 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 bbfbd3791b2..bbecccf2a91 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 94123ceba85..53f05388817 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 4df780b200f..7394c60804a 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 d50fd262729..4c716929a86 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 425a44bf042..28894682430 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 e16632718d1..247422bee73 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 d340fb00d94..c2a7dc63e00 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 be9cb8dcc97..d324ac862e3 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 2d550a0851f..3f6efd0a3d7 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 cefc645725e..53210a17f17 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 a3a647e0974..0abe5fb3347 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 1c4e8b652f5..e1f8f309e60 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 7e06e781563..a26bbdd58ab 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 ae7eb4234b0..15f5b71d5cb 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 7bca10f761d..fa382b1b6a5 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 291ade0f607..2eadd214bc1 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 edeb10dcec2..777e8c5181e 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 4bd9846f76d..6e29d977f66 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 bb0e2b8f248..5e747d94732 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 493351c2641..53aed42afaa 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 8bf916a802d..217803ef195 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 723930666c4..9e6bd5b7e5f 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 8474849bdaa..e4be9cc3e25 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 61080b12c20..53dc30d6b39 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 939138bf999..c0de99654ac 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 83a6222d357..76e4ff701c5 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 672368e0f8c..e7bd53560bf 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 f6c85a7e9a7..a1e47f967c0 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 7f5ff6cfd02..be4094cca6a 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 8380c3b10fb..621821fd211 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 75d747da4ea..6aeac70b4f3 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 1ac905feac2..253174972b1 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 cc18e48d3b5..0a2a52cb21d 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 fde980fa5ca..6b447f270cc 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 743bad148f0..42e6b81dc1f 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 0ec70b027ba..59096d626e3 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 c056c7cbeb6..a6383149888 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 f4412b6933e..a8ed951b1d9 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 f6ab4e3a570..bfa692c80f3 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 0160d5ec918..2dfafdf0451 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 0a9f972c84e..52173f001e7 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 be21605196a..7849b2b3346 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 a6ae0e96c45..5c18f0421cd 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 f6c0c187c8c..60800963842 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 706bca862df..18f26436981 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 dc3f34e9ed9..482b6918518 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 11820f781d7..c51f737cfd8 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 d6bc3b1eaa1..f25bdca2fe6 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 d9ce5253e95..21476d2b7ff 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 637ee001ca3..aa67be422c5 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 7cc210c7053..c59cb6a9c7f 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 de8b978b9f9..20d72b30a6a 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 313ac2c262e..6eaf933b82b 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 b0a313a939f..361df9575df 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 99b966c6c50..cb9cfb17ac5 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 b0dfc63d929..94953a773c2 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 ac7a11eed3c..b8be5757df9 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 039b125e988..f1a92ec727f 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 1cbaa5fa156..6860ff003c4 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 17b016fcb8b..d1ce5d28c24 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 d5fb1eb251b..89b3751685a 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 ec50b663c01..c639d193298 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 b9c012d6e73..6ea57cf3704 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 34270b6e209..9c3066db215 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 37848e6f306..fdff91630f3 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 39b8d40737d..78dfa78802f 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 a49f2aa0190..86b06148977 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 a1d2c4a9260..a02661f8883 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 68f584c053e..bde6c16bdfe 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 0d5f3e24f83..db5c68d2a4c 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 9b208c452e5..bdc38e90c0c 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 4cf443f4de6..911e7a2fc35 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 1bc9d38e998..e45f8140df6 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 4df302ac2dd..c03a45a5804 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 81d08d76dfb..909efd5893e 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 37620b66e7c..cd989b9c690 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 a7d9ee11f6f..e15fd8d384b 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 c3d87bf836d..19d00fbbff9 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 914c8f1556f..a46d37ccdc8 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 106ec6f1f96..b21f7d0e3fb 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 dc9176db7b0..49956b9f0b2 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 7ee6378af01..83cb166296d 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 16b27452c7c..8bcecca551b 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 167f063c0f7..6b02dd4dbf7 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 dfdda34d39f..5d44ccc40ce 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 2c911eb04ef..d8a8fb457ea 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 01afbb12b6f..4d8e50d507b 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 f0181ba79ed..06acb922eee 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 53b7873612c..76573e08cbb 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 d6fe4a07c59..ca7a720668b 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 16c32bdd089..30413d10e43 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 bacfa498fe1..aee0b85d056 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 c1ae41e0f2b..854bca7f9bd 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 ca7043c51a5..b2b4148a022 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 b4288afee71..ff6d881009d 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 690fc3ed777..9c150d47915 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 b0340eb271e..cac7fc98fb1 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 4687e074547..6ef52457eaa 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 d1933507f4d..7b474c2b53a 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 8644124fde2..4a1a7b8f89d 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 4bb0b7ba1b7..6dbeae949f2 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 142d6ba00ed..148d79f45c2 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 24170b34acf..f638908a80f 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 6bb3eaf9e69..29328cfd1f6 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 2264df2db06..71d0992e9fd 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 1a28c3076e7..f6cc6714a38 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 5195ed06bb3..400331f9f5f 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 20699139179..378860229ee 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 d4026e7689d..810a26bc1e0 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 47edc4dccc0..722b60a952d 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 c30985225f4..190d3e9837f 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 1fdd28e256d..395f8e05890 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 4073f1bbb36..e0ca2671b19 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 63d44fc04e9..8c7e8e7d77a 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 450759a5922..39e4f897d5f 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 2bba216242f..1cdef3d1162 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 1bfb4924a78..ae96f7f6510 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 ff4f9ec9202..58e8e9fdaf8 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 5536e8fada3..3723bd7885a 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 494e70e8bcc..128ab935771 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 777105f9143..b5fa26c096b 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 89bc1e1fda6..dde4d634867 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 c7e919c95e5..8f94e816505 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 b0da48ab713..d9f114777ac 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 d8ca3148acc..4e52eee9954 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 6a4599ea942..c8f07a106e2 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 b86f4e26b11..21d33405c84 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 ee534354cb3..09c916104df 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 e566643a4f8..e2dffb1e090 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 45105b21ab4..3af46cc8067 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 03f2b83cf3a..4729fd6b6f3 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 12ff4209820..17b4b5e9df0 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 9d59d5b9919..a066333679d 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 c601c1297d5..011c3f59592 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 ab9349d1472..b4a72d88315 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 bb1e8f942ad..4cf99155b37 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 80067b2b5b6..c5d3a6eba2e 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 33903246463..77d38d58ad7 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 c48474a2927..0fbc3044455 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 613af313393..1e61d526047 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 e5153e9675e..13e1e9baf3e 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 3e3d63965d3..527bb7e116f 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 c2686346e5b..1a9cd620b0e 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 ba29f56cfba..5061d35c189 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 35904b3a57b..c1c13af792a 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 761f77510b6..b50601ae835 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 3433b369456..bd2a260faca 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 f0202dbb4f3..d07c7c2df7e 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 690f2098cac..829df5a1c37 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 5c1be98bb56..1c14609f508 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 0f266801343..eef58106bd0 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 bef8a2f08a9..12d761786d3 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 0d47135be50..3372bb3f97d 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 dc93bbe5c94..62791c212f9 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 1a59e453c6e..c879788f2c0 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 dba7020d076..452a5352aac 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 ce7ca9d10ab..8f235cf9947 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 b46cea0ca46..285152239d3 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 16a1bbd51df..2a2bf0ffd36 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 f4fc556961b..9afbed0d684 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 49748128258..4fed4619077 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 b10c4ad01a0..304233438c5 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 f0cdd6590d8..b0076058833 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 d17ed846fd9..988c4289b52 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 bd117ac9a6f..692267817f9 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 7457ef14254..7d8a8a3852f 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 81078b1a18b..691d26ce009 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 a7959584504..c3efd8cdaed 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 ff0d0eb27ac..50664d862ad 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 b08387c7fd7..6eb62c3f590 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 060d78fbdee..906b8ab2662 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 870e3f15044..f3ed2328291 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 cd004db4c93..bc215932aa8 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 0016bf586cd..255124eb133 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 6f1d10a9355..d72103f2026 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 683b735ec50..3d2ea355e02 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 d8ecb505390..065cfc9f6a2 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 02f3d03ae52..a6da3623da7 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 fcef464aa88..151211eef79 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 45b2686ada2..8722d97e22a 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 277617a9032..1a08487fa3a 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 a101ab6dd9f..02535142d1b 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 47f74ec4fde..7185a8b63c4 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 e51fa20bb65..dad7cfa6a5a 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 05f82999198..609e2171280 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 96563d5ab3d..060a1a0a200 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 7df3238e287..7574076fd43 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 50b771611d3..027d1b9376d 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 eb8d16d0c0a..417ff9db5bc 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 009dc285150..07736f61c8e 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 20ea0d6acb1..9e1bf043f54 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 9ecdb0ad80d..ef362300c66 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 e28230662f8..9432e80d04e 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 aed28949591..52abf20bb2f 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 620a90d6c09..0d89adb5109 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 c863651699a..ea922edd59e 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 6f8328b33fb..2fd0be87a8b 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 2b36c4b66fb..18109aa40e4 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 262ee118e0f..d63387ce9f5 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 32e366a5a5a..56aafe8c3f0 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 a5c801f4124..687e0a7330e 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 b72efc431c3..68fc6118a34 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 a9555beaa7b..1d6a2ee85ea 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 e4ac9c0897b..6d9d0ae4d9d 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 5ddb0a1f907..d5d32e28c59 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 ea3b1eef8d0..d9d16038d19 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 fd970ce4441..2b8bc2fccae 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 a82cfc50263..8eb95f2d083 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 5263d5db8bc..98a1f8c4ee0 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 3a969e7fa3f..ba70cbcddf1 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 559ed7c9060..91086a4f875 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 e50ea8d25fd..3ff3fb37254 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 c861588771e..b2064742a92 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 c11d6f49edb..869d465b1b7 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 d69c916bda3..80b6952c383 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 bd5249a3858..94577f5735f 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 f697d94c893..7a27d475e6e 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 bde5b6e6b90..a394b77b72e 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 98376e77d04..93081a7ed49 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 892794c2616..614ee18390d 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 34fd0681e16..3ca9a0b961a 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 64c4b6a67be..8410c6b6ef4 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 d7063e12e9b..8d70a26ff7e 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 005abde47d6..a1b9f819819 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 6b204d0e83c..af64fda5677 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 f1647f5d97e..36da85d6fb0 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 d55b1ef5c74..f714cee825f 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 b49553dabd9..456f77a3690 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 d98472f8236..6820953dc5d 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 63c041f28c3..3358bbe45e9 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 0cb788eeee7..268787043c5 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 363269bc589..48b246e6fc4 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 2861a9dbbb1..a6c9554d606 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 b9245bf0812..da6318a0926 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 d8324e490c3..7fd98ebcdde 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 25793bfc0c0..0b48528335d 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 748bfe0a817..90d69a9a9b1 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 d7e9938eec8..206f6e0a1d2 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 9e982b19cf8..1db99b1a0e3 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 c4ebb382a44..9f0d55433f0 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 07f02e069d8..825e5597050 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 6f6836a1683..79ba6ba9ec5 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 ef6bcbf92e2..933111ebcca 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 1f845ff8895..0b1b72d99ab 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 a4f81bcf2be..9d4c9f35716 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 4af0626ace9..156b495dcf8 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 ca9f705ec46..c6379fac4a1 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 12779dc6333..5a803f95bb3 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 38f629d8b83..04c6598adb7 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 ce754fc4c04..a80e279f974 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 16f55b5292d..ab26c4b6287 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 80bcda0c1de..43b318d1584 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 c13aee18ef4..2f816345a86 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 28262b1e42d..f31d4b9fea5 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 8b81fb888fa..4edcef1a147 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 e803f2e56d2..3c46672776d 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 681047a2431..85d6c5ea8d2 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 b5fc7b36713..d1e4c17ec5a 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 58353697d18..74bfe105555 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 87c73b772b8..78cccdda3be 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 9f93f4e8f3f..42b5e22570c 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 016b9e13d63..c7a832f78e7 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 327eb1d4abd..3f5ce03e672 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 b2f169a2811..038282390ca 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 67e510b2ba5..4a42f44f482 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 64e21654afd..27c504f6b91 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 9fea812d321..ffda0e96c12 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 6dd3101fabf..3187b795e88 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 32c6c1822ea..e0fafcdce25 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 e93d124dbda..18ee74a78ce 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 5f486a44fa0..dbc1a6fb8aa 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 3bed6ee598a..1f242dd791b 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 45a659b4ba2..16f2445d840 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 eb80539a2ad..1e469370b43 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 6fd6c30401f..777696f5c75 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 f4773fac863..d7ec1280186 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 4e97c32afa0..1dd1b1ed85c 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 ab37ce2e4e6..653b27ce4d6 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 cd2fdf27f2d..b44a66613b0 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 18ab9036c5e..088bc847621 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 9d5c78dc34d..3980469c9c5 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 c546030853f..23500d66dd6 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 45f5cc934b2..2cb04538260 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 c5b9caffa88..48ba49bee23 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 a81034e0718..5dbccea27b1 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 88b679fb071..cf7343af6a4 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 aa0d706976a..cc8f6ddab08 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 7fefe89c1df..0e8cfb87609 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 e6e9110b33a..e4670680b16 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 391de3cfc55..fb9cf64545a 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 9eb4fdeaa45..2dbeb51da58 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 856bf285a16..831f6ef8bf1 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 014dde12fcb..27523ccb7c2 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 ec9fb422d21..7b5ad8df07c 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 ccd684e1f35..2edac84c7f5 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 5202569d198..7bbdcfa78cf 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 29d6cbdf871..813dbf4e570 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 1ae597fecd9..8189b167f93 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 108ca8f1772..f78dcfd20ba 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 74f027fd076..ba4cea8365f 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 b73b749cddf..8c29ba1da35 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 f4a92d7e104..90571d239f6 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 b3ac6591f76..0aae92c2079 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 8bdd897d34e..3f7cf97e64e 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 5c9a5cde0e4..7a8e47adf20 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 31a028db61c..218715f81bf 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 61fc9e1b730..04b8b2f5a1e 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 bd69a1cc0b2..af29b0382c5 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 2add8663555..f0de1aa7c1d 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 fb87d06edfb..91018849449 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 62aeaf21de7..baf2c1b7e3e 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 77f8fca984d..572fd29b549 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 5fc7e7c137c..116bbdcac6d 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 9c16b7687a2..20120d90b18 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 4e5ab31b1d5..29b9bb1ac69 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 7f160a2e9a4..ea16ac697f1 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 d0947357a51..0e371199a18 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 d4ff56d325b..7677cc989b6 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 7e784fe988b..ea57b2bb134 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 dea16ed5afc..866abde3673 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 22633979128..fde97154194 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 72f98a11709..c87b3768596 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 f5ca1835a67..07eec93bb65 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 db3a896a1c3..d4eb6554405 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 0811c168f9f..6f50b058762 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 35f2c56d3da..ba31bbcb2de 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 c87f4988adf..d35e50a8657 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 6de13808991..1e2bb33a24c 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 c103b8d3922..63bd7405e00 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 d1d2a9db550..a9155c7b628 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 a5d516c15ab..21e9c94943d 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 3e5518c1930..764faf6e79a 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 d9497c1c29c..c88673b2855 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 508cd8f8867..8af5f40630c 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 89e4b872871..2ff67931518 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 f6230e73a1e..de7b8b8f0d7 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 228269babe9..87eb6bee31e 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 7f3e2165085..353ca20d5d7 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 c3cd7de3a06..814435ea835 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 fdf85d21fa5..eb8556d8d9f 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 f907cf570bb..184e50915a5 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 3df5234f963..e676cb0438c 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 93382974005..aa7440563da 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 5b9dfad5d37..33fafacaa88 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 afee7d4d77f..460b6f50bd4 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 b691bbafee2..afeeb5d57cc 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 2df68f084f8..b710cd05c13 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 ff763b951a4..2dec0e6ba2d 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 beb4a166f12..03742c8fb73 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 f743bfa5f42..9015f2dc847 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 0da755e1663..6d953335a34 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 af44874799b..d36e3fa503f 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 c6025abe0b5..10291802fed 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 06ca6931bc7..b7ae9237f3d 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 3cbed89b18c..1977328c33a 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 c14f5982da0..610e80d9a6a 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 fc140420d7b..4efefd061da 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 cfddfe9d208..d1394f5526f 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 c5685411045..1126bbe558f 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 43cf6e34480..9f91a3a66c0 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 06b8b6bce83..bba814966df 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 06130f605ef..5fb38f9b71d 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 581d5d62693..0f32505536a 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 4db0019920d..414d65fc3cc 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 859a704cc63..e727c47b1e3 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 2a8ec9ab270..f9e3cf8573b 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 df4e704200f..1eb94642902 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 717eb0d1d6a..339b5750036 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 2d3aa0437fe..4e1d7d9a8fd 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 89de2288c54..e9b1d1ecbf7 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 d192b716008..8294ba65072 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 9bb9d7b2f1f..3e95ff523b7 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 62218c52174..515d4eea6bb 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 5361947bfd9..b32295a10a6 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 6afcc74a713..94d123ed17f 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 0a76c46ba2c..bdc9847c14f 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 1c2aa268ca2..aa8275ad084 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 ef78870854c..7ca81862ca7 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 58969bcafe2..dddd4a97523 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 77043f37134..a51ff3752a5 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 26accb5edb8..ddd200dfa04 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 2bb77c2d95b..17c4c906266 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 72d9a270775..3246280b63d 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 a72ede807e2..9aa84942cc5 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 0d524094b10..84f5e78fec2 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 de85a85842a..bbcb2e4bc85 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 98e7c320a60..28e09cc7be9 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 8be08a6e0dd..4609cf9e2f2 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 0a3fbe678ac..3eb0d4758af 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 a2629a8fdca..f61555495c3 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 203918b9816..81e88e99edb 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 13000caa8b1..f812454ae59 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 857fc11f15f..a1a7659bae5 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 00662f31ed8..dbb8253ff96 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 c5521b056ce..29b9c3a07d8 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 0ba1ad6c9e3..fd7f2b4064a 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 daa5d283b2b..c9b11a75690 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 d707ded5188..60484aca77c 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 87b0e65dcd5..1cd5847dd9d 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 069cac06f3c..242b00175d8 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 ed10387bda1..8105c01dfc5 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 ca783bbc465..780f5f59020 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 99ffd81a04e..17479b70de7 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 d0cbb4351c7..558f4adced8 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 2366542167d..d1045e3eca9 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 4424b53cf0d..eafbfbe243c 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 85831680102..8cc77da7cfa 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 331db0eeaef..bb6596c47ef 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 19f805f1132..fd0945655d5 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 6d93d0407c4..1be40a72d1c 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 0c4a9f2d820..83b5d644898 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 87a81e74bbb..dfe71d4b9e1 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 2230ea8a478..cfd84eb2069 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 03fb171fc6f..c7e50c1c91a 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 5438ae1a2c5..674c720ec6a 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 f2d1cfbc23b..9ecb5b4b29d 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 3aa0f1e3b29..59d20b677e9 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 6ccd444db26..7ade98eeb47 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 510d9dbf1a7..81802af1084 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 33c91b811c7..0637c18b647 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 81fa8a9497b..ff3ef06d97c 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 df54743ce75..bd1dfa6b588 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 e8e347722a6..74473827424 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 5d8f8557099..1f4b46cc0d4 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 43963bb2cd8..6f7a80be970 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 1aa0ead9fd8..14d25b1dc92 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 b2b2b08f7ff..8afafcd68b3 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 2ec00271fff..887b48dbaae 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 3aa046f234d..524f2764414 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 a9b4a3bae86..ca657923aa8 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 f0ff20f3759..7318b222e45 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 601f017d42f..9f14f6c6e61 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 1063d4b439e..5c846d41ad1 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 c56b9474996..41b46ae5cb8 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 951ad960e14..2ab2d519944 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 2636e36ab14..5aa4a6ec77f 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 9014d9f8dc2..eb0b6e1b857 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 73aa818a2ad..10bb7f8948e 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 4d5f42720e0..a93da5f72d0 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 c61d296587c..2735bab1b04 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 d12fbe2d3d7..246eb856bdc 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 80c12cc746c..cd27a587d7f 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 dd3e6100632..0c487c4bb24 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 1c1a73ebb3f..8775f5f0947 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 c0ad8263c66..c4a419bcfd3 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 bb19a77f175..1453f9ffe73 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 6bcad44958b..ea15e6e47ba 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 9bdd1bb53f9..222e7a22fdf 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 18592124c24..8932de99b5d 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 0ca7af3485d..93f9b45c62a 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 a2f6ec12941..023b22683f8 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 98ad640d3ff..8a446a032f8 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 f16213790c2..fad88a19b34 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 f1cd556f5d6..c839cb75933 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 fb05d1638c3..db98e2f7338 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 3c64986c2bc..b83d37f0d3c 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 cc2cde26aa5..f51f7150868 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 ca930dc9ca4..1c4a7a13923 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 3bef827a019..5a81f1ce37a 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 836bc611b83..31e84fccf9a 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 2683525e7b4..8f752f03500 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 34aebee3e1d..6d4567c59d6 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 4705ba30298..cf604714106 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 79d197969d4..a0edaa87825 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 0649dfded99..b6db35347bc 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 2c8a770137d..aed0f030c25 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 bd265ef4759..5e73fbd4421 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 f26da599cef..400cd275dc1 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 20e3768705e..ed840c70824 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 634f6ad0c61..b04917d450c 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 04fabd28bc6..d21c46c9e62 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 85765815619..4d155b6ec02 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 f1687d73e04..189ffbbc4be 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 b5140110570..cb58d83ff62 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 8f559b758d6..30c442b540b 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 4c5f63c7dea..c69a9c92fde 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 d24a8ed03e3..b6d48aded2f 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 fd7eea12f7e..3ab926a3b13 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 9611eea23c0..a4441a7afa0 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 0386e0c5bf8..e9ddd17e60a 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 a3c4d2fcb72..3b5790ad4ee 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 38a193e4a91..d730093ed0f 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 eae73a2de42..693134dfeca 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 a3fa11609e5..23798ff5df1 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 43ccb6b8ad3..e0c7c9f5c49 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 bf048cadc8f..c66cd3ecbdf 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 62edeafe735..da2b6dc092c 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 0099513dea7..a4ba931da43 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 dd777790db2..5f42be58ffe 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 7b0f8e0f282..523d98dfdb7 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 46fe96a6426..9cb082dc2b6 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 de2d70cc3a8..f40c34a11a4 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 defb18cfa98..0a2cc42b633 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 0dfab289920..1ae8fe58d7b 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 67fd57fe170..137a77b1294 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 38ca2095cfb..2fd9f039d53 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 bb417122f86..6379dd021f2 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 372ec51de37..ebc450140fc 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 f1c50d5dbe3..c4002f252e8 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 019fdf9ae5f..eefe901d296 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 66f71b5c5da..ea91fee481a 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 e9bbd9623c0..0a157cd4deb 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 1b0361680f4..3134a310042 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 1a7cebcf06a..46eb2449e3d 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 90352bbd108..c7536459a03 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 ce9899f021c..32acfcbb93b 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 a25dc2f8803..88b55bd6b33 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 581a702f514..c46426530a1 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 ca4edaf76a9..e30c5684d2d 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 63a511809d8..2309ae6f526 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 c07e1e4f5c3..d4ec8ab8a1e 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 a56c1c57765..3ce37884cd0 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 bcc89e76a69..9d2e3e9e187 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 b57022b963c..dc62ae3b031 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 6a7428f7ea1..a38a250a878 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 fa536a4c508..d8305d10553 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 9e8f39ced79..b40090ca497 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 720e33b9cd9..0ba0fa8c8eb 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 eba33e75f71..2bee5379a1b 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 c5082b8c05f..2cec9dea954 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 e05824a87a9..bdef9467d85 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 dc9ec618a79..79189e6b047 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 86006191942..0e8ce3dc963 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 ad060f16756..38829d80f0a 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 3d36e7f5797..899215ffe71 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 689703302a7..b3ad57f3727 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 a891d807f57..b4e80884484 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 3efa1c33e85..f1db6a8af30 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 b6d8005431b..70c4f1b4580 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 917722a61b8..3cf528adec1 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 6a30f6a00cc..72514c80f97 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 d69362901ec..c1968cff445 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 c545adda281..fdd5961d33a 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 4d2b3733a0c..b358fa76fbf 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 03ff593bb4a..2ce19afc6c5 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 8e3ec66356c..9e0a0be8905 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 86785868170..ad45abbe3c0 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 e6b0fe5c34a..44e519f57da 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 74dc562203f..d5567b0d347 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 a56fe7ab151..9cadec377a2 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 f3ed9c6e620..e2c24bf6d71 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 dc3a2857659..141928d2d92 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 1e56cf84e47..b55f3f11c3e 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 af8c64ac06f..2e21f62a599 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 c58139993bb..8b65ac77e59 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 974eb684765..334687a8047 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 e64d062b320..31eb0491eb4 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 8aeb5bbb186..c704164c17f 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 a01bee29b33..1dfdc36a0cb 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 1cc3a76c3be..db89dfc219e 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 540febe7f2e..d73e7686947 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 f3c10e98dcf..59b8cba7446 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 02fe4dad398..8f8b80c2c65 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 b626da456a9..f24f9b9473c 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 6c0e9c3b01d..296c1b73ba9 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 a724a3d4485..3c96ef2efdd 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 03b69f070d0..c259f827d51 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 ae32083da39..26a5c0095e4 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 a82ffc41e29..583f0dff6ef 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 a015e7a5095..ee035fb59c1 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 b92d7bd204e..3e86eae6b80 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 25c4f7d1d1c..6477983d94f 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 10580321c29..598ea05ace6 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 99e6bc48012..63fb359371f 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 c3c76101ce7..1ba5f418fc3 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 c61b4186847..8fa108f24f7 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 a6972e8881d..337458b4c3f 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 6fa2b10544d..fd0184f1b21 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 9d6e7f7b62b..306e65e0470 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 b5297db96ce..bbd32e9eefe 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 77e212a0833..a2683346b63 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 a7bdd241b55..d0cba029787 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 82ac665031e..cb0ecc63d69 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 a8aafee91ac..68ac1aeb65b 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 8df384dd0bd..bf0de54aa82 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 22478ee0fc7..c2e5f0bc33f 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 d45aea51388..99015e54a4c 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 73e59c2eddb..dc12512920e 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 52d6fb724f8..d1c01cb66b5 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 c25221f5baa..a3529dcd0b5 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 90b6f2ebc73..fface9b495a 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 f0fb80923b1..c406a339a5f 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 eaf1e66cff4..82f4027d359 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 742e6a07c4a..a4ab0e72719 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 b1efa4ce639..6d34ff477ce 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 88d7bfe5104..b293e5c2e1d 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 2ef1e8fa69d..ae7601ebc8e 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 caf18c8da3e..f9f023e8e3c 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 37cdf77172c..6f0113d1b9c 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 b076b254b9f..2bbca5ae50a 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 1035b86d6ce..30dc08d1dce 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 ac9f6f8b2cc..a891a00f41d 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 c541a4903c1..a29dccc2a78 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 bfc888b99d9..e11e7911488 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 47c8c46fee1..d92759e5eec 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 586fe75c697..1173d2de699 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 d3964b747a2..07a74b66364 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 c75054232bc..4109855d466 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 77cfbd62059..f717af2ad85 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 de8228f09a9..5753dbbf682 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 ce4679a23e2..f0aa605f164 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 f01d6740b56..12f1eb7d0a1 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 68d487ce5c5..dafe90193f6 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 1b22e62d5ef..ee0c573b3cd 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 bfdb1adda79..7d78491ad14 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 338943a3e6c..c821fb49853 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 fea16a087c8..b05a3ff58fb 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 820ee348b3b..d328d42b019 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 9de98dcffb6..e114efdce9f 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 55700521cd5..6f661ba5741 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 fda47109146..55149369427 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 189a4e12c4a..4a5a3dd15c6 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 afba0e38301..d4f07051993 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 4879ecddc16..e88cd1fb043 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 8dfe3441edd..4ad03db22bb 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 024dc2b7bdd..2a5e39c7972 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 1bba8436312..b6c7f4658e9 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 d0b36598ce5..1e86e6a0218 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 a11d3ac98ab..e69b1d40874 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 d121996cb4a..ffd2291e158 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 9e6403e6eaf..e22dfeb9166 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 c82859893b2..4515f7f4ed3 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 ac07a2f77ad..cca5b05854b 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 939c1095c2b..6cf871ee8a5 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 48ff76a2b34..e7bca5ac453 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 2f6cec846fd..4b64d385213 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 b3f032e95e8..553c1e50823 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 9acac2fa4bc..e3f5c6d3cf4 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 6aa33f743cd..19748332221 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 bb76b3193fc..e35c266b696 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 8a3b3bc8540..d5f62562f83 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 d9f14172ff1..eac7f761c50 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 5f6584ce250..54dd37a63db 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 78c0c6cf57f..230b7986fbd 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 14b41ed82de..5350ae95f2d 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 4675ef0ffaf..bd60e1331f4 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 95415e70fa1..cbfb7d85839 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 8b55ad7da71..62c9fcf5081 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 249fb4db1fa..a2602527b31 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 6b3368382c8..d59d13102e2 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 7948b96d7e1..9052a228088 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 1458b717fc6..8e5cc6cb3d3 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 3224df25c3f..a34dcdca874 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 117dd3cc246..d0861baafb5 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 34baf54c9ff..452bad9be8a 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 3dba3733f70..c5f05fb6dae 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 2026816c090..76b3ae629e4 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 e249fb3f89f..cd6cb333020 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 9444e33700e..940c751c3c6 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 626a8fea89a..2d66c463995 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 35d549c5268..946b5196147 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 639624c352f..2fc29fc9be8 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 514f976df34..844ed65c5c5 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 446bc2c62d5..0603ffe8757 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 d48e55d5e2a..af7fb50b6c4 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 7ddb8d69284..365bb9b822d 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 a9924715373..b7200a35994 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 01aa245f608..e0f07d8d7cc 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 3de376a831d..206cf39f149 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 a031b8b2ec3..ebbc825578b 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 43acbadb450..ab11e1e0b07 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 904b48fbdd9..6236021f3c6 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 14ad0359364..f5ff1b2dd1e 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 377ca24cd38..faf3bc2cc0e 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 47ad465eb36..2ca4bc129e8 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 4d42d2e5bcb..e3d30345dc4 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 c835dd425fd..88cbc8ad57f 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 4a1b26d4e7a..aabcf344685 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 5e4dbba3fe4..4e30ac470d4 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 b71bb324773..ff3ce025f0e 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 7c29edd51c6..b44cdd274b4 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 a6f7ddb2bda..a497bab1380 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 7a082200740..97e3955792c 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 9d339d64dd8..59e655c94f2 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 fe3aee9a4cd..ca3ae2b0df6 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 7ecc2ac6ded..d67e29af693 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 e723e16d41d..d9de9b9d558 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 4f585d964a8..90f208ba915 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 3e0073c1770..13c29364975 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 75614336c3d..bd409b5977f 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 8d79234375c..ed3158040d5 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 1563ee0ce2b..7ac8e89fb60 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 4825441707b..b4eb145f315 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 a03c927c2ac..6fc0dfdd119 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 cedb485fab3..4dba1a5687e 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 3b4a4211f34..5d1b8cedd7b 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 2436ce6298b..22b4911d8cf 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 f9fbfeabb0d..6a79e542be2 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 fdc974878ec..f6e4aa04521 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 aef86267425..ff9d194a270 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 dd361de5f96..0e28675ce87 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 a97c9d637ef..7fed8811600 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 bc629eafaad..c16ad0e4858 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 f9e9d8d2894..596e37c3545 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 5fe6cb70110..c93d25dcf46 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 526be2a33f2..c66f87ae26e 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 6d37030d1dd..947d0089f4b 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 7b9adbda1f7..32221d46a7f 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 05a38f57892..6ccd2382db9 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 d12c40e4def..f735b4007e1 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 c1d708a20f9..78d5613e16d 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 b34c4f88191..907013ac362 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 4e6290a8c69..c77e8408c83 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 ff31698fefc..17c0a2c7dbe 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 2751f8343bf..76e2742b996 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 017d43f7aba..0ad4574ecbc 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 6e383ec1467..4330604f9bd 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 9320b9a9e73..d3059a49497 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 d501edbd631..0e5bb990bae 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 21b84d87cbb..f6fade69ac4 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 9008fbc4855..4f13e8fba90 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 56aa445bc08..b4c3d9509d4 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 479470f5a3a..a8a722ff93e 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 73e6c2fe6a7..386b14a3a6a 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 b429aad3a78..85f3be46029 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 0502d8efd35..414a5eb7d33 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 343b8b8a8ce..19406ac4b7a 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 b994e50a7ac..ce51fcac0ca 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 4bf8e3faf62..f00f49c1589 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 f5fd27b5063..9fb6cb8b598 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 861a05da4c6..999b77dfb59 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 4c5b2c19dd9..407406228a5 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 fade5e1a51b..e604b225fc4 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 4d88cdef0f2..1db01321285 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 13843c88ecc..3c901ca753a 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 26d2362a192..8f35f813d99 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 480da6df351..e997953f7ac 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 a937e5e5d5b..b465125508c 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 d7aa9dbfae0..e2f2ed98783 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 8734f870966..4c3a35c15dc 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 6ba0886d2db..da9d920a26c 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 99f074fa758..2769b5fc177 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 c5396030813..ad3022d5d5a 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 6c1a44e8cb1..4c21e8e6f26 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 0dc6f213bce..5200408d1d5 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 10b274b8dd3..f21248c9632 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 9d9c76f67e4..f9317d0bcdb 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 5cf4adf5804..08dfb98d5fa 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 ff131767b33..c2c03145f60 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 1890088f291..fc765170860 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 c9443bc1ad5..9df1c3f7b91 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 09dcf71d027..c7a898e74af 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 13a65ad1646..f2caf269258 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 d6c0d76f3c0..6940aaef7dc 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 84a384e5168..ccc5e260eaf 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 d45399c3f31..019049a3b71 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 2f6fe831eb3..b3a87510e5a 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 72d61b278dd..5fda2eac7c3 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 243490499c3..289cb619171 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 37d705c29ca..c82fa670564 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 fe6526a16eb..eb4ec52c0f9 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 fcddf58daaa..be7e0f3e971 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 eb267e793bb..8dcc8ded10d 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 0ef813dffea..987a15f8a2f 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 14d12967a38..77aa6093dfa 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 41c29adf91d..07742d4f0e0 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 d968b43af8b..05b4ba93427 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 f933b9c9929..87524cd7dd6 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 93ab919cc03..4e2aa0414dc 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 d0b94ed6c59..ba29b19df8a 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 d8b6330b879..bb8b291f86b 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 b187abc5ccd..c0c638851a1 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 0386fd8c468..bc229d190a7 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 00000000000..df104c5405e --- /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 00000000000..f2be7cf7ca6 --- /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 00000000000..50f31707a61 --- /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 fdf08c0a5fe..21567b8f096 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 ac83609ff02..2b5b168817f 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 cfd05320e35..64069d4e756 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 a7f807e8dcd..8ffa33a6a3b 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 416d5c49aee..7e9ec8ddd97 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 b6713bb09bb..31c7e6c0bcd 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 13bb40dd25e..527c2f11a28 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 ca920abd492..e91bfca407c 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 00000000000..0578daa4c0b --- /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 00000000000..672bcc9056e --- /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 00000000000..440c576596f --- /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 00000000000..6fb71a57abe --- /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 79dfa120db2..b37f7fda4a5 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 b72ef3d078c..14139a20401 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 a580b639d96..00b5c35e055 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 e471bfae543..bb41e5335d7 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 44bb25b3fd9..126c6eb313a 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 196968cc097..f2a4908e119 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 00000000000..adc6f4e0299 --- /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 d839ccc674b..bd5d45c0246 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 387ce6cac03..1aef7878df5 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 646a6ded32e..242c0fe5504 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 395a5f0db58..e95267e7803 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 6bf162725e1..1c52c557024 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 5a2744eac51..0682929b7b8 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 7d3d0692e28..2ec11a1e937 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 da1193b1a01..ecf8ca6e1e0 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 b4b01c66d8a..f6bd0643450 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 521a7b67a46..6de14a024d4 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 d287ba6014a..053c5ebaca0 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 c49ae6a12df..0009677cf18 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 5b315c87e9e..d140953b948 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 d54e6dd968f..d76af1dc704 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 4945614ed7f..8d432740a4d 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 f9362799224..d428e2deea8 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 cbac7186ed4..284f78aa2d1 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 7a35896b496..6c156f0dbae 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 86ed017ae8d..4aa033ee07b 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 6f7910f9120..f0a47b3e64f 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 04b8b2f5a1e..4747059345f 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 284f78aa2d1..4eb1520cbb5 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 6c156f0dbae..e5bff579f9f 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 b7952077223..e2d1fdd984d 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 91a23e17f12..18eb2a6c1cc 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 da151f67dbb..055b5627bb1 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 ad3d1ff18ad..716ed5040ae 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 940c751c3c6..da4dc074262 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 4eb1520cbb5..5ef68692f07 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 e5bff579f9f..e9d2b17756f 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 1ccbe7a58a9..7dd19e755f3 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 396ca093eec..5637cabbfd2 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 d5aab8b35bb..caac12c1b20 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 73305d5c625..f03c74ae78b 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 8a1e0f9c746..96e363951c8 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 f762a722f2f..bbbaa3d340c 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 3149ae56063..626e30849df 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 ca766810a3d..5bfd1e45b81 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 a6d4e0c7bc9..5e7fab5bd54 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 8da81a44a61..80d0fa3f973 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 6abddd2123f..142bf32baba 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 5d939d4b34e..ef345de22cf 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 734f67906ce..5bfc2e0509b 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 d3c6ee819b5..b0ba58158e0 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 47a7f5a2037..812bb183e1c 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 26cf0fed5e8..3638cbafb9f 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 57c4fbe6199..4e3f2e9af57 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 b570e31c128..6d7dc012e85 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 f1b76075ae8..a9a4bf22b8b 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 cdaa30dc049..169f3c77197 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 d9155ece2d3..54f1c1cd366 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 05f49cd9f53..2b92887eac3 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 8a4b4bc2b76..27ab35dbb3c 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 45ff06f16de..818010c3410 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 5cd15fefd99..8c7b103f834 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 b2e1fa74fba..f8b9ba55aa1 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 2bc821c8495..69de7970745 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 c7ef1e93781..c5224f8f959 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 f90ab5f793e..99227d81b66 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 594d897ee4c..0622b8c3d45 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 125062c8cfe..bb51444447a 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 9d9c9dfb8e9..8d43b2d69ca 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 9b8a5637de2..3f00c8c310d 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 afa5013b339..235390d0013 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 eaed84fe24d..b792fcccec3 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 dd7d9bf8585..5e99b42b115 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 42c5f0b456c..9b130f91b72 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 53384397cf4..a4ef91dee8f 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 225caee0a90..064c78917e1 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 e9c45c62816..d608199f6fc 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 64ba0d83844..13d8cf75e7c 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 df7b235a224..b2e90ad5597 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 4a1b830a324..8e300c77465 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 008b46d96f2..df4ff9735c3 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 82873861fb1..402f6514178 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 018f074a6d2..71bb67f0753 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 971b8174993..cc42bdc54b8 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 92c14d0e0cb..03dc49d7475 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 409ad0c9980..40802af2bfa 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 371ba00dfd0..287ce29a3cc 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 264de1d6782..fd36e23cb0e 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 321b668f8aa..385d8a4f955 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 84edaf67c22..260b4170745 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 ba923f0fdd2..e26cce46ee2 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 315b5c39fec..4515ec7441b 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 000019abb51..53b16944cb2 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 776281e1510..f0df663eba3 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 7d266b7d3f6..24b63b6271c 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 e5a6975ddbb..03ea74a2340 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 1e046192347..20fa646ce41 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 79065f7ba53..7ca3068f003 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 d4624e82bb7..61423312b2a 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 3638cbafb9f..b003fef56c0 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 8bc4fb11cdf..6cfe6121ccb 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 ffbe5239cc9..c2ce599f5c3 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 9cba055bac4..3a9d1d52751 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 cc85f17146b..2b249c7b7c8 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 eae1cd32c06..1e0fe841cac 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 6e49d287186..658cc3a23ee 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 9955a650cd3..2061c061dd0 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 b56ecbbaa89..965b5950c93 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 9ecd2ffd155..9f4c1dc5fd3 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 e733bbd8abb..b7d5f1dbe4c 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 c7a898e74af..9a53a29fe5e 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 5ef68692f07..8bdf4378205 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 e9d2b17756f..121dd891acb 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 302a8d56173..d9d4a4f2ea6 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 bf34bc3ddea..104ad61e93c 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 9421eb16f51..2e5cb9b5600 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 1f3fda6cc72..05e7a49b625 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 ef345de22cf..618a168be61 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 373fcae8d0c..cd2783e6cb8 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 b922c966ff5..78b30557fce 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 19d6fbd3086..ba5a3267a23 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 54f165889af..6991c83959d 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 3e363e060c2..0f8a82fa893 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 7c079c432dd..c19e7d4b303 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 55e121e2fc7..a3667f4c4f4 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 08550ed80b8..e4e00c7c2ec 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 d1982e289a3..df1f5062fce 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 7510ff22f16..675fe3ae5e1 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 abec8eff09a..6a57f0f24d4 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 1f382b86c0f..1613e8ea555 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 374866a6859..82f1cfaec9b 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 402f6514178..9874cadb566 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 b834a8e6829..66e57d156ef 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 6edbecf055d..a314aba0ecd 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 0c5886e177c..6ec94aa8e52 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 2c04896497a..8853680af33 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 62bf99ab383..8a7f2af3a99 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 111155b27b6..39a752855aa 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 d76af1dc704..33ca6265552 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 b8407653d1b..f9a218d2f5f 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 ce4f347eaf2..c8b4b537853 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 1d081b711a8..e85422d740a 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 945bd3865c3..905baff895f 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 0beeb4da4e8..d876748e8d1 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 d57d3ad9920..57da6960078 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 cb98ec90b5d..e17869f6cfa 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 f4799828c68..e5e1f9061e6 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 a2dcd62db8c..e9a65f7bedd 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 7540740a737..6fc68b2833e 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 919a20d0e4c..e6da946c81c 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 1f2d3cb5cd0..9470c8bb2c8 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 e5185ff03bc..8df6f7cead6 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 5909804ebd1..2b5da2a97fa 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 dfa43c35952..c6dd7b963ff 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 893fadfe178..a2912ef0dbe 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 b4b1f612fac..0c247c96126 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 bb0348eb6a7..3c4337c1dba 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 1af8a5e4ab0..57c32da97e9 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 9bd02aec7c4..d976e6e9408 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 5a5f1b1985b..35db0671772 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 01f74165190..1f99d5410ec 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 f71f41dc293..5cd13aa3b0e 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 61b03a3160d..76b8c663c94 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 6373471fe7a..5b21a2a62f0 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 683681b50a0..50156b2b4b3 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 21e3608a51b..b32b91e5625 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 2b4d9d010a3..3399fcb43c5 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 32735bf06c1..757e299792a 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 48c96b7591f..fd9b42398fe 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 084888c188c..8efad848e87 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 ba4d1e77576..3727a156b97 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 bb51444447a..1b08c40793a 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 c9f8d857b62..37fef6f2d79 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 2bc5f5040d4..ab045896235 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 10cbcf6b5c0..1bc4ae298c4 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 33b0efa5d60..3565fb303d5 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 cfbd112100a..0a653ea0e90 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 83d495e1bf2..5a6f0798c51 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 a32e07f4aac..28701f2b015 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 7e1b7eae727..377115f7ae4 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 89205d4ee8a..f53af0ee1f3 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 8b7d4ba91a6..f57b2d9b0c8 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 53edf48ae80..6a03d899a09 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 b4cd7bd161e..5e9a9835bf4 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 490ebbe75b3..56a3cc06556 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 05064861844..3a911fbcf95 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 9b519f969e0..aef1dd78197 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 2817871cd7c..bb591b79884 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 cb4ac83090f..7f589401e3c 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 1d5d39416a3..5b26d9b1c6f 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 4a3ff75b864..93c510e2fa1 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 b003fef56c0..f4eb5342c46 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 9e95f3cc05b..054fad3246a 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 dffd66265a6..2a1085a53e3 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 ceeb8b4cbc0..53bac129dbc 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 5637cabbfd2..7296179a126 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 0622b8c3d45..124449d4467 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 2b9a959deb2..764f87e924c 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 7051ec046d8..e31b32e9410 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 6d7dc012e85..cff197b7e97 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 19a0cc7c6ad..be6a76e3b6b 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 714b5dfec34..769286a567e 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 eafa42ba22a..a1a7fc88086 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 0ee336de670..c10fb3b826b 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 88b8c91420d..1acd58d8e43 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 fe0393720dc..40791458505 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 8696dde72cb..ea238269e59 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 104ad61e93c..00dabd59d8f 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 5af8d1eb65a..45a8f879c0f 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 48852f27910..1b3093447ec 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 2e5cb9b5600..c474bbe8c67 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 e723853f629..333baab1ab1 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 023bdc74a7e..90150f448e8 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 5bfc2e0509b..5a4dd701d32 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 b486e907ee3..54c385c1f23 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 3a911fbcf95..5cb9c481c3a 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 50ee1b248b0..02d56c890fe 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 2732f2d6bd1..62e78f6f88c 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 cd6875cdcdc..431785f7c6a 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 adc05893fde..b0500806b84 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 16a7d2f000c..7e9f6e60ed5 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 83a7dbbaba9..832758e26fb 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 07b6a8d48f8..d80f9775449 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 3c106027d8b..5248cf38221 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 988c4289b52..1e31b1b7aa8 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 e1b021c8ce0..f5f21dcfe48 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 a1b9f819819..a0d5d0fca23 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 562b988ee38..33fc1266d83 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 1dd1b1ed85c..62c862e33c8 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 9655b91b13e..29e104b13ed 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 2ab2d519944..9a302fbcad1 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 ebc450140fc..6da29c94790 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 c46426530a1..273a517d111 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 a38a250a878..12c808b6d7b 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 81f5d2085c6..9974b885d9e 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 f9ec68c8742..f78d88ab3ec 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 b380656c541..19cfb7cd31a 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 595e36ef07c..3b7afbe25ee 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 b9461fae7d7..cfd1cf2a197 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 b8d23b3e379..95ed220a16c 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 6b234a9df7b..1c37d0215a8 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 6e47cb45966..224ce83c214 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 72c905497c0..c060c5f8815 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 dccc4ac0765..5f53de899e4 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 1bdea073aae..2983c6b7d59 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 892895b9e02..e77f17c9140 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 a3f2c500030..b69fa651988 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 4b08d0b9751..612e1b6ead9 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 c26c3f5e68a..3e35559bb62 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 ec70c9d4329..d31d83d3e9d 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 b39ab88484b..43ef01a497e 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 e0025a050c3..2e6246d06dd 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 f100d663d8c..11ad02975ee 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 8c83de202a4..1f5b5b4b1b6 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 90e62c0d951..5778df8c367 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 bddee724966..22059706dc5 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 5109607d799..c8caf28ddf6 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 53ce1c0634b..fd44a80cf3c 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 62e78f6f88c..5d457f2df7b 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 5e7fab5bd54..6dd5edb81b4 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 b792fcccec3..7e045934f7d 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 224ce83c214..5a7e673ca02 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 96ae885ca77..3f6d69325f0 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 f3321416b1f..ec5afde0bac 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 41f41a6e93d..da8b1ed359b 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 d31d83d3e9d..52199b2b9c6 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 169f3c77197..0ac86c4eb4b 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 c09f9f09337..b1c91001351 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 50fb3fd7dc7..e3e12e4a9f1 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 882c3c9d79f..66b21dbcac9 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 06cfb90d2b5..d3cfb8b9db6 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 8877107b984..c9870b4cd32 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 b7df82961c7..9a64b56b575 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 52e02cfaf72..aae4165fe5f 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 300927abefa..86e62adc618 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 cd9d6e8feb7..9f210add0af 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 0425accd06b..19510337d6a 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 327cbf5e9ac..ccefb681d6e 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 b6cd67c2627..5403a483ffb 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 846b7eeb99f..7e9da01eb9a 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 77af10928dc..7eb410cacab 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 8c2b950648b..59abe2fd6d5 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 adff293301b..7a9cd1d9e45 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 da8b1ed359b..90d943dd755 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 66e57d156ef..6e902271171 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 8a083dbe2c9..d6129577118 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 3f74ff18695..759268140fc 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 172951ed1ef..6ef1a6f9556 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 b6e829750e9..dc2b60dec1a 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 53bac129dbc..54d3b2efde9 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 de1e48c9c14..22aefa5be4a 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 9e4446f2964..8c4d68208b4 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 7ab7d5b3a47..5aa0299200a 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 716ed5040ae..e0d9cfa0a3e 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 c5224f8f959..23d90796c86 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 0a653ea0e90..0fdb8eafb0f 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 91a54f87f9e..6ea37f26d10 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 0dc71ea72b9..e05917c17d8 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 2f0966ae739..2542037a2bf 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 864b7da5e55..19c25a2fd45 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 a4062905eaa..71aaee1c405 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 e510cc976a6..4fd1a061cff 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 95ed220a16c..457d924d2fb 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 5a7e673ca02..2f206dca737 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 3f193993c2b..9eec508bbd5 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 e12ab9b4a40..1a655e242f9 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 5f53de899e4..33e7c014e40 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 73bf925553e..c04a1af316d 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 199ba968dd2..11e07ed5e79 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 967bce6007e..8456ae9338d 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 b9278fab278..8396537a2a0 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 3c2df69331c..404823abe96 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 2f69b98bcbc..ab49e46938c 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 63be7df2ead..5e1932ceb67 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 fce05c8dc86..e5eca399b9c 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 b3885588b0f..6b903665c17 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 4cb75c65bc9..f879b66268b 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 d2580f3bfea..5c02eca4fb2 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 649be55e94e..8a3a5c84c02 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 998e3cdea50..c4a2a2fc09a 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 ead9e08d00f..9f3b45d40e3 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 f0a47b3e64f..dc93f9a6350 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 9f4c1dc5fd3..84d1d34bd78 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 04f90476c57..a3bc548ee28 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 6d452f7a6a3..7a9daa26c2b 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 d4e3c993cd0..1bdad193f52 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 1cd76581bdc..fc359d49b26 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 8bdc4ba0a01..cd937115868 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 497fb0c2523..acdb5b23b10 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 ccd41eeb3a5..d944ebb6eb6 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 eff06e3bf7d..2163a809b5e 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 fdaec26204d..71b2af33fd3 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 79f9d361169..2bd39bf7cb3 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 1a21ad4a7a4..8ecc341d4d2 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 aaec1ee67cf..70a75e68c6f 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 18a00005dd5..166325ee242 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 64b438a29fc..b2687b2bd50 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 39cbb8d583e..95a6d65a9fb 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 2bb9faad8e5..958bcc9d975 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 009a3d469c5..63ef2e9f5f8 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 cc07d6cf40f..2045aeb1a5a 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 27ce29ecd15..78259cd1145 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 e8a9e62403f..b3155e563f4 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 291bed809c7..f28ee6f02d4 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 56a659aa152..3bd75c40bed 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 f61f0004723..d122fef0bd2 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 8a56ba3d977..6b826d8c29b 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 638a37b193a..b46e57a38bd 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 8211ff10857..fd09d378b46 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 dbaa5e6e117..e4a4d4ca239 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 50c3c6bfb55..f046b5087f6 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 bb65dcf631f..82b0d9b455d 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 67fe19da45a..6626be41a6b 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 9e34eb8f4ab..07ab1d19f55 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 97512dfc9bd..d30a05ddbf8 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 5a2dabcf6c2..a13a3d25a6c 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 76f1a224c1f..280ae56ea39 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 ea002275153..889f6437b0a 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 5789dde64c1..a5af24eb868 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 3617690eb3b..408bfd325c1 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 ab5aa7ea1ad..d10df2492d4 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 cb5e4dc8f38..7ed67dcc0d2 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 3e2cdf0d530..803ca006965 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 384e0ba130f..3f38c07cb43 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 d1054cf8dc4..58a752c1887 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 1e8441290bb..c0071913035 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 71e694f6807..1b2f76d6c5e 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 babdd0cf1c3..11a3d469a59 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 ae9fb65c615..bdd1199008c 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 028c1643ff0..453202b6c67 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 54c0c8f7bd0..70539871aa8 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 3ca52f849bc..7050376dbfe 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 ab5d562ffc8..a52deebbcaa 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 196d0e99991..4c4d499a6d9 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 249b833bdc2..6c5f2b1d371 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 54f1c1cd366..7e85e7616a8 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 5e6bb090821..deeb808396a 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 d9d4a4f2ea6..e3fdeaf35f2 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 3f00c8c310d..a615c5e4033 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 9f693966382..7ed38206a11 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 6684a5b882b..7be5c4bfb93 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 26ba590888f..0d6814fca10 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 9f210add0af..11c31107ef6 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 5de0b62a4a9..e75775bf75f 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 966ec407ce8..2b7d2296a01 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 71aaee1c405..2f422007ff4 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 26ee7cb8bd4..8fede954255 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 fd44a80cf3c..e4966a1a4ce 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 53bca799657..88146dbeb0d 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 fa5d58fb385..fc96f672afb 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 1b3093447ec..922a0197cf1 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 3bb7da52e22..76f8d0dfaab 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 e6da946c81c..e7e489dba78 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 50117c210a2..8338cbf7f11 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 5b9b923cc56..e86de00b59f 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 f43f1c88396..a9cdc676932 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 812bb183e1c..ce8207fc28d 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 0ec4d05a623..2b8bd65dfe8 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 a029fcfe7d6..34dc7b06ade 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 064c78917e1..082b5b19b5f 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 750772ce8f5..dcd8f264161 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 5c9634390c6..61d4b45eb38 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 488481f9614..ba6f7341201 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 3709adaa69a..2992d066d4a 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 fcdee98a74d..fff92c32188 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 bca45c773b6..1c034d6d68b 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 00000000000..dddf7dc2c88 --- /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 00000000000..0ac83023896 --- /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 00000000000..c155a7f6111 --- /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 00000000000..8e8b050ba7a --- /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 471ce2181fb..53c248fe179 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 3425cb82d01..fa2f2e55744 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 5708c8e638d..39893c5d2fa 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 75a879832a4..f3b7f4d6d24 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 00000000000..7bc48ec2e3f --- /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 3a6e147e867..7eefb77b3d2 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 b73c6b9c2fb..6cd09a947eb 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 00000000000..27ead21ddc5 --- /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 00000000000..91f61c9c2bc --- /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 00000000000..cecde6b9183 --- /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 00000000000..de374358e84 --- /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 a0d40460373..87e3a94beb4 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 280ae56ea39..7ecad018300 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 e8878b7cf4a..9cc75ff39aa 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 6ac68d222eb..c122caf3760 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 aa6d3efc828..ababe8395f3 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 e58fd740655..5996ca467f7 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 2612019f6fe..b0f1a44a3d6 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 f27635d1208..5da6b21a3ff 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 deeb808396a..a28c8571f31 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 8f732b8e3df..77ca4ed8bd7 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 1223f3525c4..824085ea833 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 b46e57a38bd..4cb7c851bd9 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 034fa23a3af..e3d09977c1f 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 b95d940bda4..2ca7fdf46e3 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 dd60f03cd58..696d642cf86 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 395c0a3ac20..b96feb21831 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 19f3344fb81..b453cad2e07 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 1618518a0eb..6aba40d6df9 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 20399195365..e3f2644ac56 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 eec7874c7fb..c88d31d2f91 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 339189d3564..26768936291 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 29bd6a7fb1f..b2552f58c6a 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 fc7de1f59c0..1c465c6a864 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 db8bad3ba09..0702e64b4f8 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 760c5f30436..19113eddf89 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 ec13fc79536..e6e145fefba 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 1ca2eca664e..87d4dc2b887 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 567bac65f5b..c2b89406f24 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 447665a3676..81d77b27a3e 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 5cbf0d411a0..0ece14799a3 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 00000000000..57ed4d1d8a7 --- /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 00000000000..19bb17ea390 --- /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 00000000000..6e72058b60b --- /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 8bdf4378205..48322760753 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 121dd891acb..5db1635e39a 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 00000000000..9de62e5f727 --- /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 00000000000..24a0f0610af --- /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 f2a4908e119..80e7c92640a 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 1aef7878df5..cd1ea8725bd 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 242c0fe5504..3b70f30189a 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 1720c2c58c8..e38af1a04eb 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 888ad87a848..3ee2e61cc72 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 bb0fc55b5c4..1fa70e42b3f 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 3657d4ee3ad..e2a226eb4ce 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 e5eca399b9c..0943d1a4e52 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 a2d015c279b..cd8e797876f 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 e82f6c9e4ed..b39f8a6ef25 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 8e0b883b726..799fe6acc70 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 e63054d23b2..cb2812f319b 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 d46ea26d487..8b5724e014d 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 e3e2e6a0f27..1bda31fc6b0 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 e22c0b04995..b7131c29bdd 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 76bd16a6363..a395a5da470 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 89529046f85..dcbffe2a568 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 722dc2dc659..7c966a6fa4a 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 d9a39ce5726..2ce710ea419 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 ddcc795d262..3d014d13c5d 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 5d618c1fdb5..272efa5d722 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 8a3a5c84c02..fa9dfe7615f 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 47a302e2f26..0b245416887 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 7d91ca012b9..464ff989941 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 917dedd5c53..30b26ea5d24 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 8526f6658c7..2275c5eba48 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 7dc05368dcd..af5ada7d2c9 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 ce8207fc28d..1f2b7162556 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 9874cadb566..aa6e58d6036 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 aea8ecadaff..00d1b6084ad 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 b1e93aec8c0..0e3aa5d4469 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 bb591b79884..d2e4826ba2d 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 6ec94aa8e52..36963dc2f20 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 01004a3b45a..18650d2038e 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 943f8a6aae6..83c335f0f03 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 e26cce46ee2..99cda9cb411 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 548282d6b2f..999747c9a27 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 8f12341ee4a..35a374688b5 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 bf12951e2ae..04c00171b43 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 574b8d85767..0c5450b5ddd 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 d23cc9ec5d0..9bfe903e724 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 8d0214d1b5c..3ee716ec856 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 ef1cd52f75b..09541a120fd 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 230f89b0531..6e31cd595bf 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 c4921e3855e..3087c4cdf08 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 11411e1d6ea..472c430da16 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 20c5fba7f9f..05a3c166213 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 87571baa2c9..0a5643fc1ea 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 e16f9983d00..8797e8e61e6 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 2d08b48e0af..d2b5f091021 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 7cf52919efe..e6ef780ec8e 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 9ce9991c371..fac9cf4ffc2 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 a5e88bb3d2f..157c357e180 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 3cd2de600e3..f66a1b5f226 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 e322cfb77c7..38d893e7343 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 c0b7ea04554..5d4ca93105d 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 3a9d1d52751..ac7bc149cd9 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 33c778c0d3d..19d5ae1e904 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 fbc6b50e8d6..863602134a4 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 9ed1bbfca16..044d32890da 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 a5255e7f756..8478c2b9c49 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 2b6c06ba12a..826c99fbd3b 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 f2afadbd657..05406b6939e 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 1df7cf117e2..c867fdc621d 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 3c00e186ebb..bd90b907d3b 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 25f6c05d739..9721bee9014 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 af0248c9713..25f3ebf9686 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 db7488e9a7f..083e0f55841 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 822ae8dd911..914c1133116 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 86533662838..4226aad3f0a 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 2d098d60bfb..0ba7ff09f3f 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 c3cd88b0d6d..8a9dc2691fc 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 5e2e8bf4a0d..4544780b4f8 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 d8a5949be4c..8b37107b906 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 9a48efe8a95..86994a55446 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 4e8d21f438a..71e419e410f 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 4e3f2e9af57..9beef00a921 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 b732e3569ed..b551e436352 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 0ac86c4eb4b..068dbd47fa9 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 4a115762be4..0d419ae66c2 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 1a46a34c1a8..abadb613168 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 183c6c171d6..cae957740e4 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 1b08c40793a..38c9beb28e5 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 952e82c01be..3485a108d5b 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 93666bc6eeb..7ce0cc65619 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 4211438379c..20337d83631 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 00000000000..c2f877a2b7a --- /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 8fb014f80a7..225c88b7b0f 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 1455c20749a..964e2427fb1 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 5818cdc0048..f694afc0298 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 773bee4430a..a35fec8fb73 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 ce54220aff4..867dc8e89cd 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 fc042b0d598..37595837c11 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 6c85c77e961..0ca12c9e2ae 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 b48c48a8968..01b31eee63e 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 a1b980d8e05..032edba8db1 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 a8a96b21c19..aed23eed95a 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 d16b2788c70..6e16e00432f 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 1b59217f6ab..73f7bc75874 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 0f64533f7f1..eee9896da10 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 9f489165c22..b531764c290 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 1fbd9089ed7..1fb88a36d2c 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 fe6cb1ac12d..f0afb49dbe0 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 05c9c4fb180..15afa82ed0a 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 3d15a9583f6..0fcc077c7d3 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 048e886dc4e..702b8347676 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 98b0cef69c3..cec4f187ca6 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 a063b1577f5..20794b4c47b 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 26a7193493b..ff11762235d 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 1b9ae225c7f..f20f0494a5f 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 63aee668062..256b26c00c7 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 8274240368f..0fe0518323f 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 6513d76ca89..f09baea7655 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 750528eddf8..20447e496f7 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 6b5003a04b5..d5f8d26e2b7 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 0a78c45d7b2..ad41539162c 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 4c5c998d0a5..26b2d088aea 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 9cd1b913ccd..76526b73e92 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 9c8d3237114..3d232569e9c 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 c333d7c74c8..a3f645f5085 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 80c636577f8..89fe884fa9a 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 ebf2032a9a5..0ea0cb7a696 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 08c463feed2..fb1736d7784 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 03c441a39ec..f8b0c53bda6 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 c5588c34134..17abffee89d 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 e9e59b50170..5223bf9c890 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 74a5ff0f183..a93429550cd 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 b40edabd779..2c5b2bd3181 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 27f8ba383dd..eb35c48b9f4 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 725b215da5a..23a9498746b 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 ba537544a3b..d98659caa8b 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 5f4f2defe32..6c7f5ced489 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 be9a7ba522f..ea353e84892 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 e3cc8624e36..9bb31b1723f 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 cc6866fee63..0f305d1fa8d 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 288161968de..e66bd2a1d14 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 74a2c3a4d4f..448b35a3a04 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 a1500e1360f..bcc9b2f7ff4 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 20dbfa77f7a..3ca109fcb36 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 6d01dfd8e46..e52af4f2665 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 cca39062ce9..f06b94b9eaa 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 db813affe76..299d457350d 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 c3b25e06348..a8652335bf1 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 fa2a04c9586..63ab2be9759 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 b299aaa8185..cd810c21de5 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 42522f81876..d33229f4e56 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 ea92e0ca2d9..65757b70364 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 ea31b951a18..490c746fa74 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 2174c974e16..dec19740aef 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 1dfb3a6f1d3..70aa94b6ea6 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 500f1fd3f2a..ac050fd0087 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 4306ce4e719..a5308b08d6d 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 c92522008be..f96d3ea58ef 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 e6346d2f384..a6fb85b641d 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 d908941fb92..b4a5db58986 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 b0deb01b3da..9061a4598df 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 289cb619171..ce22b66eb35 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 00000000000..7f5b06b71ee --- /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 a52deebbcaa..803d3d6f1db 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 20337d83631..23827ae870d 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 225c88b7b0f..eedeefad073 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 3aa30965c95..cea9a22b64e 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 9061a4598df..f6575ac8404 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 0fdb8eafb0f..2bec560f299 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 5a6f0798c51..1f14beafd73 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 c82fa670564..0a17b5aab9f 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 28701f2b015..71e94997b0c 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 377115f7ae4..48a5873133b 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 b8c3b3f0197..57b381fa416 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 756b20456fe..9533c30017f 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 e07e9cb4749..ec15438352c 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 366617ee988..1fcc3dde40f 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 c9870b4cd32..58fada7a196 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 9a64b56b575..40317ef1728 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 d428e2deea8..31cc98f7e4b 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 b4f15a2999e..3f3711b2e40 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 e35f2653283..8e63bffe568 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 7a9cd1d9e45..391fcecf373 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 8e300c77465..c2cd62237d7 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 6e902271171..899a06dc278 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 7e5f6436757..0182f6bc072 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 587cd85a2a5..2e73bf9b116 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 d6129577118..98bcb4d0aa8 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 52199b2b9c6..9de33c67158 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 942ab8a14ac..2ec77e35070 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 61f12fd5f57..183e7008853 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 11330c7c9a5..dae6acf91bf 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 7e9f6e60ed5..373df9e6384 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 f3b6e2eebd9..433f9dd7ff2 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 e0d9cfa0a3e..56e8d3ddcbf 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 ce22b66eb35..40fb1ad8b49 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 6ea37f26d10..cd72f55a855 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 23827ae870d..a39b2659914 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 00000000000..cf629378161 --- /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 eedeefad073..2e9ec2b4e38 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 bf7e768f6e3..5c1385c6ecd 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 d33ba2b397a..fb17a8ea471 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 81751e768f1..1e7b664b674 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 157156c3252..5ad30d25d8b 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 b31cb718b3f..fa5c573a7f8 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 4e14a8c2a3d..928c8d2a2e2 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 06ab3ab1483..48c5cb824ad 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 1193f90ff8e..bcf5a927713 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 1cdd1f02e7e..99530200546 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 78386077af2..f38836c0414 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 820f965c533..10865586b6d 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 96d70ef4998..9de4f928b38 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 01e26a5630b..af1e052fa33 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 b0006dbb5ae..85413da8f80 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 f1085b81554..c2c383468f6 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 1695d33cd63..da8c4918452 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 57f5ed659b0..d386bb7a488 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 e01af8d183e..f2b32f45304 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 d541e21049d..a783dff241b 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 2281cb1cc4d..f1b39976afc 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 d8a0575bced..8e2958f7370 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 6196322e234..14f94976984 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 4d4982a19af..e47613e17ca 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 cbb1dd201a6..f06b2bfd905 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 815df57f342..99964081277 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 449ae6841ff..960424df0ca 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 64534e40974..604955aa199 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 4badc8b72d7..6c48024efc4 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 28894682430..5ff4a303b0c 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 bd5c2eb6a0c..d8bf3e4d994 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 52cd90e54a1..c4ceffd5373 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 889adc3af05..c9831a68aa5 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 51865034b00..63435d0ac9d 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 253174972b1..2e7c9efc7c6 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 e0aef80ab61..6c1c75ff328 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 e4fb72db91b..6bfda8c31dd 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 8c353a0b3cd..e0ba27390df 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 5c18f0421cd..39f72f57b06 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 ee62df8ddad..ed1827dd9c2 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 2155d3cf7d2..88137bd9530 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 9e7e9fed396..a6eaa488c60 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 6eaf933b82b..3e469e44601 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 49a3c67d604..05354bccc68 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 d1ce5d28c24..5a88792208a 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 fbcbf7edc6d..beb4427d14c 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 a5246a004c3..36272a3de88 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 376252966a3..987e4907911 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 2a5f91791df..e9229ad838d 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 6e9724c95f7..a463cd35512 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 3b662441e13..00d1ab1828e 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 ebc859ed9e3..04f7a3ac2aa 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 6b02dd4dbf7..651fd77619c 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 c6b686efb85..caa2e7df2c6 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 64e68dd5bc4..33ba82482f1 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 867a497d02f..9f402a7d1e6 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 d9f114777ac..3059a0fa71c 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 dc1fb40be48..489164ce7bd 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 3af46cc8067..630ed0a4a06 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 d7522ac2995..50cd8d7d01e 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 e67af592c16..7951df50e5e 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 1bd7275daef..3ec324f9cd6 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 d5641ef5db8..add0ad31cbb 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 bedd85e7508..ee4df700f79 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 8c155784ebe..7bd67a7a2c8 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 f3ed2328291..154fd211aa8 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 256b26c00c7..aa85ffb0214 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 9a00ac6a4bd..28b404acdbd 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 80370717183..40295c74e0a 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 044bcfa46ad..5d52f13f39e 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 5fd068a64dc..f3df4341594 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 c5f2b4a2a02..a23c2a9184f 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 0f70c49ff2e..9f23f056894 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 ce239df7564..3013b04943d 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 6cea7dc1175..abf47e5744f 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 693c654f258..80bf72e5290 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 91086a4f875..6403d800a16 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 1f1fa347dc9..69e455344b0 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 e391c15d3a8..5ab5e7a9b82 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 2cce496d0b6..f4aa44f3de0 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 e9b709b0c03..0f74cd8940e 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 ea8b9edcc86..184b7e38946 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 01dde6a249c..11287217fa8 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 3a74e2165df..48f61ece4c4 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 dc4c0bb9651..6d53e4f12a5 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 b8c615f3335..9430c02c0e6 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 b2a538a0fa5..4e7bd5729f4 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 fea02bb025e..d1456f1e68e 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 2ba15087c48..96d24139c25 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 cb7ab8c767e..5d7ddc8b55b 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 ba4cea8365f..5152e838fb9 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 19ef1cb14c0..99fdb30b5c5 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 0c52e624418..cadfd03e9d2 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 8bb02f28bd0..91950f62369 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 386f7083f92..4b273286d83 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 c87b3768596..41223f97a8e 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 590563993d6..0d6fc42d1a3 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 3a2408694ad..39dc17e66d5 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 8c11209570b..ba3113db5e0 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 420270e10ac..a271d704768 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 32332c7369a..7842f858fd8 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 460b6f50bd4..940c59c9979 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 69cdb48a560..9e6a0cb2709 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 5a70e3fd48d..1e6700267f8 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 4efefd061da..ff92fd93554 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 8cd4f51aee2..5ba3fff7fe2 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 5fb38f9b71d..80f66c51f99 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 d3fabfb0b4d..8bdb3ea90b9 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 414d65fc3cc..73ec2a138b3 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 ef60dfb4a65..096f4f5b8b4 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 23b1c968c4a..e80c7c85677 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 7ca81862ca7..d479f570d60 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 4bfbb8ef62a..3effdbc60d6 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 1300b48e0dd..9e3be794cb7 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 ddd200dfa04..226250b9a52 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 e37a019af78..8e5f5ee2fcb 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 fd7f2b4064a..95b0431a32f 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 19bb17ea390..7f56e2b8c55 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 29ad2ecdbe7..227c6d423bc 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 1c246432fb1..7bc25726f27 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 8cc77da7cfa..129ca0108a5 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 cc6141fdd91..9faa8908efb 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 ee99da0c8b1..2fde2782f46 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 43dc47bec10..83466327da3 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 246eb856bdc..a704e5ffa66 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 b7d1e8df96f..e1af6543a65 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 f51f7150868..615fa1f7552 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 9b293ee5df2..b8c141f52ab 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 391320289db..1f05a1c7a5f 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 cdac7171a25..ed1ec8b62df 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 b6db35347bc..bae9cbe4ccb 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 1d712a8f285..fc9d170726e 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 9269326ece6..3a44d04f75d 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 c66cd3ecbdf..942ebd08426 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 eefe901d296..cad9b6d3661 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 ea91fee481a..efcb9064208 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 2e36062669f..71de0764789 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 736b0ec71c3..1347f760b54 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 d4ec8ab8a1e..d0bed826734 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 d2e5e39c7d8..f981ef7fd32 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 2bee5379a1b..1eb60e9154a 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 1d667e43fa6..04457e2abec 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 9e56dd7eaa4..537bed16a78 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 b4e80884484..3efe31d5a87 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 3578bcd5138..99173c830a0 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 dbf1172b7d6..2db9e0f94eb 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 3e5dadbf5c1..1517f12f52d 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 3265e3bb1b0..650ae3edd4f 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 67f1f6b7d46..74a72fdd976 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 8cf1a664276..e08ae2098fe 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 480eeeeba9f..37effe7d6ab 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 fd848b76b2d..79fd1d41665 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 0c81c369e73..b1768949258 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 bf83f652c3c..673fc6f54bd 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 352ffb6feec..74dda2ddf4f 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 5408a204990..39691752445 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 f0aa605f164..741612b6b4b 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 ee0c573b3cd..d9a63037a8f 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 e3d303a2c52..8e42b25c0ca 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 bb62889085b..53a32812f60 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 b6c7f4658e9..d977e24bfec 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 3c8017a7d76..61cf5a2fcb2 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 e35c266b696..fb4270f641d 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 3382e27693d..186b15a18a9 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 20d6ba3d72c..a12fce67ffd 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 45c16be36e2..a239de65b6e 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 823eef632f3..7d1bf95572b 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 811ecdbfa6e..3ef76a5d20b 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 e0f07d8d7cc..54b474e95cc 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 61116adfb60..881e97bc9ca 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 6c5b2fb2bb2..628c0ea5a00 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 7db70c5cd51..3287eafe7f2 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 90f208ba915..22a5da19d8c 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 405f0c5d57d..885b8597549 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 2d808e85bea..4e656d35563 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 b6f6f53cf79..1ddcadb4390 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 e20dd64396f..915dd2bce96 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 7a26e5bc0d4..8aee796b9cb 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 c2415265c62..c47d666f5c1 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 a3b097c5d35..1b824e43843 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 0c5b89dc2cb..9d8c87e5863 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 52106a42063..5e7f2419f16 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 3e38d6982f0..971321fbfd2 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 0ac55e46791..ddb03a135b9 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 40fb1ad8b49..b6f357d4cda 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 a31fb13ebf1..1d40bfc33ab 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 cea9a22b64e..242a90088b3 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 6dd5edb81b4..728ee3c5985 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 a615c5e4033..9e0d8939da4 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 cd2783e6cb8..280bd987965 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 6a03d899a09..e930a0de597 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 a8a45f5b946..1c7c8bb4a90 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 88b42d296ed..0be5171af48 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 7be53d1fb6c..271d58fcc8e 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 8d1527b1930..86b3532e00e 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 a13dfef11da..973c3d39159 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 b8ede42a508..e7e6725e455 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 9b130f91b72..c49ee45271a 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 a4ef91dee8f..0fcf9c01c8f 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 93f0fae918a..7752efe82ea 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 90651cb5a4b..6ec111720f3 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 54c385c1f23..f92f6466156 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 9e33ed74fd4..f5b29f49b1e 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 54d3b2efde9..2d20183cb3d 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 14f63084709..2a845249028 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 1bc806d9e32..79242394f7f 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 7e58beb4419..61e4dab8510 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 22aefa5be4a..6d843c222d9 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 2b249c7b7c8..45466be2cc4 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 533238ac5e7..450a6e4c862 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 61462bcdbc0..c4ea831ceeb 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 63229b851d0..c66f9b745f5 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 658cc3a23ee..4273b5294ed 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 a5eb90df218..664ce0a38b6 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 46818578534..c1a0ab62cc5 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 56e8d3ddcbf..287ad0dd522 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 0ba7ff09f3f..dd12924f4b0 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 9beef00a921..279cd5b8eb0 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 382d2c4dbf2..0bbcf9815c6 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 068dbd47fa9..297680279db 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 0d419ae66c2..20763dd39a5 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 b8e54155922..36a9bccf39d 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 f8b9ba55aa1..913262d35c4 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 23d90796c86..25b25f41a20 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 71d3ab2cc43..8635de00fe4 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 b6f357d4cda..5c7385822fd 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 2bec560f299..76d62bda606 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 758279cabf8..eeaf6f01262 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 08cde60f5b5..1e05ef63efb 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 48a5873133b..89e0eb7fba4 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 e171cb3d669..5a8837b8154 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 80a72f1d6fd..4783457112c 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 5db1635e39a..b064ca1b411 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 00000000000..4e7cfffa833 --- /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 00000000000..c2ce8e947dd --- /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 00000000000..951134133e5 --- /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 a39b2659914..62f634ebc56 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 2e9ec2b4e38..d04f8525fb3 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 5c7385822fd..fdd0c564efb 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 4e2393bd238..a95f77ab360 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 d04f8525fb3..200cbe7488f 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 38c9beb28e5..a8118d23910 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 57b381fa416..98905e045c5 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 9533c30017f..a6ab2fa7cf3 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 5cd13aa3b0e..3895dafe1fa 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 5b21a2a62f0..c9948aa2ff9 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 516fa42cb5c..0a410401b54 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 d62dede5abd..43bae9dc3bf 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 b07bca948bd..812bbc91947 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 76b8c663c94..c890e8a8b1e 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 c5863475512..935aa01a9a7 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 5b5b161a24a..9ea7a8b7a43 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 b32b91e5625..71a439fe6f9 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 9d034c146ee..f9ef2e12730 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 a04dfdc7e7a..8caa824d5fb 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 b2043d3a4c3..d5c85a5a84f 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 1f99d5410ec..967b5855a51 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 de4e1f17200..e07f97c928c 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 e39696cc37a..85bbe5c950e 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 dc93f9a6350..6fa1f017567 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 6d19022f959..71f7ea17f76 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 6fa1f017567..65ace96917d 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 00000000000..2230cc2ea32 --- /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 ff90bb26530..ca47f831370 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 082cb899ec5..4f12f590057 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 95987404e44..d6e10e1dc7c 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 9bd3b16d12c..8879bd6965c 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 de6aaf0f11e..7367f4ae563 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 e10cdc20143..392008e838d 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 df96b0e87ae..135f6322e2d 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 87696191ac8..f3ea5e30375 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 bcade409d3e..d696e8933be 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 fd8bfdca44c..f61172c3b97 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 286b28b61ff..ae717bc1839 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 3399fcb43c5..9227b872080 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 8396537a2a0..2e502859601 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 00000000000..64f508167e1 --- /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 404823abe96..b4c3054268d 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 8879bd6965c..a5c9f5ab0a9 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 2e73bf9b116..3508e24eb4b 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 b8c141f52ab..c289d754006 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 e31b32e9410..a5960b8b28b 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 c41d5afe169..ca9a6422f1b 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 0ece14799a3..3983ae7364b 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 00000000000..fea5ee3f466 --- /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 00000000000..e2ada59ec1d --- /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 00000000000..fd23931f13f --- /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 00000000000..7323413636b --- /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 00000000000..a6d171f6528 --- /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 00000000000..aeefbc49893 --- /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 00000000000..b9ccf8d1010 --- /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 137a3975b99..00000000000 --- 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 1173d2de699..00000000000 --- 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 84921b3b8d3..00000000000 --- 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 e00cd1b5936..4d4509d7443 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 48322760753..b755c16d90b 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 b064ca1b411..0e3be2edc4a 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 00000000000..c4710e59df9 --- /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 00000000000..7829a3cc999 --- /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 00000000000..664ffda7f8e --- /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 00000000000..043236c503c --- /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 1c4094387a9..6207a363937 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 43494ec485f..c5aa74706a1 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 00000000000..171aedc801d --- /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 d460c53109d..5e91736a263 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 ba6f7341201..d26da82ad1e 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 264e635d7f4..53ca9a39015 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 39893c5d2fa..a5b8b104b38 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 7d7e158f3cb..5192a8c7df2 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 9341bdbe4d1..1443e41ddb3 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 26361b0e363..e45c287f44f 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 33d2268be5b..01a21920cfa 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 fea5ee3f466..327745343ba 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 27ead21ddc5..d15d12ce6c3 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 650d5133dbd..7cbbe5fdf11 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 ddca9698987..e4605392aba 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 7367f4ae563..d984eef5fdc 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 eb7429aa47e..188a4ec99e3 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 9bcca3cc452..8d51d5a7181 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 3ee2e61cc72..ecfa2edbe54 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 13f7c8db74c..7899af36995 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 1fcc3dde40f..7248b73afc8 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 bf77d27cbf7..690cd8f318f 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 79d807b77c5..b6bab174962 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 aee61ccf2e7..1a24c883c04 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 a6ab2fa7cf3..e974b6d4811 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 8898f988f9a..48764d1ca05 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 49a5f53361f..20e76bf86b6 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 f3f2397d214..66a22d44366 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 6868d21ce1f..22c56c10038 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 1f487dd345c..cd75e88bb44 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 d608199f6fc..b06ba768765 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 df4ff9735c3..ee8e5f0b8ee 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 03dc49d7475..e1054f296d0 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 40802af2bfa..e5fdc8d6b46 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 287ce29a3cc..4d48b0cd049 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 fd36e23cb0e..b93f607f853 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 65807602f09..4e5a02588b1 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 b7881d2ddaa..c549e57a06e 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 65ace96917d..64710242132 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 6cfab66c3f1..e4262a7c548 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 09f735c72a0..ad39eecdcca 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 f8c10516f24..254449cc129 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 200cbe7488f..38b7a3c3217 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 297680279db..b9fdcb085ef 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 905baff895f..d4f76d9bb37 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 cd937115868..0cb7e9293e9 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 e51c0187460..b923be81888 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 43bb165b1a6..0eda8eb71ab 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 48409d6cc37..47b5c92fd48 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 70a75e68c6f..5c2a71ad88f 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 7ecad018300..c47940e98cd 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 5d66edea9c7..d9935cc0063 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 37609e151bd..6703852528c 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 696d642cf86..88be3723936 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 f21fbf5d51d..c5b0c2bb562 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 304f7e09495..cc226dc1d87 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 2045aeb1a5a..2a6c08a668e 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 45413a10cda..0eb86f0198e 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 38b725226e7..891f99ac67f 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 3778f2af04b..55aac836bc8 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 861b2fa30e8..d9686719a82 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 48af17188eb..7cff7bd2af9 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 24823e9046a..a02a4fbe3af 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 2a2342a90dc..d9b4f4859bb 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 ec457af7575..6b75cc92fc6 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 4f61291c4ad..6a5c382a2d2 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 182c629d795..279ed1fbd01 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 3586c992c08..5275ca79506 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 28161cfa18b..4d117179328 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 0182d830e4c..7a5d606bcc8 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 afa428805e9..4e8e59aad78 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 ff269d2b8c6..1d082462849 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 cc4098a613a..0f575a7fc54 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 c2b89406f24..8a08c06054d 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 f226c72f7ad..d0d9148f2dd 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 a28c8571f31..8b4a2ae9f84 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 69ed44cb7da..412aa2c6940 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 49d168e2796..d00e0317e9e 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 2ec3467e0db..8e0862eb0cb 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 64710242132..f4720db25ee 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 a73111793a7..ff36f4f5c32 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 00d1b6084ad..fd61dfce26f 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 80e7c92640a..a7b66c3a3ba 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 50156b2b4b3..6f560aa9ed6 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 871caadd95c..1f5cbc6bb95 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 14fb601f919..4ce8f676659 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 d4de97f3b46..96c36a87edc 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 a3bc548ee28..d9c1a5a40cd 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 87e3a94beb4..f94091a6741 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 2d1b7a85ff8..efdab74304a 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 47b5c92fd48..5d0fee65aea 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 279bd35d12a..67e3cd6409b 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 2bd39bf7cb3..e64e7d178cd 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 97efd48be4a..b8474e978c4 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 725cfc7354d..8976f85f3d1 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 04fd345577e..ece283f4bab 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 0c12d8eb54a..93e7deb37ee 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 0e3aa5d4469..65c2fab3614 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 9eff7c99334..64e78a24f4a 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 5a4dd701d32..ff99cf59c0b 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 ec4ff1676bb..b51ee619a12 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 cfdecd3383d..3a4add57298 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 d9686719a82..637cefcf744 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 c890e8a8b1e..e87a625522e 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 935aa01a9a7..9178e99e0f9 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 9ea7a8b7a43..7ce4de69f4f 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 c9948aa2ff9..ba10c5c7413 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 9227b872080..3fc065264ca 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 2e502859601..3ba39a38764 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 62f634ebc56..1c153ca8253 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 38b7a3c3217..84740a32c62 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 c6dd7b963ff..23b8bbea46b 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 3059a0fa71c..3c6e8478c09 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 fdb7f8f18d9..f0415aead62 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 b755c16d90b..f85d2826c05 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 0e3be2edc4a..a89c4444604 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 84740a32c62..dac3a361a70 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 04c00171b43..53a844ccb9a 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 417ff9db5bc..b0c49a58a6a 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 f85d2826c05..a9e808e93a3 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 a89c4444604..07197414bf0 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 803d3d6f1db..c6b847c313e 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 fd6950a88a5..e73190bb580 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 a9e808e93a3..554e2138eed 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 07197414bf0..45d155cc6b6 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 3cf528adec1..cd0cda68125 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 554e2138eed..65a7af01b2b 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 45d155cc6b6..0cbb2005dc9 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 65c2fab3614..21e8e1a8a58 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 00000000000..52a416ed8ab --- /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 00000000000..5085cdbce9e --- /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 00000000000..925443a844e --- /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 00000000000..60fcd9866c1 --- /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 00000000000..c76fa9ee972 --- /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 dac3a361a70..0b5c8678f11 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 f04f8158862..c3c5f5609c4 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 ca9a6422f1b..acf72eb254c 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 3983ae7364b..26b8e8b158b 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 00000000000..516cfc32575 --- /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 00000000000..89f293d1e0d --- /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 00000000000..749c5d095a0 --- /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 00000000000..5a889cfc318 --- /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 65a7af01b2b..13f994e5752 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 d3cfb8b9db6..7c774ad8f81 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 869d9f7ac67..4bbcf185f28 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 51dfb7c5795..9989b9d530a 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 182dfeef2de..e5fbcf4d421 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 59abe2fd6d5..be3bc4c52c6 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 d7d6f121874..e4ec6a004fb 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 043236c503c..d2fff820cdb 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 80f66c51f99..e69ea352c8e 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 13f994e5752..68e65526130 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 0cbb2005dc9..3a4a8cd717a 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 fd9b42398fe..2fa8291538e 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 8b37107b906..d32554e5744 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 86994a55446..54f6044c3dd 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 648b3bd5a2f..0c709a6d1a5 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 71e419e410f..e29d2c045df 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 964e2427fb1..7a9eea730d8 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 26b8e8b158b..e8fadc9ed44 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 e8817507672..f054c7c8e42 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 c5063dc14a1..37070627477 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 2f1cc75e4a5..b0176d1c004 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 be4094cca6a..81a89c8e397 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 68e65526130..0a01f7d6938 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 e95267e7803..fe0808414ad 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 268787043c5..9e491a54896 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 afd82d1f454..a80a7f2e0ba 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 0a01f7d6938..af84a372311 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 3a4a8cd717a..5bdb3034f93 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 0682929b7b8..7e16a9fc6e0 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 de7057ae9c7..aabc71ca9d8 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 539d9ad1651..d2aa939043c 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 6dc194c09d4..dd734bb0dcb 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 313710d03b7..f6e375acf0b 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 0f575a7fc54..04d0ec64b83 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 8a08c06054d..26043c37093 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 34704ddfb74..72f26ae33ad 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 d0d9148f2dd..1d96b3d0625 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 17494b6b110..86eb3919f00 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 f90a7269752..daa9c6e8406 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 e0e1ded32c3..e23ba5cb9f5 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 d5f8eb4a2c7..c2c9d4803f9 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 93df75db8ba..2f21a1c0f31 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 1d11bba9e16..86865209de3 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 ae80316676a..05ea832a81e 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 eabaa57d3a8..3644ca462ca 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 297bf917dbf..692231d4cad 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 f4720db25ee..ee256acbbc6 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 a70e7ea4b5d..26d0d2165e7 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 5be9a292829..7b1c9cb45a1 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 f046b5087f6..a5e8cb1d946 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 012ca6e6705..164b4090e5f 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 135f6322e2d..5946adc90a6 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 ee256acbbc6..72da24d38da 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 b51ee619a12..796453ec9e7 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 b4793a49dca..c1de08d5be8 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 0d1b892611d..3e95e5a1afe 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 637cefcf744..de8444446d5 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 b8c2bc277f0..e499c93c3a3 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 f0415aead62..c3cca9662fc 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 af84a372311..4f4784f0611 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 5bdb3034f93..a47bdbd0f81 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 7e07f7931f5..14d6b362dca 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 b6ca69f4ccd..59d993477df 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 d30a05ddbf8..85bf0781864 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 f8d6bf1d8df..c1d591c03eb 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 1bb6c3825e7..bd44dcb1711 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 21e8e1a8a58..f4d5d24049c 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 a7b66c3a3ba..4134ad4e32b 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 327745343ba..77bd1250033 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 e2ada59ec1d..874afb18584 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 fd23931f13f..f34e01d55bc 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 7323413636b..dc58302fa32 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 a6d171f6528..e2f730ddc8d 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 aeefbc49893..6e5a486ab89 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 b9ccf8d1010..77bd1250033 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 c9832ea2d86..4aa8eabe9d9 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 664ffda7f8e..27ae28aa50e 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 1e598b35892..f93d839b78c 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 80d0fa3f973..d8c28409b2d 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 84d1d34bd78..85e05e89cc1 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 b28d67562d4..bc97a844a5a 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 5e1932ceb67..7451d15eb1c 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 be6a76e3b6b..36306f18114 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 86e62adc618..a0f1d38ba77 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 b685bdb5c73..78c8f82d1ff 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 235390d0013..ddaeec94228 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 32e8babde90..bd54f42fc21 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 7c6dc5fed72..0bcec2a6e43 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 0d6814fca10..1517f47a2d5 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 bd2728d03dc..a6bdb9c527b 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 78852fa2699..d3977384255 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 457d924d2fb..a7fe8d8a0f8 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 806c0b41285..8b6115970bb 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 1c37d0215a8..da6e7acab40 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 06a57960898..ecb0241c724 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 fb031359693..68e13abf8d1 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 5a43c3c7281..a1f324be1ff 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 ec5afde0bac..93afb43cf52 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 b460020546f..471a2dd0f46 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 98905e045c5..ebb8ae3883e 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 679968d1b8d..6970ebbedb4 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 ba0f42432cc..3879d15cda8 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 50a3e74f78f..e0d9a608605 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 4f7ba5c8b06..d9f4db62572 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 8df6f7cead6..75cc3126c24 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 dd67cc28783..492c347959e 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 8af1be20b1e..a3a747d0123 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 01d4d8fddde..952a399157c 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 cba7a736df2..acbd6fe7e5e 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 fb544d3ebcc..e6fd3d7bb59 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 ffd37720053..56f5b53326c 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 76b225bd93a..542c63f3b7a 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 18650d2038e..348fff0da9a 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 52899c7da80..f19941ed043 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 0fb08a0fecb..226d278633b 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 ceb660d9e1d..673935d8283 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 612561707b1..b078dab898d 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 dbb650a8b48..fd7eddbb48a 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 0926f35af38..b6576fc6893 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 279cd5b8eb0..f8149782db6 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 25b25f41a20..627f5b9d976 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 62e5ed891ff..3954808aa37 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 b6b0a87c9f2..fb02e4f3227 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 3c6e8478c09..efd9f99b18a 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 c3cca9662fc..2e14525a103 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 4f4784f0611..64d4727312c 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 a47bdbd0f81..0adf4225166 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 36306f18114..cc6011d9b65 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 40317ef1728..434692ce6f5 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 967b5855a51..1f024bf5882 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 e07f97c928c..000e738052d 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 3cd43ee36ae..59b2a7aa9fa 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 ce2ecb89d8f..74a70f0b11c 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 c00510b563a..d949175bc6e 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 3895dafe1fa..d5383590868 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 9178e99e0f9..8da656d217a 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 7ce4de69f4f..ea6f36ac7f5 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 3bd0a85c6f0..d84b79f1d4c 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 1bb34a11693..b118422ef8c 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 d3a51391627..298ac106dec 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 40d75d557bb..3cc0ec607a5 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 5e5597f50da..7440db0495e 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 10f8d670108..9942ce687f4 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 1ecba9f4c8f..ca511267302 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 6963d836685..e2f07276c6c 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 4208750b7fc..2d0857de135 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 78b30557fce..724cb756f65 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 f56c92d6572..e4d2cf00e71 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 5e99b42b115..098c6d2d59c 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 b8fa2ad93f5..8f7a0909f33 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 082b5b19b5f..f7e727e0e2d 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 1ee450df87d..786d495cc9b 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 e15d595d65b..d95d3e4ed39 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 d41e80f17a2..0a8c177b08c 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 23b8bbea46b..bdf4658434c 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 12d0fb08ad3..9efaac79562 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 b06ba768765..a1c54d96299 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 a611c8d4268..f6e809d5280 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 dba7e656aff..9e8f1dff6c6 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 83b247c39cb..9c488564ea9 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 0c6a3bffa1b..d623f1d879b 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 13d8cf75e7c..41a631937d7 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 b2e90ad5597..c7c96b05872 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 c2cd62237d7..f35d063de50 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 26a69fa11af..0bb9d7a7c5b 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 0729943a770..c0c71405ab3 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 ee8e5f0b8ee..e6a302975a5 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 aa6e58d6036..821c9624c58 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 d80f9775449..ee423a33b52 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 651a17ac80f..62249e0fb1e 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 710b16d1b48..c001f417982 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 c47940e98cd..e9925132b00 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 9cc75ff39aa..467bd1ede95 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 c5b0c2bb562..1b6150fbc3f 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 958bcc9d975..bdfd41eae83 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 304487ca502..e08bd5c27ac 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 48f5559799e..c2297af6d3f 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 1244d8d9a25..2f897045c92 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 9567391e273..1ac6bca91c4 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 280ad9a0efe..5250fb0fa70 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 826a73bece2..d3b6f9274e5 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 a4904f5bc9b..f60b1c3584c 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 300e2ac4b46..b007fff7caf 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 f61172c3b97..6d2b73d787d 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 7f5b06b71ee..3580880fedb 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 5f74a837cf3..a2f681f8e97 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 76788d0c3e8..5d65aee7616 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 f1eec4da942..94f9c846d64 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 bc93ef54a4b..ed699c8eded 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 79ed4a4f4d1..b4e78a883af 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 28f607165a7..9dd8e3c4f20 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 5a81f1ce37a..d6365afd213 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 64d4727312c..7f62e9e3044 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 c91190d9852..e09d9c0d62f 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 4c5a7a6bd59..00ef4c7180e 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 52bf903d5a8..b33e9b18da8 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 ef2b2d64a4e..727b67e3245 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 cae6854d231..ef485ec610f 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 74924493863..41f7e29b408 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 6fd18eb747c..b364a45c344 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 f2fdbbd9754..b11493e337f 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 30898c61abb..ae3990c31ce 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 c52e77881c0..0453d397bc4 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 b64a16635a6..75b9bcfc1c4 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 8c2f5c615f3..75c77d9481e 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 a9c6865ad91..2e9c97c8232 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 79dfcd7307e..492e1471351 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 5274a4383b6..85918d7c711 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 5094d3f4d1e..7846d8173c4 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 f8ca4e5b6d5..d7797997910 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 5b81b4625a2..7c7d10f47dc 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 5bc0a52f394..66934d7a986 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 66cd796d752..070eeee8b51 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 fc603318ab4..02f25900428 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 982ed8e13e7..30d501f1af6 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 a1054c79098..752593ce29d 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 9f32bbf5d94..6ee4377db95 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 7d309fdb22a..762c99ec4d7 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 bb01114a5e3..4e1511b2d2d 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 8dcc8ded10d..a7f20253ef1 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 82533db387f..2a2a1fcd07c 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 ebcbc12e405..99c74c3e5cd 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 61d4b45eb38..e8682a0188a 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 97ed91592d5..6511c7b6da8 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 5c347e3b251..e40926d4a08 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 2099038f004..df9fe8866ac 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 280a90354b0..0991c74b0a5 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 6428508687d..5028a84eb31 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 451a2e70e68..9213007e935 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 8b8e71d5316..c3e2a40ab13 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 268a6ba001e..4cca42afbf4 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 d575db2ba71..ae8b829d56e 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 00f4e3d02fc..34490332c12 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 222b512c39f..6febc6ec20d 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 6bfaaac8f01..e5c27bd3939 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 3379411678b..2aa38688957 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 891051bae00..1c6f9224c57 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 a070128eefe..bc8f90057e3 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 2b915aafce1..b69081286ed 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 5da886f05cd..45d98e64dbb 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 61f5cea5e26..533d46ca8b7 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 92746b29f3d..61d8bf3ae1c 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 07f3907eea1..e1f01d1567f 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 d5cf039b9f4..4f9389e7e49 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 c429d439503..2f68fe4332d 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 866c06316f1..dc6f2d51ee9 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 6de1579f6ff..fdc7b87aa6b 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 58f5c0e4ad2..b391af0e609 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 355dbad83d5..21f33d120f7 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 a92c948a2a7..f238b00e847 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 1f00800422c..b56cb0c5b74 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 885e8f68913..3f7db674fdf 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 07cfbd46504..608e12d020a 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 4f05087cad8..b6347e21744 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 9e2eecf5747..3f303140c68 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 3f1aa97f266..648bd3cfd7d 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 589932cd68e..24ee0e24125 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 b512690e2a3..10fc8c02d66 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 010472d2cce..1ad7a446cfa 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 9f7bb55147d..dd1a63039e2 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 ceb6325af60..453c8fa3643 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 b0da189d20f..d9e3a40d304 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 44a701ed117..9d66831b91a 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 59761c7202f..76ceaf7cbd7 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 ac552afe583..41ecfdb80b7 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 373866ecd8c..3006b8cadbc 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 8bbd19a0d45..3a3485a3be7 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 19229c16cb3..ffa68b094be 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 e246198864b..55a079ca42a 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 93b61893980..213d947236c 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 e727e18775a..18b5e060818 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 9720fb974f6..02fbc465252 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 65abfbcd0bd..f5b2e2bfd97 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 7ec9b5268e2..d53e869e075 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 74d295f3055..db897b68da0 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 7fa745a9a9a..733d3a8de8f 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 c65ae94396b..7120b1bb289 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 508a06b38a2..04d40ecf9b8 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 4194102948b..b82dd8b0533 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 bc474e3d514..ef174e72336 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 aa16576d2c1..caea4c6c97a 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 4c9cfb99a1c..fe1323c6744 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 2004caeb342..234146e2e6f 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 5df2ce17c92..ec5d57daa79 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 aeb24e5056a..9ad8e67e6b8 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 712c0fbd7c1..7b48833dd7b 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 a4a36cb04dc..cf89911071b 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 4786e258ff8..dce3519f09f 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 26ee436860a..cf5f42338c3 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 edf116203c7..119d172690a 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 1c1b9a882e3..5aca41f7f78 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 e350faffcb3..4e0b1ffca5d 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 628f2b22e21..7cc44d7038a 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 245b899fadf..18398a2b048 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 e7a2801423d..e88afa7caef 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 060bf6e26bd..962f9ebe42c 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 77aa6093dfa..55ac013f96a 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 0544c8c02c1..7c9fbe67565 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 e5faab74995..a798ead27b6 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 a4806ff13aa..510b75658a2 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 06534314e00..0c0e272e23b 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 04a41704500..39c78acc4c0 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 284b0b960ba..605eb0b8182 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 bdccf51b2cd..2655bb40f08 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 833e2370dde..f08e3e277e9 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 07742d4f0e0..4cbbf348872 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 fb75fc81f5f..3bcbb592301 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 e690d597dce..ee386bece55 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 954d1c8eb6e..544ab0ff2ed 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 d1af7e1f4ba..91dd0ea9a54 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 c3ad3cd24c8..1b2daecbc4e 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 756636ad90a..2c9562359f5 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 448b654c86e..ea65ffbab33 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 047be1c7933..517170fe225 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 2213dcf2d49..0c2ecf9edb8 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 89a2d69950e..da7878e94af 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 2f2eb6df214..1700ec050bf 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 c5bf9718127..31148c80e30 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 7d0b3163a40..72aaa84e70d 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 f6223cec6c1..e12668f082c 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 1b72545bc09..00b9c1f437a 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 42fd840524f..61479cb78e2 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 585c09c5339..611d38ba950 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 46933ced427..986795e11c9 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 e7c5893b4f1..a10ae01e25f 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 d12e633bf23..ace1f4182a4 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 8d54c470846..6d800bb0269 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 f24d7692a55..f0ea9e57ca0 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 054c85f595a..4d89f5ff8e0 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 d8d98c103c3..15927059d32 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 3d74d6cb944..11a8aac485a 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 00f1d9be57f..75d8969495b 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 ce51a54ac77..ada31494619 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 073ebd784c6..07b7c6e997b 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 a88e1feb2e9..4bdc104e7de 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 b6074c732f6..98a9e81f661 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 f5105477c45..774ce1f2035 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 ef9edd6dd73..f23f83481e5 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 6ba9237a3ad..d7262f50eaf 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 4fe98fc6024..777b66d5c91 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 46ad9b15e49..5099b264085 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 4a0c1267d2b..4e2a09c6bef 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 b010b1aac01..be2500b38b3 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 c02e69601c8..d9de1368ec5 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 7fc53b8b8ea..08e18b89bf1 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 ce3d6fac9eb..ab20a6ec424 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 38b89b729ad..b7a1bb41f53 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 f2be7cf7ca6..03c8d0bce09 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 48d6eacda91..c907a6bafd9 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 7a88d3d2c72..c422c1768a7 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 0d0e927bc4b..15847cdadc9 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 4f5a5cde750..a9d3c8dca79 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 ed83ab49436..41fafa5763b 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 f50823186c3..daab68f1111 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 39aee7a6694..0a6fb793628 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 7b65c27f161..2b2cac02737 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 04adb36e5d2..30c534b18e0 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 ea9d1682eda..a4cbecc5818 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 d6af28240eb..4495dee078d 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 df69f6a3913..82160a4295f 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 5de41e72ef6..b9763b61fcc 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 7e3ee3b24da..1dcf264b3f6 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 e8bf8499be6..0b3d23bfa3b 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 1176c08f453..03f265f2719 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 13058ad3ad2..3e27c340808 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 3d312978bb2..f46e74a35bc 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 75fded469a8..f4e77752936 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 84187ef1d52..70a5c8707ce 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 697d5572373..00054dbc51e 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 f8e8bd9ea7e..300b2e4cb8d 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 e927254b9e2..60848bea459 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 36d06ef565c..4b88151f3d6 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 6106ce8a89d..392c06390aa 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 64536a01407..6cd2ab7d7bf 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 6c989f8068b..4dd86965bfd 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 a9f611d0f35..e5ace2e0d1d 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 cdeb809da12..b89296616b3 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 7cdbad1a70d..9e523c67290 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 d427acc3a98..e494a6b34df 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 56d383edba3..d99c31d2d63 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 a5b8b104b38..f193878d952 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 df84cbefa29..c3fc9be6d45 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 d5fbb60ae71..80e7208391b 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 984e3b79f54..6ad04254611 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 9abb68ca85a..60cc9843607 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 86856ac2d11..e205090d0cd 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 bf930f2f277..e536234ffdb 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 00426308239..31f0fe2c0f0 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 d0f7a5d6300..fa04208cac9 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 14831ef45e1..a4509ba68d4 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 bf87c6f3d73..c52021806d8 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 1443e41ddb3..4cf4a7a72fb 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 5861eebcc9a..a17ed15a546 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 66b281cc5d9..ee3ee24db70 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 f95dd062005..23157202469 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 7de2aaadfc8..a46db9e75e5 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 75e19bc2550..4f42a16362b 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 c49c76865e4..cd627cbe4ba 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 f9c4a515566..e277579ea23 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 916b342ee4a..a07b84077a9 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 cf8a8af54ee..d1ed6a36c35 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 acf941878dd..e95938f1590 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 595c1686982..fb76f697cd5 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 c451ad71065..fbcde2a6be1 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 33ce361958a..1c78180e2a8 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 09f598ef5d1..b6e73a5e209 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 784d106b94c..6b139fa6e66 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 e11a16458c9..1ccd8c86bdc 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 2476293a216..b729b368c37 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 1f4968f24e1..ad2f19b0668 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 08d02bd7493..7293e8f229f 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 4477c692993..ae24ba70419 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 b20317a236a..93ab9a4bf51 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 79878858ddc..285e6c7b485 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 18ad0987aa7..e33b50f1938 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 52c7b6339cb..c848684ab59 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 bc9fa9633b2..b5d2eabd507 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 c26fb50e075..f45ea87f972 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 16105e680c5..302ef3f2b39 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 07facb21e93..fb9ffaad9c0 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 4e81ac03665..5f790c02a40 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 6e64ebbe7aa..41627cc6ab0 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 c5577f52a24..5abe6164038 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 958cc48af28..89648180246 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 81d93727956..0e61657f615 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 c426dfa3265..2767c504b78 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 00000000000..ee9a67b243b --- /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 cd109579f64..fe9a611f115 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 07567149063..4d39dec3662 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 743adb715f6..bbdec393ab0 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 c29be320d20..92217c51c04 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 a7e143505a8..5ba5d232bfc 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 bb8a8b20f36..9acfbb4bf67 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 edde63d62b4..7508612580d 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 8a0780581fd..1a00570d324 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 73c3a8db970..c1392fdd077 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 f370427625d..a51efdb197b 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 505815dcb4d..3a057ec4e3b 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 dbed3326b4a..331307d3bca 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 d05a8efe168..6b30b85931d 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 88791781e3f..9d945eac27e 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 0719857a7d3..6ad69e23c23 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 bba6421ed3d..8eabe6839bb 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 89ce4d75674..61562b9562f 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 0d2842ce767..6c6db948156 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 adfdd98ebaf..53d15e1205e 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 d562d62b602..46b7759a04d 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 e033cd5c514..dc84548da7f 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 9b80373727d..7bfdda60b37 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 ea8f4b60de4..c86ffb97d3a 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 4567171af77..b9ca9b355ee 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 2fc98a70ead..0546fcd7adf 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 24127a7332c..3de562db21d 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 4c1af21aaf1..354a5eaecf9 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 4712fb37b55..c59e31a3b95 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 e5ff4e01dc0..bb48d95bc51 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 3292fab0a8e..5cb49836f4d 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 6ed9d372fc1..c8b910b6dc5 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 23cda3fce4b..39d4b3d7096 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 515ee8798c7..79ae6506d86 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 29d43cb8275..be76411d8ac 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 6531b552000..8b21562a87e 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 be97c7fdcb7..0248fc94857 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 2da10b1e8c4..851a2f16ae1 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 40ba84b9f41..20ad2ca0a02 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 25152e9dc81..42afc3eeaa9 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 436333b0a79..6d46b8bc154 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 b186a764cd1..3c07ea850c0 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 727c4e79d73..3f9897784f9 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 d3c02cc1373..3954d9d549d 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 a92570c7019..30c53e1d89e 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 a472d079efb..ffa850f6ebe 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 ff24f46e921..a76f68f2f61 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 37567913700..c530504c6ec 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 75045d14865..d7cad509da1 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 789dac2eed7..da6136334ce 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 cabc68de3f7..df56aa5d35d 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 db3ef261f07..b92aab58df6 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 b1825654c9d..0db5f9718aa 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 f47067b3392..0745151cb0a 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 2d6a606ef77..529fcb604c7 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 7ca5879a5c0..a742cc546b8 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 379fd5d8b6d..7a6b5540c59 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 e5e8611362c..24afa67038d 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 2d3856fbaff..37dc84d3e30 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 4466b329a2a..91581de59a1 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 e381660a3e2..8e722a7add0 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 c7a046428bc..6ed1d806739 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 3d2d4dd8e11..692f91efea9 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 0226fd52dc0..20b4496b428 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 b3a94a1a2a6..39ec28d6992 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 09c0bba05a3..3dcb9e59d74 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 55a03edc728..6e02251f271 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 200d8d2cf9a..02231169b65 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 14f772c5e1d..016979eb330 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 95286476ed0..bbf39de3409 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 f75e8238506..423bf61a750 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 3cf1f135e1f..e23969be8a2 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 80cfa32a6bf..d12d47551c8 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 01a4e89c9f4..f999e3c16f0 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 4f15cc674b0..0ec8fd3c6b1 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 1f772071b59..f2d9db5797d 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 f4a47c5c344..2160dc226d9 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 ccd82979520..39324fe5f51 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 8c615a80c3f..08d5b31d202 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 c9d92c9e445..60c3784ee9d 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 709d045c348..bf4127fbd84 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 dfd87be2721..fe159cf9fa8 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 0f5049ecce4..e204fa96f1b 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 80f684cff7c..71581e845f4 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 17d50bc1508..53e67cd5506 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 81f4c82fcc7..a7e56f817d5 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 c84593c0b23..bad1c408144 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 83a3f8cbaf9..436fba8fd06 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 75a38230e88..b673d28a7ca 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 819cb1d95e0..2f1fe9ca10a 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 47929161976..809c8fc29a4 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 b7e281a2bc2..33f284e93c2 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 070ac3f3425..1e06319672a 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 fde16021d69..15131fb1198 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 4666a9ea182..28ae99c1dc4 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 4dee0ed5f4d..c7938df009e 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 4c57baea77f..2981ee71634 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 981fa5b59cf..bbe44a4fdea 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 64a3ea94e1b..19a853dba97 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 dbf5e152656..0f1101eca75 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 2514a56a010..eefa1e8bb6e 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 5396facadd7..76496da6dc8 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 391a071cb8f..3f37de5331e 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 f9607852036..b42b2ce56fa 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 24dbc2cdc1f..c6790619182 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 807b85c5fb5..adc91477a23 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 c3ea3190694..3fba61a4848 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 ec742e4113b..32f479b8b5c 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 d3b9b1dd169..b923fdb210e 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 8e974a0a8de..a7f807e8dcd 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 784a9a37afa..7668dfa5ac8 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 5e2aa6747a4..905ad413090 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 3469079f230..785e9ca2912 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 3d352aa2b58..930694de8ca 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 74503eea60b..8ca964606ae 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 f1b851b05b6..bef4f1583b6 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 3ec36265e52..ed5367e0013 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 3eaac840497..d8bda90de85 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 52a416ed8ab..39b99ac9306 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 5085cdbce9e..f95e08df3c1 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 77bd1250033..3bac6d16288 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 925443a844e..fafedb50a0e 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 00000000000..92026cbe2d8 --- /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 00000000000..1927227b65f --- /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 98160b89925..3278f7a3a4c 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 f621574683f..7630b50cdcf 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 e84ec938ee2..feabb364344 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 736a6d72659..c3d912e5e77 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 aa8b99a4914..3605f21e140 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 06ea19e72b8..a1d0f364769 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 3c267b36a08..c7a78201797 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 14bf5c28bdf..cbd2f44c340 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 a7c4c675856..8a1f01783c1 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 507d4e84789..4d3537818b7 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 a012bcd8cde..0533574efb0 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 ccb9c569562..5abf25e286c 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 c46a6d782ea..d18a854d6e3 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 5aac538766b..f3e8c01f3d7 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 de854e1273c..2c162e66ce7 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 9f876dde505..ad43d3ee600 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 37ce27e19f4..765fb284c3a 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 b2a00771e85..289c9f985e3 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 304babc991e..6ae573211c6 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 527c2f11a28..a3d7d685ed2 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 aef0c14703f..e9cd91209a4 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 c8cfa563779..6b9a3a89134 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 9bfd5864025..5317c1c2adb 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 a3b69526943..2197d27de71 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 ec82f41c079..f4b03e1eb82 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 68e855fa5a8..eb35fbb0b5b 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 bf672e9dfb9..0c0ff56af69 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 7cbbe5fdf11..c8b74f33e3d 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 eef86bf78cb..4a26a40ad56 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 33edb72733a..df2fb243f88 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 b37f7fda4a5..3146c8756a8 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 bbc95d73bbc..797836e0145 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 6391ac20aa7..65e96945e46 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 91ed0b2dd53..2537279d998 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 9162b2b0fe6..e1e6ac73b9d 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 8163846aec0..ed325acd868 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 072b441a071..bafd7d1bd2f 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 4d826a287f6..eb396428e68 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 4064b21ca6b..30e384e0bc0 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 edb95a946aa..6363ddf1983 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 72d851ad873..09e73e4ea8e 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 ae8ab679593..6295d918848 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 c39ac530ae6..eefa54b9490 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 485150d2928..f0490e5724b 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 c239d7d8db9..f3e2c36ae72 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 a9a0db55005..d178ef6c889 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 503013e402f..b13cf9ec524 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 4a6f5e67965..6deeff07489 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 4ff2a80434a..8cdd8511919 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 4f3fb27e7b2..1984ef6f586 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 3f7cf20fdb4..7d8b268367c 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 0b01fc8c16a..d534acc5c09 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 1c4a8c0fb71..fac2fa3a8fc 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 afe35bd06cf..c20f7a9ba53 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 407bcf48c1a..eba16290453 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 faa76ac9333..1de0a0d6ce7 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 dc8954af2c7..dfaa09d52f0 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 06870c4020a..61ae1fd8e06 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 c083218c443..f252518fcab 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 736689c34d5..f7fe15f27ec 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 e9de2acbdc6..6050207304f 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 5d4f4c40b5d..df10f39657a 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 c02da263f89..487f2294dc6 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 a12a5079f9b..48896cc8682 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 d185410a4ef..6b2e5d23ffb 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 ee377673181..22eb2c1e704 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 ad16a7e3a8d..d19114286ad 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 09ca1a0273f..3dec14ffa17 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 35cbb8b9bc0..1733cfdf172 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 bc4a483a077..a71ebe3ea0c 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 00b5c35e055..9632cb372b2 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 8cf0e80806d..542c53f0c03 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 ca9822d2733..fab8810ba5e 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 a202c611086..22d84209b7f 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 30b39a4431c..296588f66a8 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 b0e39a51898..b67d70e057b 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 396180249e2..11fc4f00db8 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 4aa525f7a2a..3180c543452 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 d719802ad7a..e53d33512e1 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 b75c07a0813..fac13ffe77f 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 fa9dfe7615f..4d81108c5eb 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 c4a2a2fc09a..fede00cfd7d 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 bc97a844a5a..9afc9963522 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 adaaaa08b7f..15d58eb4620 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 fd6d77873b5..9e2f7b0cc4a 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 b9626b9e969..384bd2e83a6 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 3bdcbfc95f8..134acae3f94 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 3590b6af88e..64c797ff309 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 351703c5cb3..eaa2dfc85f0 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 5e143fcca81..c70bcdcc45c 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 aa8d19dc40f..f3b15a7af57 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 7d871c286e5..0d0aec47915 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 bcb4a24e95b..ef3fe4e3ccb 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 d21c46c9e62..0d662c572bd 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 306e65e0470..9bfc5b35288 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 2e14525a103..c71c49e1277 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 7f62e9e3044..c23f06f0dd4 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 0adf4225166..434a5cb7acd 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 0e8ce3dc963..264ae3655f6 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 c23f06f0dd4..546bf169d38 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 26199763036..68b5586207a 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 dde2f6dee11..1a046c4a05d 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 00000000000..769f927ea71 --- /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 17c4c906266..b4b6e402941 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 a0ce1449479..0c409bef3ca 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 00000000000..0f28dec1d26 --- /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 2a9bf060b73..26490e512f9 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 00000000000..015e4ad81c8 --- /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 f2b390a2235..d0e097326c7 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 ba29b19df8a..bbe77a36aff 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 ca7bce44508..e12789dcb40 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 cdaff703be7..935693f87c1 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 f193878d952..284907b2756 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 bdda2cf1c14..459eaacac4d 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 902289b2e8f..b6bdbc8b2c0 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 fe79b4b88cd..97d3056f60c 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 80e7208391b..1c7b4e69ec6 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 6ad04254611..f411c06a3e1 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 92ad3ef0ca1..611428432ee 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 01a21920cfa..0c81dfb3ec7 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 39ec28d6992..6fc78c96fdd 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 39b99ac9306..ce408778b55 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 92026cbe2d8..553a2963437 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 c76fa9ee972..0f79ca2a026 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 00000000000..76144afa4c5 --- /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 a3d7d685ed2..26872a9f9a2 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 1984ef6f586..14e6be4091e 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 831f6ef8bf1..90c9d4fc9c9 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 546bf169d38..4a517860102 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 66ea276eca0..6519d914df2 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 a990cdf94b8..793dd5f2f3e 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 04889bb3f3f..53bfe7554ea 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 ea164e70b93..d7138ef865c 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 f6e809d5280..15c09001762 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 8e5f5ee2fcb..6519d914df2 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 362f6c0b2ba..38953ebd235 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 9e0d8939da4..83ab52499da 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 94789c33305..3b7984f56d3 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 e11bc5e61f9..8d0cd44070c 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 d84b79f1d4c..1b914f80aa7 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 b118422ef8c..638c0e2557a 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 298ac106dec..875211f5f0b 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 888ef98a582..6733361f5c3 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 ba10c5c7413..929f8218144 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 a0f1d38ba77..eb1ce5f30dc 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 900b1caaf97..4c69678d215 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 d59a553a4f6..f1a27be83b9 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 42136e9a09c..18562260431 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 400e72a7d0c..0847f3fb907 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 ef73d4356d5..a17f536db72 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 1074aaa68b3..8420a1bea7e 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 c532a2063a7..09dae3efc24 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 a6bdb9c527b..27f6895fc43 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 bbbaa3d340c..b70b0a3061c 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 9054943ca52..0c87f04e3ab 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 826f9cf5acb..c0725219a9a 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 e75775bf75f..41c7df7889e 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 c0754405840..dca9c870022 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 fd38da1cac1..85b48c55755 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 34d5b14cf25..0ce2fbfc665 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 107c837970d..7bdd1b33c5b 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 07d177ebf30..bae0336a63e 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 e35a229ab98..36543e0515e 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 b3dfdecac2a..56045f0eb1c 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 f8474e0fd24..b95690641cd 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 bb41e5335d7..91b36925542 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 00a39aae8f4..51b06917142 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 12b03acbcc5..a49e3cc6d21 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 bb7c5816c77..40ca43ff695 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 c060c5f8815..cb1bb9f64cf 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 08e044a46e0..7b0fca67bd6 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 a2a8e317133..1f31ddc03a1 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 5a3d4e0df38..f093edbbc6b 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 8ff8f430355..7d34bb02472 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 7eb410cacab..c7104ac19ad 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 757dd00897d..86b5d758149 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 400ff31be89..7c7ceb3a827 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 00f4577ad9e..f3c79103111 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 280733affd2..db2b22650ef 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 f5f23f2f114..a1e6d74b4f3 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 41a631937d7..8f04b0838fe 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 cc6da709dff..9846e305291 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 d5167ebfdc9..ada7fbb5f34 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 436191ab864..12735764b4b 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 64e78a24f4a..2f5835ad614 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 7ff47f7a221..f7357a1b2dc 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 6cfdd53653d..30051d929db 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 4f3de14b731..b9739841130 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 fe409a46be7..71df1852e7a 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 2b5b8dcd235..efb2288f4d8 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 a84475ab8a1..cda4ba9dc86 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 69bc9474267..b979e4d5261 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 da07290f422..6df6e1d0c82 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 c7dc1092b73..2537196f21d 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 c0781b37603..ac9b81be7a4 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 0610d4d9cf2..57305a3b4c0 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 b6d90b99302..19c80a82e9f 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 3e1aeb4ce13..c8f665cb408 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 ea797754da8..5d87bfe8e34 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 0d2d290fed9..96331cb5347 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 35db0671772..873da5a7864 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 7e94ab0a351..03482292135 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 d9d513198ce..726490b2030 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 768e1ee7316..62e8fc17dff 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 1f5b5b4b1b6..4cefefc2f96 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 77929436283..e7c01479a96 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 783581a0755..5de968f5eac 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 9f87dabf94f..52a3f9f1b1c 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 5778df8c367..6d46b6015e0 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 217baf42f3a..84ebdaddad0 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 6ee55aa387f..786fd07f626 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 df16b13b931..530140b524f 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 b06df4b7a42..32b77e08df4 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 2061c061dd0..e477f4a3c89 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 69911986f57..d43929dd777 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 bcb751faa64..f13db03ca4c 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 38eda8e9b3f..7fffd19c467 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 528e804a01a..1670e0c2485 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 8d9d19b6a12..28be5cc45c3 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 00000000000..d801ce0a308 --- /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 9974b885d9e..bc608276897 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 4a517860102..4c5e1e21c2b 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 434a5cb7acd..8fe4681c191 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 95b3fc9fdb3..33685b2bc1c 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 317fffe84bf..505704f63c2 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 ebb8ae3883e..d1bcb600d84 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 e974b6d4811..7fe2f41b736 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 781420b347a..172a17d2914 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 61e4dab8510..4061e3207cc 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 ae717bc1839..f6f36ba8eff 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 505704f63c2..d8d852b6964 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 9c488564ea9..c7b81df2ef8 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 14d6b362dca..9ba47c52509 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 e13870b8ee2..f6f27a888c5 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 9e491a54896..4be57f13fbb 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 4c5e1e21c2b..a9287834fa2 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 8fe4681c191..d4f9369fbb1 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 d8d852b6964..0b4560c8ac3 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 2a227212006..14e6e6b406f 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 17496f3d361..bc1ace5369f 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 56f5b53326c..ad160a1ba8f 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 280bd987965..1b25564b8a6 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 018837a81dc..3276f8b073b 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 8c52d80c337..bf87a2888a5 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 4bbcf185f28..6bb6c7fb1a2 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 03e079c0170..864d131d287 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 54b474e95cc..a02a52d1510 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 a9287834fa2..4ae2a070efc 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 d4f9369fbb1..c51f9ada7ae 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 b89dbfeb700..3366ec1641d 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 d3ff905e7b3..ad334f848ba 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 a6b33c2aa34..cc777b8ad7f 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 09dae3efc24..8a30c4d9496 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 91031c141dd..dd17eca6792 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 8b5273f39d1..c28b56271b9 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 4c16e230e92..7b75a36f8bb 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 37089e54b00..977a6717f1b 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 2275c5eba48..c3a24fe9b02 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 86b5d758149..81f0fa010b0 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 5c317794c2a..fd0b708576d 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 5844cb8da20..01d4dc406cf 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 ca47f831370..6b49a3b975b 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 4f12f590057..cf2f3398309 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 b9739841130..60b000eae1e 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 5e32c923245..d9762296e70 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 0a3c67d97d3..96c5d2ec67c 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 8bfa6185e9b..8cb4a0b9636 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 cd0f72307d8..d34ab0266af 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 f8cf38395f2..10cc3eb47b6 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 7f49d1b8979..9b0466dda93 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 189273c5802..621efa1cb9e 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 a9fd998f003..4a62eb76c27 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 ea52f98f70e..f35c763bf74 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 d8a96b2db52..70a29fe11e1 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 90c766f0831..4cd64afa053 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 d6e10e1dc7c..338509f09d1 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 d1e4ac05514..bba6ac3dc89 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 05ea832a81e..4093f3753f1 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 94f9c846d64..992185bf102 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 e8fadc9ed44..edc15f00899 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 00000000000..ed557133a9b --- /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 ab626e1f156..2c18864194e 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 00000000000..3232245a4a9 --- /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 00000000000..17bbb60edb0 --- /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 71d0992e9fd..b0bf08cd8fa 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 2694842134f..ff320f41dd1 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 00000000000..ed557133a9b --- /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 4d4509d7443..bbc6c7d2cfb 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 4ae2a070efc..5325986cc7e 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 c51f9ada7ae..f5a436a1166 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 00000000000..9e1bf64c74d --- /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 00000000000..6ce3391c2c6 --- /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 45d31d6088a..1205fd58091 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 6f8d2751018..229cbb0c9df 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 682e23dd14c..12a3adbd701 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 c69a3ed5739..f80d63d437a 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 51b06917142..0f5a9b5ebfd 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 81f0fa010b0..a8c87effb10 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 3ba58a688fe..35a16d30f32 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 726490b2030..6eeab8d6b1e 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 2b92887eac3..951b6d4c748 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 d459ee2cc32..14dbe7336fb 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 f242a421eac..46db47dc2c9 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 4417f3d4f91..e73b65661c9 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 4f08c4c37d0..1070730ba96 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 059cdb1f1e8..3624554843a 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 0c0ca785026..63476a9b717 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 e9925132b00..a6b4113e314 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 36243972fb6..2d07fb33314 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 9b0466dda93..e519e0f9416 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 2a9c3f8cd4f..28071291266 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 f35c763bf74..a2b2583bdb5 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 fe06c6d8c1a..e0637b709e0 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 82b0d9b455d..b8930114665 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 f299727b948..0d533910b54 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 23cc892900b..f3c6af51df5 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 888f56efb29..3de50d3309c 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 1e69fa2494a..9658ab92140 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 e3e7eae36a8..049a1ddc60c 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 00e7ba78cc1..8698fddbeab 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 c6b847c313e..8b516e4bf9f 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 1c034d6d68b..589de2b6838 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 11e04ad816c..d33fb66f122 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 ed557133a9b..e9fa25b30fb 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 9a2ff139dd2..e7ba18d393a 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 0c81dfb3ec7..ddca023d728 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 6519d914df2..939fa7c9cbe 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 7bc48ec2e3f..706a98936f2 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 0a7af79fab3..db996c75c39 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 619f5d4bb0e..cb97cdac9dc 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 8b516e4bf9f..61bb78a0827 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 793dd5f2f3e..de1bcca5b31 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 53bfe7554ea..505fd2a5e4f 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 d7138ef865c..ae960cc4325 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 15c09001762..07abe27b426 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 38953ebd235..c110df0576a 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 aa712a63ed0..52f94116344 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 f911787c1c3..8b49f87bd0b 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 9a53a29fe5e..008e758c96e 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 5325986cc7e..82e1601e907 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 f5a436a1166..51c3e1a83b1 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 ff320f41dd1..21a19a3a56c 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 ba3ac5107bb..51f00ad98bb 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 a8a760d8ca2..b5b10534759 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 3ef13c117a2..b1245aeabde 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 eb75c6f374c..cc776c21f9e 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 259066d4561..13c8f5bb03f 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 924bfcd5507..df8e87f751d 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 a488fa1e2fa..c748b2f72f9 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 c58873473d5..0b8e2682f30 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 197213f7473..4eab2fc3d11 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 0fedc2b794b..d9ef2ac6a7e 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 acf86957957..feb9d582cff 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 0a410401b54..140d7e638a7 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 812bbc91947..2b4563dab83 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 d833f60c84f..af49266bef4 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 28e22c10f20..893ddbf54e9 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 ba5a3267a23..2d274c077a4 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 31cc98f7e4b..5e0c9f04058 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 feb066a6f3f..7b2c3e585e3 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 d623f1d879b..299c9026b0e 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 ccf4465577b..2fd3df1acb7 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 de3d2e560c1..9748e5e0f8c 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 a567a9bf61b..f50226b9f01 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 b39f8a6ef25..0f0dc5f6358 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 f054c7c8e42..0a7ce383118 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 82e1601e907..80390c66f6b 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 51c3e1a83b1..e091ca2554c 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 2f21a1c0f31..3a40e9065d3 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 6bb6c7fb1a2..3c488bd3245 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 869bb5a23d5..69cbaa457d5 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 c93b7a5a81b..f787c028762 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 58a666a68f3..7d563cae7c4 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 00000000000..e18246a9730 --- /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 274a11faec6..d159b641fa2 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 43a88be3325..f8e907b46d5 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 f355e5c75b2..f6b3ebf6c8e 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 fb43f06eea2..3f5c4395f2d 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 39eb16ec265..12c17e6081d 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 d85c219691e..9073ab224f1 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 55aac836bc8..0006364b94e 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 efd9f99b18a..3a4919dacae 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 c71c49e1277..bf5b924bdbd 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 80390c66f6b..c9c5814a5b5 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 e091ca2554c..c577567635d 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 6733361f5c3..4c540cab843 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 c28b56271b9..a2bee1f0037 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 6bda8cc3c28..ed6fc31c414 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 fa859861fb7..32a71ce14e4 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 a1ea4f98c85..97a7d32a9c1 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 54c9f815008..249635f9b2a 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 b0176d1c004..42b944e9fb3 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 1f14e96ed37..83e7d5d210e 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 10cc3eb47b6..37a0310d163 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 28be5cc45c3..ddf08de42b4 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 4cd64afa053..c936807484a 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 c7c9782e9a8..91ed8d7ae5c 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 0d533910b54..cd43659fccb 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 4093f3753f1..78142ae3fc4 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 279ed1fbd01..b1bf1bc8ab5 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 299c9026b0e..87c96e38c32 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 19c25a2fd45..e4558b103bd 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 88225d3282a..ffb5d64f6d7 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 d978e512920..744ba2e13b1 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 724cb756f65..d3994c3c421 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 5c2c5e7b843..18146551a56 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 4c540cab843..5b1ca46c41b 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 229cbb0c9df..c5d824ce617 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 e930a0de597..6f7427a0234 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 86b3532e00e..dc1f5c11b5d 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 8a30c4d9496..03fd8400dfa 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 12a3adbd701..d7a257b1d9b 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 7e045934f7d..b8331d8192b 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 a2bee1f0037..a4351bfe678 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 cb509cb19a1..d8616a82578 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 91b36925542..d929f2d3e82 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 7fffd19c467..8b8d2bc5671 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 51b3b5617e4..84bdb4e1c17 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 bc585153b64..527353eebf6 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 7c7ceb3a827..b2cb3d22e4b 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 fd0b708576d..9a595ab7a94 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 01d4dc406cf..d99be94aaf9 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 6b49a3b975b..4c7455be3c0 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 cf2f3398309..bdbdfe22ea3 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 60b000eae1e..9860334afbf 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 71df1852e7a..84d503bb09e 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 bb2ede6d555..dc7337c7569 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 6eeab8d6b1e..1946207337b 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 28d42698657..0aba4a8bd15 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 3c488bd3245..1e889043fae 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 d2fff820cdb..d9cd62313b4 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 0791cbcaab1..e448f45565b 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 00000000000..49c4b9b4b00 --- /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 00000000000..f2f8b0a3891 --- /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 00000000000..39daf02c204 --- /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 86944ec9f90..1bb8d80f552 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 00000000000..bc8f21c23b5 --- /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 00000000000..806a84457a3 --- /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 2fa16604af1..00000000000 --- 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 9ba47c52509..c9d61784d0b 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 f6f27a888c5..09c23c6f0e5 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 92da3a03085..1b79108846f 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 422ca55b399..5644aa891eb 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 67e3cd6409b..68d5a884cf0 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 ec477cba78d..00000000000 --- 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 803fd6c3ab3..a6e01102152 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 4134ad4e32b..d9e2d2bd9cc 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 adc6f4e0299..00000000000 --- 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 bd5d45c0246..d839ccc674b 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 cd1ea8725bd..ef2199b11c5 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 3b70f30189a..6eff97ae7dc 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 22b4911d8cf..02904bedbde 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 c9c5814a5b5..255dd1c9538 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 c577567635d..2fcc32d1c22 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 6a3631a8c0d..a6b01560c50 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 917afc5357a..0bf6e7846ae 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 c9d61784d0b..7e41d5af9e8 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 09c23c6f0e5..27d00024706 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 1ce162500c5..fd278d3df2e 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 e448f45565b..9f4db8d2005 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 f2f8b0a3891..c08aefc0bee 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 39daf02c204..f70cc72811e 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 1bb8d80f552..aed94b9266d 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 00000000000..0b5fb237126 --- /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 806a84457a3..d3026f94cb4 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 fec8a3387c1..00000000000 --- 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 86de1f1842b..00000000000 --- 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 c08aefc0bee..2d153360a2a 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 d801ce0a308..51afbae1cae 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 00000000000..67bd1bc5600 --- /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 9dad912886d..5eadc39ebed 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 e38af1a04eb..62f374c8888 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 0ae91ad5591..0c5a5c3873e 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 c46bd754319..4fdad670f09 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 a02a52d1510..a58bcd6fa7a 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 5efb73c2a01..644b0856bb4 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 255dd1c9538..35b5c571b70 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 2fcc32d1c22..9d85fa83677 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 edac0e6e3ec..e687dc715df 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 3a40e9065d3..9809710f372 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 87c96e38c32..51ea3fab0cc 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 329b26221b8..3b73caecacd 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 2e9c3739c48..d05e42f6bf7 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 cf49b36a570..72dbd38a418 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 7f092683b7c..5d21a11d4b4 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 1517f47a2d5..5157ab6ed7d 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 dcee52db592..f5aa2cb1dca 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 e8b97477546..c0a269bd582 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 9d564c6536a..b8073f16d92 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 febfb93cf1d..b2033757693 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 a1c54d96299..5e8450ffdea 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 4d48b0cd049..6f87c34d607 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 38d893e7343..8810f945ba9 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 664ce0a38b6..0ead849b59a 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 bfe20be0b8c..b4ce78faedd 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 6cc33ddf610..1d559dbb7ba 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 eda215ebd0f..58aa3311771 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 b036e3bbbdb..7625b3c2a97 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 b535b35e182..e2b3ec7ddea 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 1b6150fbc3f..cbaed220f11 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 7fe2f41b736..d463231ba59 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 0eb86f0198e..598144f5a25 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 891f99ac67f..10860d0fbe4 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 de8444446d5..e70a53caf9d 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 6e258d0ad55..518993cf24a 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 f60b1c3584c..77f911f0ed0 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 78c7991d9b3..891adac91ae 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 df79d0750b4..61a0abb6265 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 50b85f5720f..dbd2e8f7c3a 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 b0c49a58a6a..d80fd3c5338 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 35b5c571b70..158976ccd2a 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 9d85fa83677..f0d86a3e194 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 0f0dc5f6358..bd8ce68c5f1 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 e687dc715df..5fcbbaf1caa 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 9809710f372..b05be45e79f 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 4be57f13fbb..0cb7c108b63 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 158976ccd2a..34e7533f0b2 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 f0d86a3e194..a2a162ab13c 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 31a06c94120..d7f78f9c362 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 bd583be37f4..64eb2d9ea80 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 31488650dc2..b072c613d41 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 2816b86be84..b7cea620a66 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 31bfd005ac1..9dee01c2fba 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 199e20d3e22..25b4531cee0 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 9f3b45d40e3..67c6d3bc58d 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 b598d7ddbc2..ded0ab6bfad 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 a8bc9fe9823..66ee4d60bf3 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 a2cfefb1200..681b3675aa6 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 719ea9445cc..f6c1e6c8ead 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 19742d74f21..6118d74d0dd 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 d7503eb10fb..817a43d4f58 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 66a22d44366..12465dfd984 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 5157ab6ed7d..c2f6ee83396 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 f5aa2cb1dca..ff6dff85aca 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 7625b3c2a97..6dd29741153 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 e69ea352c8e..a6ea270fb5b 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 34e7533f0b2..a9ad1f13209 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 a2a162ab13c..2f0a75d796a 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 db504e3d19b..220228b6570 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 19fad984b27..0a14799ce24 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 85dec4abd94..f8a341481a8 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 b39722c39f3..6a04988bebb 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 140f6908dce..4d2a879bc73 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 24c9e37a3be..4dfc27650c8 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 9d0eaa84340..64ab1174b8b 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 ccefb681d6e..e96c40b13b6 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 b3d3e0ea285..08ed841e7e1 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 9e8f1dff6c6..c345dd6cce7 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 0bb9d7a7c5b..e34f98c87d2 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 ff36f4f5c32..6dabc5ad594 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 579919821a3..249fb85bacc 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 475e02aba86..dc148d4f516 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 30051d929db..a15f8b4fe4e 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 b36abbedb48..64265f71903 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 e5afa272c40..ce61d4ff17b 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 ac9b81be7a4..d7298b2abeb 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 5b26d9b1c6f..bbff510db14 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 b800bf6af1e..3c61559bcfa 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 effecd7244c..7de6427b5d8 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 b6576fc6893..644d35da728 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 3007c981480..cd62cef74eb 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 647c2b8ac07..4646e9f01f1 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 3afed0ca8d8..d039fc04c86 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 2af35e8fb92..9e59b63adb4 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 055b5627bb1..b181b848f04 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 287ad0dd522..5782ce23083 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 90ec0e6e250..4540c9158de 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 e032de4d94c..e97e2185dc5 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 dd12924f4b0..fe213f7920b 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 9bdd4966a4a..f297bfa5bf0 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 a6ea270fb5b..2102a2a8225 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 a9ad1f13209..c42eea70c7c 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 2f0a75d796a..b4d38b5d512 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 d3b68914104..5a6645109fd 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 2d153360a2a..3b64b4168c2 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 f0976f3d676..27f3a884335 --- 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 aed94b9266d..2191a8195a8 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 0b5fb237126..cf14ffa3cf9 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 d3026f94cb4..ca747678139 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 d9c2a8d0ba6..93e8e3fe8df 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 e23ba5cb9f5..55bfd79143d 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 fe0808414ad..b7239c8bf49 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 621821fd211..ac7a4b22e58 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 ce97c7944c6..4d599be88b1 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 1b7540ee499..80b5b718bbb 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 474170050c3..73ae06d9945 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 2ca4bc129e8..e3b30cec9a4 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 88d6681a804..5c356b53c8a 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 4aa8eabe9d9..c8ab737f66d 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 c42eea70c7c..d868a86306e 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 b4d38b5d512..3a9b42f5635 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 4aa033ee07b..a2df00aba2d 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 8fede954255..59afe1351f5 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 de1bcca5b31..82fc3063693 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 ae960cc4325..98b6d22a830 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 07abe27b426..32daaaa2582 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 ab3a0b91276..c3161cae6ab 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 89a35b28f1d..6b94dbc53ee 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 00000000000..9cb58b1adbe --- /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 00000000000..b5d5c158507 --- /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 00000000000..c0e8750d94b --- /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 00000000000..7f1cd8c35eb --- /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 00000000000..88b83190806 --- /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 00000000000..fd2882c607b --- /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 00000000000..dddcdd64d7b --- /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 300b2e4cb8d..8d10e63c609 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 0c7a1bfb60d..ba6ee67624c 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 6e86f702902..5f1f2fb60f0 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 00000000000..5d4ce687cf8 --- /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 00000000000..ad1788e0bd4 --- /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 fecdd35b808..ccbc849ab58 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 1b6242b37f4..ef9c7a40b61 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 b2b7ee89c16..cc2154ad9d0 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 69cbaa457d5..20fcd202ed9 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 a18c809de85..a798de0530f 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 0d3c61c385b..9d4b84e9ecd 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 2cf8791e505..b013fb3bd8d 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 ec50980b6ea..d5ea8d0bc4c 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 16242dadeb6..d4cdcf3d254 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 34944816c81..ddc02187c53 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 00000000000..b83083fd6ed --- /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 00000000000..131303354e7 --- /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 760a66ba1a5..2c5717e72f6 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 fafedb50a0e..9317331daeb 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 00000000000..3caf51812be --- /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 9b6e34f6c35..1a1199eeac6 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 36e21728f1d..fe31651173b 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 00000000000..d24bf97393e --- /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 85bbe5c950e..6989f58d3bb 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 64eb2d9ea80..87e6d6ff872 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 79987d806a1..0c7a454990d 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 ce1f154f911..81420cf389f 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 ff5aff6fe50..18d564765d1 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 b7cea620a66..6742b39e8b0 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 c0a269bd582..d36b05fd129 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 9e2f3e90957..a21b484ec9b 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 6ddb8279811..93eec19d41b 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 0a46190fbf9..7a881ab9d85 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 997728ed495..16c8d37f447 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 98b6d22a830..50217e4b598 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 90d943dd755..d38c115c9d4 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 8f1e034dcac..5948f7e4223 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 630fbaadd3a..da581bb969e 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 ecf9dfde8b1..8d1b7262fc0 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 26176e97e46..b8512531f36 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 8e17caad86c..09642e66479 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 2e6246d06dd..3982c7f0d04 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 7296179a126..335b24b8557 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 42b944e9fb3..d69f0370720 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 3caf889c522..2556a0d2e76 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 5ecd9c1009f..8386409d3ea 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 ddaeec94228..de7dd04a48e 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 c2f6ee83396..d372811edd8 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 6fc8e9c2e89..76dea52e846 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 3435fcc50cf..2fd8466cc19 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 22f02a4218c..5a11136fd43 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 21e8e1c7412..6ed3af285a3 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 a21b484ec9b..47b9fc1d633 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 d04f7c5f582..0682c458792 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 f0d8c901387..c8eda3690ef 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 0182f6bc072..3509b1ba8e1 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 8ae80ca9027..8efb1a32705 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 37934db3052..af9e82adf49 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 b7b11a7b46d..5d5f2fc8106 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 255a2c50946..3b49fe2af71 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 8bfbed52a11..e10125f84ac 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 06244227726..0264baa8e87 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 0f0191f3b82..c2bd357ecc8 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 1915706ca1a..6834c557bd5 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 ad9bdd7c536..afcd2f11802 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 646878c97bd..4823d2eb2da 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 8478c2b9c49..995d109941d 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 c867fdc621d..b295a567b3d 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 4226aad3f0a..58a394e7c80 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 d7cd5cf2ad0..b217988f8d8 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 bad6d7fbcf1..21cd6aaa97a 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 9721bee9014..2b80a1092bb 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 c6ec5c2ccf9..b05e4b7bee0 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 5996ca467f7..8b1ce502a78 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 f297bfa5bf0..03c29283c20 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 008e758c96e..82023eb9e15 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 d868a86306e..0b5cc1c4aba 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 3a9b42f5635..cfab765e201 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 02904bedbde..9c1f1960d74 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 0b5cc1c4aba..5dcb3425bc9 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 cfab765e201..5238d0efcae 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 1ddcadb4390..6f9c844d5cc 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 844ed65c5c5..81048758889 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 5dcb3425bc9..57a230d8667 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 d63387ce9f5..e1e91c08e9a 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 156b495dcf8..bb68d37707f 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 6f50b058762..03710520b90 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 4e1d7d9a8fd..1b049b54a07 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 57a230d8667..3bbccd4671f 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 5238d0efcae..e687b3d4945 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 2309ae6f526..52717c55124 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 3bbccd4671f..8ec27d8425e 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 817ca00a818..a53357b1a2b 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 8ec27d8425e..8d4234fe112 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 e687b3d4945..be6de1b7570 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 c0de99654ac..7f03e52ca62 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 8d4234fe112..7a9008f7ba3 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 faf3bc2cc0e..76a6d8f64f4 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 bf5b924bdbd..af2198a5563 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 7a9008f7ba3..2c57c763452 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 be6de1b7570..fa3520bd5c0 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 c7536459a03..7a76512f01d 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 2c57c763452..c8235ce4742 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 48b246e6fc4..154cdd43c65 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 95b0431a32f..ed54c7d05ee 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 2a5e39c7972..b9ec8e84737 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 76b3ae629e4..edd0bea977d 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 c8235ce4742..288008fa075 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 fa3520bd5c0..f2d0d6a5181 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 55bfd79143d..23112de5558 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 edc15f00899..cc178079326 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 1eb60e9154a..32cfcd415c6 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 2b5c3c87a5d..c2f4fe52fa1 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 288008fa075..bc447e3ca0f 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 f2d0d6a5181..427ac0d68fa 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 12465dfd984..7343c2d21ed 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 74a70f0b11c..a53a8c1d348 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 94b9960c851..139c61a3b0f 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 6742b39e8b0..f51e38bd9da 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 a45591ecc30..e45e73b8c03 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 47b9fc1d633..a52dcdbe09a 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 b8512531f36..d89b175962e 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 054fad3246a..36f1a65222c 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 b2b8aaa6f35..9378694f5f3 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 d69f0370720..0b8c3303358 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 dc160b283ad..466f07a9deb 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 c55a4682216..61de66d916d 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 ded0ab6bfad..3afa5c14c22 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 dbd2e8f7c3a..d560fe2cbba 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 c88aeb8e5a0..f73d3bccaa6 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 642b774f1e5..d399f5b67aa 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 7343c2d21ed..0f35cca5f08 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 7be5c4bfb93..334c086f8d6 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 de7dd04a48e..8ace9070f8c 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 d372811edd8..e4471b7e55f 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 d36b05fd129..13e49bcf509 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 a52dcdbe09a..d3a889902f5 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 7a881ab9d85..817b6821db1 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 16c8d37f447..ac16198ee69 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 ac85eff6794..b5b9aa25e47 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 5948f7e4223..d82e63a2614 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 fd7eddbb48a..7b7f7d7ec16 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 f2e7387aa6b..6c678ab732c 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 2d0313ec211..1d2339702ad 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 6d843c222d9..b9532daa995 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 e477f4a3c89..e648e059fab 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 0ead849b59a..6580ab0917f 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 0b8c3303358..99274d59ff7 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 66ee4d60bf3..699df2c3505 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 398acd7d554..b500a03c422 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 2e7c9efc7c6..3fa20f2eea4 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 a704e5ffa66..89d25ca23b1 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 615fa1f7552..3b9df1a4e64 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 32cfcd415c6..ef155676d1f 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 3efe31d5a87..78f38f5316f 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 b9ec8e84737..2ea292e8ff5 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 bc447e3ca0f..608809177e9 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 427ac0d68fa..0e7a36f0d77 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 cc178079326..cdb61c59104 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 00000000000..69e4c0c5760 --- /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 00000000000..5f59144727f --- /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 c0e5f68483e..2b4582610e1 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 00000000000..4ed3ab02418 --- /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 00000000000..3668984a41f --- /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 00000000000..06684e63bdc --- /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 942ebd08426..6ef71bb9524 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 00000000000..2f3a6c53555 --- /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 00000000000..403d1980b94 --- /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 172a494b602..80dbbc312ea 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 bbc6c7d2cfb..0e78ddecc4b 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 608809177e9..b104ae232a0 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 0e7a36f0d77..86e9c9a001b 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 00000000000..a255e21c709 --- /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 00000000000..c9a0d8fde17 --- /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 995d109941d..83accc5b86c 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 bd90b907d3b..3c58ff946b9 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 914c1133116..b2b6f74c0de 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 5782ce23083..b4947d121e4 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 8a9dc2691fc..c7a13a4f34f 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 c110df0576a..360d97d13c4 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 00000000000..2e461050507 --- /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 00000000000..5bd29042ea8 --- /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 00000000000..6488a5498bf --- /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 00000000000..5f66883172c --- /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 00000000000..22742366d18 --- /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 23112de5558..9b2a4380cae 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 8c05295b5d1..93e2596e343 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 23c04fe347e..cb4201e2957 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 286a1c8ca22..530cfef4cb6 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 72da24d38da..77451fc1f68 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 ebf56b27a7f..ae1c2f1caa1 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 b4ce78faedd..944c1bbeb8c 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 bf87a2888a5..f7e46297532 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 518993cf24a..a0fa387cd43 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 2e461050507..a04f570d367 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 5d21a11d4b4..3ab7e051a19 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 45413d4a15a..2db46b02db4 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 00000000000..bc70e908829 --- /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 7e72fb2403f..454ad3ac090 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 c7a993bdef9..7e1df67811c 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 611db3acfd6..67b5a23f65f 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 706a98936f2..807406d0d00 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 00000000000..0f6e767f345 --- /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 69e4c0c5760..b8828c9c1c2 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 00000000000..a74d2c04507 --- /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 00000000000..066de6d5483 --- /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 00000000000..fcf31df3920 --- /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 0f79ca2a026..5fae9bd32ec 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 2197d27de71..e2d391da0c2 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 f4b03e1eb82..a4918978ba7 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 e1e6ac73b9d..ff729735d72 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 939fa7c9cbe..206a1ec299a 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 82fc3063693..45c5474f27e 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 505fd2a5e4f..f1066fe2899 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 50217e4b598..b62a413e82b 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 6519d914df2..206a1ec299a 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 360d97d13c4..5833d06c8a9 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 139c61a3b0f..94b9960c851 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 e45e73b8c03..a45591ecc30 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 af2198a5563..399cbaf5187 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 b104ae232a0..2b314ee48bb 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 f53af0ee1f3..bb86f4ed494 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 399cbaf5187..b18608587eb 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 2b314ee48bb..14e6dea0225 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 bb86f4ed494..0c56e89b67c 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 124449d4467..0166d41ce0c 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 14e6dea0225..2e74cea5c49 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 86e9c9a001b..2de28d73bf2 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 45a8f879c0f..11e7af76253 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 0fc3e55a587..2862805a333 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 f639dae9757..ce211a47594 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 cb4201e2957..e8ab05abb90 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 530cfef4cb6..d46d1fdc62b 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 95a6d65a9fb..399523dd779 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 a3a747d0123..fafa267c914 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 2102a2a8225..a58330ad227 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 2e74cea5c49..bef5132c78c 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 2de28d73bf2..8314c611784 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 7f3ed900d3c..fe47ceeffe4 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 1b6667f2e80..2e82ecb4f6f 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 4fdad670f09..c2ba5a46525 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 c0f0abe8177..ccce082044b 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 d984eef5fdc..124366ba241 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 142bf32baba..d35f237f424 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 5cb9c481c3a..ed79604a3f8 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 8814c8968a0..4d5995c558b 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 fb06d06cfb4..989841d1317 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 0dd57f75812..b365c7e0081 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 d2e4826ba2d..2d6f39feb11 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 ada7fbb5f34..5d2efe76607 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 3509b1ba8e1..c82818bca1a 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 a2912ef0dbe..7aa83d30ae4 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 05e3422fe74..d2c6e9859de 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 3aa65734d34..3acaf75d699 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 771ba55586c..ff18e86aad9 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 249fb85bacc..abcf1193ce4 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 dc148d4f516..aefbe760d6a 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 71bb67f0753..82f6a35ac8f 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 6ad030078b1..ffe87797358 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 a15f8b4fe4e..27365271014 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 cc42bdc54b8..17faea4495f 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 e1054f296d0..2e32d0ed43d 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 7e85e7616a8..8ad8c24bd53 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 913262d35c4..3e82adeb2e2 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 273bac8ef0e..b8f60dafdbb 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 6dcfecefc22..4521af8d36e 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 00000000000..9cf2bca2df5 --- /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 bef5132c78c..9695f6cd752 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 3e10191e48b..ed12cd49c51 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 c1fb5f1d21e..f7ae21ab704 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 433f9dd7ff2..232a5666300 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 cbad07c0284..79926cf1fcc 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 ae1c2f1caa1..3b8d99c486a 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 d3a889902f5..c8c427a5bf5 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 da581bb969e..b25b89ac9cf 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 1e889043fae..ad0330b56a0 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 a9155c7b628..2cdc8fe027c 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 9695f6cd752..b025253cf77 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 8314c611784..e93f9ea8b4c 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 00000000000..9336d140923 --- /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 1dba5f5f29e..0f4e7e1c418 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 2c6e49f3273..8b2da9e632d 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 00000000000..c14b4284cf3 --- /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 ab965de035a..67f71b97430 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 00000000000..97a3e3bdc39 --- /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 741612b6b4b..f739459402a 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 fea81dcb586..1d409a8a4e9 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 00000000000..697dadb4c7d --- /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 51ff2ede57d..ac9005738c4 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 0e78ddecc4b..a7dbd486089 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 f5519ea903b..d6e4965c235 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 00000000000..fb9156d96d9 --- /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 1b7e1ad888e..5c060e76eec 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 1b2daecbc4e..d463a64efb6 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 2c9562359f5..4a93d96fdb5 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 0c2ecf9edb8..a6eefbcc54c 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 654bcfd43db..a146552f14e 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 c4ceffd5373..735a9bf58e5 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 0682c458792..678d02d9d83 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 0d4a8b73a08..162fac50c6c 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 39cbde08c01..b37ad8c15a8 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 472c430da16..693616ab78c 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 b8073f16d92..61db00fa148 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 ac16198ee69..e528d7c4baa 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 3e35559bb62..f63df3995ec 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 99274d59ff7..74647864fab 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 5250fb0fa70..0f8cac370e8 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 8386409d3ea..59ee8027180 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 e4471b7e55f..ab639b2e6a2 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 3b8d99c486a..3c30340fc61 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 c8c427a5bf5..bc213d805ce 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 e528d7c4baa..3e9d39fa64b 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 c82818bca1a..4b6ff477053 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 6580ab0917f..a9f43f0fb21 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 8ad8c24bd53..b3f4a68e37f 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 8c7b103f834..b6c59604b74 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 6989f58d3bb..1e73f040555 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 53598e24c70..4d984ed6829 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 f51e38bd9da..d2b92e8efb3 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 13e49bcf509..d52a4a2a19f 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 bc213d805ce..2e694e5d234 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 3e9d39fa64b..ea621228cc4 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 b62a413e82b..13ffa318a4a 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 8d1b7262fc0..d9e7a45def2 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 74647864fab..e2fc11cf22e 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 5644aa891eb..420707e54d0 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 77451fc1f68..3b569ebaedd 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 6991c83959d..9f90b074c3d 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 bd8ce68c5f1..5a99d30f087 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 5fcbbaf1caa..dadd528c649 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 b05be45e79f..f241b79f26e 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 ccce082044b..1c748af8571 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 97940952171..624f23d0423 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 188a4ec99e3..b26379d576d 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 1a046c4a05d..66e791e627a 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 0c409bef3ca..8e4e7e560cb 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 015e4ad81c8..e6fe5707a0d 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 d0e097326c7..4ebc4580ff8 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 1c748af8571..3d64aaf3bea 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 624f23d0423..8e55bc2a4b9 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 b26379d576d..c97703f3813 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 45c5474f27e..b98522feb4e 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 a04f570d367..430720785ca 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 5bd29042ea8..788076a7c9f 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 00000000000..1acd0ef0444 --- /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 00000000000..8f12ae96df6 --- /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 cdb61c59104..e13573aa774 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 d80fd3c5338..1e4c39f3ed9 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 62f374c8888..8458c8351da 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 3a7211ab2ad..0d2a19ef089 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 d1bcb600d84..8691dc51c05 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 ecfa2edbe54..5b5dcf8f3a2 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 d463231ba59..93b781170b4 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 1bda31fc6b0..d0d8e4b0fda 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 41f7e29b408..b559fe5029e 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 00000000000..0a01ec0b2c2 --- /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 00000000000..861d9c13273 --- /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 00000000000..7b7f7aea9ca --- /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 00000000000..0732c1c5e48 --- /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 18b5e060818..f6f3a378eb0 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 49b77b829b5..ba5b9f294d4 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 d463a64efb6..1b2daecbc4e 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 4a93d96fdb5..b82d99f87e2 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 a6eefbcc54c..0c2ecf9edb8 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 ddca023d728..f6ef9e703af 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 206a1ec299a..a80fc19406e 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 807406d0d00..63997b7960a 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 2c5717e72f6..f23ba9df90d 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 00000000000..df142bdb31c --- /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 00000000000..a776c8876d1 --- /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 9336d140923..00890a786d1 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 00000000000..5aca06df513 --- /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 e6cfbbc629a..fce67f71b24 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 2ab06e2f6bd..2a32ae89b4a 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 28bd58cfff8..48d9a96a483 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 00000000000..03ddd0a432a --- /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 bd60e1331f4..fc19c889d8b 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 00000000000..893aba77368 --- /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 a7dbd486089..569457d291c 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 e93f9ea8b4c..5c9c69c3efb 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 00000000000..180a00188cd --- /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 00000000000..b77198fa9b2 --- /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 4a27d4a7f4a..73002908ff3 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 00000000000..8e842624b16 --- /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 ffda0e96c12..a80136b3fec 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 00000000000..f018a0c17c7 --- /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 b025253cf77..e992c3164f3 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 36da85d6fb0..ab52f2b23ae 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 e992c3164f3..39b9d1efc5f 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 00000000000..7bea7ed88a9 --- /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 fd0945655d5..904ff29cb1d 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 ac7e53826b9..e6747fee2df 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 e86de00b59f..4a960a6c884 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 62d46500451..7a3e1e8d52a 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 5d0fee65aea..f48bc28c772 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 9cc794380f9..1b51d93ae6c 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 13824dff9c3..c0befe8e69c 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 1f1466981b6..94d78d62877 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 cd77bce1014..72fd0c17821 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 af7a3ea5f63..55f455ad7cc 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 d92759e5eec..798d7e7ef82 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 39b9d1efc5f..25d76e07c66 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 4a960a6c884..7005fce63cc 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 5c534cc4150..d499bc0c2a2 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 922a4957afd..fc089e64b36 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 6cddfc15744..116aff4ee78 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 e13573aa774..dd33491e2b4 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 d5c7a534180..57ae6f0e260 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 3b73caecacd..f088a257574 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 7e1b3eb3fb1..403075989e9 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 c09a1aca612..9e09ed06c4b 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 9a302fbcad1..de9da698c7c 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 72dbd38a418..3b3d3b9cd32 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 25d76e07c66..c05a5c178ec 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 5c9c69c3efb..bf7ffbc4d97 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 aba6ecfeb23..afe9e130379 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 621304793ab..e2af4cf05e9 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 f27d7e1f41b..a6752d838f3 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 3ab7e051a19..ce0c929ab92 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 9de4f928b38..f5efe233271 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 99cda9cb411..71e3ad86808 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 fe6f7ab0d26..8cfffc1722a 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 ba4342ecfce..350c35fffa8 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 b32daf71f54..745400e5c44 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 10efed24bf2..fc62ef880f6 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 183897d306e..5c6fbf71738 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 cad3ecac42a..c96e6e549c0 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 c6946ab6120..710aa43501f 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 58d94bb0cbf..31d8b986d27 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 3f7db674fdf..7894e74b1c3 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 1b2daecbc4e..7cd82ed7935 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 517170fe225..d2304a7aa64 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 4d89f5ff8e0..3d2f8358422 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 07b7c6e997b..030b54a1a66 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 4e2aa0414dc..120daaa8a58 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 b5d5c158507..2e63c8663cd 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 989d86dbc35..53c1d3e0b8f 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 1b6b0335192..5f69c1236b7 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 9e523c67290..70be5180572 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 c2092c2016b..25ad45dddaa 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 02f07e5d492..d81fdc804ac 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 9c3e818e692..e51a099ba2a 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 2b185cb1b6c..68cf7ff847e 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 788934a7e01..6a777265c7c 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 c0052c356b2..532c08a9687 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 61bce851f42..d149fe9d779 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 a4509ba68d4..58328d973fc 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 81230eee728..6f084a9d48b 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 a705a885494..07de20e7a15 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 7293e8f229f..8d0594629f7 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 3a37b65b9dd..f0ce00ca7ec 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 67b5a23f65f..68651936a63 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 ddc02187c53..4024d1d0cef 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 f23ba9df90d..4163b393086 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 6c6db948156..6fa1f260c83 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 a786b0c74d3..56a20706470 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 0eabf0ed574..86338633f7a 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 6f5aaf434bb..8ba71cab490 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 1d911576454..af124ca3eaf 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 19ec431d2ca..e44d7a3f9d3 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 9317331daeb..3bf4555641a 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 00000000000..303e2c099ed --- /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 00000000000..908d0f7b176 --- /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 00000000000..7690efe94f9 --- /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 00000000000..97e1c1f282c --- /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 ad456dd28b6..3f9e9c4e9db 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 db5745ca090..10b0532a53a 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 0156b58c9ac..f3c9cf9588a 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 00000000000..c8daeda3f4e --- /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 5aca06df513..44111d74beb 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 00000000000..a456027be04 --- /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 00000000000..cd7f633f323 --- /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 00000000000..aa8fb858fea --- /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 250a5509c4c..17cdebd3f83 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 a1d0f364769..e64a23873af 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 170faa197da..a9d8b8c8990 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 eb396428e68..d5b6986e9db 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 80e75bce400..f295b0d926c 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 e3e12e4a9f1..384bc3d074f 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 66b21dbcac9..8527a5d553e 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 7c774ad8f81..8ccb2ad12ff 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 f80d63d437a..584255764a3 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 d944ebb6eb6..e56580bceb0 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 b3f4a68e37f..d35e7f48cc7 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 bf6db55a2da..e4d52aaa3a1 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 27ab35dbb3c..266cb150e0a 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 57da6960078..c75d9c840ed 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 6746192b840..8c8961a153f 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 183e7008853..121ea7496de 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 3921413fd28..80ec35f5f7e 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 65b9232821f..93538f2b00b 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 00000000000..33a019b2e70 --- /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 d32f55516aa..041c0e76533 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 f93d5190350..89a3065bcec 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 8527a5d553e..07dacc288b5 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 80ec35f5f7e..b22eff150ba 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 94dc816e03c..c5da910fae1 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 33a019b2e70..9082337ccc8 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 ed699c8eded..258f266ff78 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 8722d97e22a..e6dec7b8e89 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 c05a5c178ec..2a502a55db4 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 8c8961a153f..89f464452f8 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 63476a9b717..4e88d7083c4 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 f6fade69ac4..393a251bb7f 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 2a502a55db4..940176538e7 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 bf7ffbc4d97..4674d5cbf42 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 e56580bceb0..9eb9a741da0 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 1c153ca8253..4bc8a956f1c 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 f6575ac8404..663d5dd89e3 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 4d81108c5eb..b808dd0594d 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 fede00cfd7d..85ef0052029 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 f246c657708..bbbfb75a536 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 940176538e7..5e6e5c8b56e 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 4674d5cbf42..7b9665462a7 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 9101e342a23..3ae3c64986f 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 f78d88ab3ec..a9d7f0ad5be 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 5e6e5c8b56e..6b323191e56 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 7b9665462a7..96a69be4786 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 82287877eaf..c9f2c271000 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 d438f94f4c3..5ba6f182c0a 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 d977e24bfec..ec100733a53 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 6b323191e56..8c1e230759a 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 96a69be4786..109f387dc7d 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 a95f77ab360..867a1044856 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 cd0cda68125..c03f05fc0c1 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 8c1e230759a..4465e3b2a61 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 109f387dc7d..a982e2b9fc5 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 acf72eb254c..f1f4aeaf0d1 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 e6c574b7b2b..b5279fa3ce0 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 00000000000..674a22993b9 --- /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 004dd36ed4a..1bd44959ab1 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 1517f12f52d..3b83aa3774d 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 9dec8fe0c71..0790ece9333 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 a81696f6c0b..3e1e790fc02 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 87f55fd6b2d..a19f42d7d56 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 e415734bec2..2685064a946 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 7005fce63cc..9750e37f32c 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 f48bc28c772..fd17d7bdb0e 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 49bc626a957..2e2f74828d9 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 b7239c8bf49..32474881a87 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 0cb7c108b63..216ee519a3a 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 a80a7f2e0ba..c77d1eec161 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 4465e3b2a61..d8edffe2937 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 a982e2b9fc5..f4be0c40960 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 7e16a9fc6e0..5229881fbf4 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 73d5e0be458..7dc5d958537 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 e17869f6cfa..999a62b3a80 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 e5e1f9061e6..d50cc20c1ae 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 8ace9070f8c..7c5e21191a3 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 bd54f42fc21..37dee08313e 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 1c7c8bb4a90..d6effc7eb80 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 7ed1e62ab8a..1631038f81a 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 e4acc2f907c..fb5f8cb6ac0 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 5a42ef1c8b8..8bf2b77fa25 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 220228b6570..b032ca30fc3 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 9e05b831359..db4dfc38664 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 f1a27be83b9..0c1ce2e9585 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 0847f3fb907..6648333bb54 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 3daf0bac828..e9b9513479f 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 d52c0867e24..9fd99e993b6 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 ca166aa793a..2ae3de49817 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 f1fd67cc4bb..2a132837388 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 81a54a182d4..afb7e23e8fc 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 2d119e2cf86..326ac799f06 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 4d984ed6829..34e9c5fee25 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 cf5b2e374e2..ff65658073f 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 ac158388242..bc6cdbe8ba1 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 79926cf1fcc..f2cb29515b0 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 7e41d5af9e8..9910fe42e03 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 27d00024706..0986362ba28 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 99dc5b0d495..d91020c7c2b 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 29c6756260c..48423d08e69 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 93aeb0d28b7..7da4da9c05d 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 c0391f17f13..f457ebb3d2f 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 3a4919dacae..c78ec6ad69b 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 b18608587eb..fa33b0315c7 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 d8edffe2937..928fefa510c 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 f4be0c40960..c8718f38528 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 e35035b8fa0..94a8f0c8bc4 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 249635f9b2a..cb4623cea1c 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 c258101da70..8e323c0a715 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 9fa156e0b28..4c78bbb23df 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 402fdbd0715..0b86a430d89 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 99173c830a0..94a8f0c8bc4 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 928fefa510c..e6192d55345 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 c8718f38528..079cbc896c7 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 cd43659fccb..dc046f718a8 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 aff294beec1..4d7280a6a9e 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 f1f4aeaf0d1..3bae7386c3b 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 dd33491e2b4..cbba7cbdd5e 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 47c6f4cf24d..0f63039be9d 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 00000000000..f02ede2d948 --- /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 00000000000..1fa96e6a98d --- /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 8d432740a4d..be57b172f4c 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 5e0c9f04058..f864a4c205c 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 00000000000..e98bea189d4 --- /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 569457d291c..521e75ab36d 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 079cbc896c7..5c6c0801b65 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 00000000000..c2d6d8ef37e --- /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 00000000000..9a99f5c14fc --- /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 00000000000..837b90ce30c --- /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 c3fc9be6d45..5d88ded9db5 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 f0996f9a523..f4e999225c4 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 00000000000..872b5b2e2a4 --- /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 228074abf06..30dcf2793f3 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 94a8f0c8bc4..df28c6936db 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 2b7d2296a01..152c757424c 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 e234c2b1c67..4352b15b8a5 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 047f585a4ff..0c9c0e65ff1 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 3bfc224a735..ab54e191116 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 20763dd39a5..51f083b7eeb 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 40d767728d3..82b7e1be039 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 83e1337b079..d11f8c91fc3 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 28071291266..1bf239852f8 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 fe7bca654c3..ebe5f73669e 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 4e086978be1..6a3dc1f5941 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 86eb3919f00..28746bbfbe0 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 0f35cca5f08..6bdb6d0d4f6 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 8b5724e014d..5455bd6f670 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 209bf71e594..144836bc571 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 52cbe906402..36b4037f70a 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 7d8aa104bb0..9071da9707d 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 55309ea8b31..4a24e979607 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 7ac98f284c8..04acf6a9dd9 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 11c31107ef6..1fbd4885f43 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 67dc07f68df..7713354b14a 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 fd7496b1316..bb5adb943e9 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 d7986fbb5b4..fcf61dfe097 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 cfd1cf2a197..6f3e58d4ad4 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 33663f121d1..9ae61ed9b84 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 50c87907774..c3515177535 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 95d2e15a510..9b9b8157bce 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 824af441688..268ec581c00 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 b5e488cc19c..40f27135be1 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 e4558b103bd..fb36a60eecc 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 7fa391e8060..1cc0e16f30f 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 fb57040f2c2..b202ff8485c 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 b8d18d90833..8e4c712e8b4 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 c0725219a9a..efd00b3da1e 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 41c7df7889e..0c0d6c53ed1 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 cbba7cbdd5e..fa7f6745aee 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 144836bc571..ad4d30358c2 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 bd90a87db86..35f21ef3e0d 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 ef24a51be89..15ae5321bf3 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 a289004ffeb..c501fa7c120 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 e6192d55345..38133b1a476 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 5c6c0801b65..6f013a52da0 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 446fe898aaa..d9c87beea5d 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 50100d3625d..631e6e9d70f 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 39443c3fef8..991be0bac50 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 03fd8400dfa..c3809f76b8c 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 6ba301c01e8..bbdb8a82183 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 8cb4a0b9636..2cfca8e6b92 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 802b7968ee6..79684bdeb44 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 d0ed9a9d33c..a2b8f2e9ea7 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 5c1385c6ecd..162d6400fb2 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 fb17a8ea471..c0c0c22f560 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 d8047265415..8e35b091b33 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 8791e6d864d..86c6a2d2c6e 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 2ae4e632d6b..dd31116212c 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 f38836c0414..02ccf930c0c 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 3cfe36b3220..763c22499aa 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 85413da8f80..57eedd7885c 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 da8c4918452..07c77b806f6 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 04a9f9e388a..4479e269e87 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 e98bea189d4..d20619c3df6 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 c14903df950..22df2e88d77 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 eecdecbfdf9..06bbf1b764c 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 e47613e17ca..f456809147b 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 d309f8c9c93..c16aa9d52ad 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 fd4873c808c..9b21c015f58 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 6c48024efc4..e165b66f002 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 735a9bf58e5..2293be4b247 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 33f3b4229dc..95497b8bf19 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 4a3e91a3e50..1a477ca4d57 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 e0a5a477ad2..254229d091f 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 6bfda8c31dd..9b56bc9f39d 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 a6eaa488c60..535c5add3f3 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 03c46f02efc..03708438540 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 36272a3de88..85d12844593 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 987e4907911..960e2f22af3 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 00d1ab1828e..0c1c50e493d 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 ed557133a9b..65ee5b59a41 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 5539c6f82df..14ebb5ecb95 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 9f402a7d1e6..bad618321e4 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 faf463ea8db..b0571bb7d80 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 353b1b85634..809d87e13cc 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 7951df50e5e..784fa3d0056 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 9c5ea291897..46dd3f25ded 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 93ec8603d03..62537be6024 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 2442fa61a91..0519eec87d3 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 3ec324f9cd6..8c1078fb834 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 add0ad31cbb..dfa66b5844f 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 ee4df700f79..c7565881a82 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 7bd67a7a2c8..13771825fc0 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 8af5a5ada1a..a486772139d 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 28b404acdbd..12bc234fc4d 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 67031c41710..1d92864aa27 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 40295c74e0a..4d55ff328b8 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 f2d38a1dc7b..e269121086c 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 a23c2a9184f..4c613a286d6 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 9f23f056894..620207c14bf 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 4c706522198..185e9ab5498 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 abf47e5744f..d0f343a21f6 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 9fc47504b9b..2039f3f39ff 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 cbb63cf8229..53ba28972ee 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 184b7e38946..78471e703ba 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 c77d1eec161..0e6a005d3ed 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 00f383be502..62ceae7753b 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 7cb14b03c6c..7af3fffd09a 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 0ea8a40bc0a..cb1cd5df8bf 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 419f3650333..10735b7f454 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 300c9b628f3..d111aa9583e 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 6d53e4f12a5..e50a20aefcd 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 f8e907b46d5..2c571be1a0a 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 4e7bd5729f4..07ca5431869 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 57dd0b709b7..f580e7bc1dd 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 96d24139c25..8e4acd1ad96 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 5d7ddc8b55b..354c69cd55a 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 c72ec747b30..8afa6eaed25 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 477ca7eb5e2..5afa10f3aa5 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 cadfd03e9d2..a5f0c6ce381 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 91950f62369..0cd5c7d8da2 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 0d6fc42d1a3..c0c77261e5a 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 39dc17e66d5..650f95198d5 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 646151a5229..17a390fb575 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 7842f858fd8..fb7739546c3 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 f0a38bcbc55..7d55bd448b7 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 2aa0eab328e..47157e64d96 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 9e6a0cb2709..5346e2da3ac 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 1e6700267f8..bacd16f5f29 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 5ba3fff7fe2..4261608e248 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 8bdb3ea90b9..dc9b4833aab 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 fa47c2819ba..5c70e37ddb0 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 3effdbc60d6..a3b34456b0b 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 206a1ec299a..ef942394a56 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 7bc25726f27..4b257eca748 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 9c5af45619e..8692c42127f 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 fcf7305d714..a79bee5ce63 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 2fde2782f46..697b1466ef0 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 83466327da3..2952c8436a6 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 e5491a8bbee..fc7f189bd0e 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 92f0fd19464..66ed7edff44 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 77443b1ee9a..ff7d2d82f05 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 bff5dc2e68f..44d3ec5f525 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 1f05a1c7a5f..f905f7810d3 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 7195cce2e31..10e7e2e1400 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 6dff7c00ba6..9ba9bbf49c1 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 17072850259..8494f350b2c 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 403d1980b94..7d55b1f304e 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 71de0764789..8a3d44f6229 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 d3af47b5378..0577fc7d24e 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 8d5042731ca..d6dc5a3af15 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 537bed16a78..8c17d683886 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 1c8aadc2192..7ffb6dfbe1a 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 94a8f0c8bc4..31357050624 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 2db9e0f94eb..015b24848af 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 650ae3edd4f..ba02a718cbf 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 5399d5176c9..fe4b8540f4b 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 74a72fdd976..50570f8f396 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 81308ba18af..2b6dff2c0fa 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 0422919c1aa..e5b81fe2c9a 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 316fbd946db..fe12c6cedad 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 673fc6f54bd..d5119949953 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 77bd1250033..49d9e2974ef 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 697dadb4c7d..65d0462486d 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 53a32812f60..3668209ac6c 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 61cf5a2fcb2..5c66562cbbd 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 a12fce67ffd..11447a72d2a 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 893aba77368..e2883db8d7d 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 e353c1363ab..fd9f4c98243 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 19f4eb0da22..f70795f2f63 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 868fbbed550..a4bf785dd4a 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 a239de65b6e..e5ea812a132 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 3ef76a5d20b..f5110e7bf88 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 ca75fff0737..c766993d454 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 881e97bc9ca..cb7767eba12 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 628c0ea5a00..be5aab88f21 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 b927e6a5636..700fd26aaff 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 d8dec2c40cf..17cb2ad85c6 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 4e656d35563..183892042b3 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 e7a55c55f1f..ec4f7b41a2e 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 6f9c844d5cc..a3773d83950 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 d4b40817cb3..84ffc939937 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 9f40c4babd9..908a122daa2 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 dde66b8e122..1f69203992a 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 0ab731eaf50..f02c5cebdcb 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 a015ca30770..99d21c2886a 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 ddb03a135b9..393d7f6b7db 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 b2f669006a9..8c3b2e9aeb8 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 29e3f342cf4..681acd61015 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 7763ff04a7a..f7431ee79f1 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 75c65f01e11..df5855b0cee 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 4a5fa763ea1..410553fac93 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 ed5ec85a5d7..acfd480e068 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 e8daeb22c0a..6b83daece1e 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 f2def50d063..053078c2031 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 908e8f0fbc3..d7be7f92480 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 c0c2a35081b..1cff6db701e 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 385334c8549..501ca5f4369 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 af51aca8af9..e3e80942bb2 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 9560dde6b3d..e27cafce1f9 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 ed65a5df7c5..cb75480e75d 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 89b5ae0c4a5..de52e9fe28b 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 e0c1b6d6a7d..f7a32b0983e 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 eefd4526d7f..f2c19a12a18 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 d086aaca395..59b0c47ddb0 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 30980103b38..74137999700 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 4a371c706f7..2221106987f 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 590f7662731..1e9e403b00f 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 b840913b7be..b75600bf2e2 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 9a59e4c2007..7a40f7b9410 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 5bc9efc3696..7b40e7ffaba 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 398927d370a..6d43dd7849c 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 9b7b3c39b03..43fa21ce5a2 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 e9e6415518d..d03b6c30321 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 c1ef5bb7926..04c1c0eac6f 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 00d048c3343..d19eabc26ec 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 eb3274f19b6..10951367173 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 710aa43501f..4c625cdaf97 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 749ba7d9c03..9f20561b9a9 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 6dc6ae18d81..fb818140f8c 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 02bbb75cd2b..981bb3f877f 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 e449f668fd9..806d986f850 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 bd0dcc5fa43..5686ae42f15 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 0e2e82437e8..8f8a98dc282 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 d91f226a7eb..f40527697c6 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 69ba6b024e2..7504155ed6f 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 690947364e1..d8c1bd75d3e 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 eca46d7db00..39c073ad5ba 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 974524c932d..62d7bfac76a 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 519ecef52db..704ef784655 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 d08a5715a8e..1687e393688 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 e09d9c0d62f..fcec0623ec0 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 00ef4c7180e..0fbdf397d96 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 b33e9b18da8..ab56e872157 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 727b67e3245..c3090fdd2c2 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 ef485ec610f..528f0ca6014 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 b559fe5029e..62507451e1e 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 b364a45c344..697fb332c7b 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 b11493e337f..3fe44b47c19 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 ae3990c31ce..fa22af87cf8 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 0453d397bc4..46079d04007 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 75b9bcfc1c4..f5eb89f9e46 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 75c77d9481e..a9154d11f4c 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 2e9c97c8232..e94b35dfb56 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 7e2f4f1ff6b..117bf40d271 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 492e1471351..ae3b8cd7858 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 85918d7c711..f2ab2c7d5d6 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 d99bcb90733..f5bdf90b9f1 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 7846d8173c4..010f8dc827b 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 d7797997910..e329f1208a0 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 7c7d10f47dc..c435eedd3cf 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 66934d7a986..fb22747348b 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 070eeee8b51..5a08b7f07ff 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 02f25900428..0c50069f7de 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 30d501f1af6..2749cd65248 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 0a01ec0b2c2..14a73c551cc 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 752593ce29d..d325b036ada 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 6ee4377db95..90571a9c6d4 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 762c99ec4d7..3ac89b1c968 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 4e1511b2d2d..55a12a37f09 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 a7f20253ef1..f9426000102 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 2a2a1fcd07c..2c50b00fc12 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 99c74c3e5cd..cc96048b378 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 e8682a0188a..1784dd55153 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 6511c7b6da8..6b4031efb03 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 e40926d4a08..eb4169afe42 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 3327e34e765..29539f78eab 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 5cedcfef481..e5b9b6f64cb 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 a752b791988..12e125f4f66 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 89021793f94..e0c0c8ba0d1 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 96638ef08fb..27a4106f3f6 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 41e1fad4126..bdecd6454a3 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 30a4cbec6bd..53a12848c0e 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 2331e57c6eb..30d5b4b6028 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 dd722907c6a..b5eeea46850 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 ec484ffc0d4..e02232f0272 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 b47ddca4a26..6f696a7b1fa 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 939a9a904ad..ea7e20a920f 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 a25f5dc1574..adee9514928 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 63e1d99f7a9..d4527c69ba7 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 dc5717539a6..bc26b8f5ff2 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 720400e72a5..efb460f0e01 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 02162980894..dd9004a6b19 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 4a593cc5605..b24954bb955 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 d2630b95c02..5ce4086ce15 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 9522e350eea..65b6198c9ae 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 4795267cd5e..e7c68a67b73 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 f446bf7390f..1e9fe221fbf 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 d34169edfc7..3f71608800a 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 b57a0e15797..0039e484a05 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 68d714cfc1b..2b21e1c0553 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 da1e173b4a8..780599c2163 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 607454f4402..93b9067414e 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 6447926f64e..7ec8e2418a6 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 6d09fd6ee05..f62d3de9252 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 a13874b3676..22de0b870e4 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 3b21726bcbe..6d4aeaf21ce 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 88be279ae7a..6ce77e0cd95 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 ca4d0b912ab..2b782dd5c3d 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 ce8a3ed9db6..31e478697d7 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 3f8e8444cf0..ae69e238fff 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 18f5d043dbc..1696fb3d6b7 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 4de4190d055..7187dfd0e84 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 2a99430e436..cd3ad4ba29e 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 c5d84f030fa..06429d200d9 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 f52bb6697f9..f82c899184a 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 1539429d0ef..0490f2f7f96 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 df9fe8866ac..0edb0b06e24 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 0991c74b0a5..75a12da869c 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 5028a84eb31..ddceeb5c5dc 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 9213007e935..434c3007182 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 c3e2a40ab13..bd9a4a659c8 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 4cca42afbf4..425cc1bc94f 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 ae8b829d56e..0a5e46514c1 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 34490332c12..4b915da3565 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 6febc6ec20d..f7ee20987a8 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 e5c27bd3939..7b3b4bb9f35 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 2aa38688957..08137019284 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 1c6f9224c57..e4d6c2c823f 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 bc8f90057e3..1054d22b2e2 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 0f878b363c9..1774198088a 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 b69081286ed..5ad62a7877e 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 45d98e64dbb..74a24d2f912 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 533d46ca8b7..a53edc2ab4c 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 61d8bf3ae1c..ca258dbc9dc 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 e1f01d1567f..ee6ddcd32c5 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 4f9389e7e49..676f6f9dee9 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 2f68fe4332d..5adce28ab08 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 dc6f2d51ee9..5a0255e74d7 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 fdc7b87aa6b..59f8b132e74 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 b0ad4660d0f..b78b8cbaa7b 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 561b91799be..01cd9146f49 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 d63bcf9acca..5159d8b9f26 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 8d34eaaf5ee..94e2e76d919 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 32c628f0b0d..0a86c59934b 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 31d8b986d27..7f47a67ba21 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 6b94dbc53ee..d7191e0a317 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 98445345f96..1c992f4351b 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 018bb9d6a56..bdceb09daef 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 514ad6786d4..bdbe41fbcf5 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 449989bade1..51b6add6a91 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 fc90b3e8bb5..6a0eae5d05f 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 d0497278fee..67b85faf806 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 193b9a46e3f..2ec3e6debaf 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 c56822ba5a4..83fbfa0118c 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 b391af0e609..5ca4c474bc9 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 21f33d120f7..78e4e200082 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 f238b00e847..7410a79bdc9 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 b56cb0c5b74..cc76571b01b 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 c5404a173f6..a86131723e3 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 7894e74b1c3..19a774fe170 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 608e12d020a..4fb4f928768 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 b6347e21744..ac8538c6943 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 3f303140c68..e3083687b07 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 648bd3cfd7d..ae2da8858b4 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 24ee0e24125..c19c50381fc 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 10fc8c02d66..852933c6204 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 1ad7a446cfa..fb04b498d70 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 dd1a63039e2..cc53bafb57d 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 453c8fa3643..10e9fb563ce 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 d9e3a40d304..578e642d4d2 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 9d66831b91a..a41e5ddd652 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 76ceaf7cbd7..c208838ed1a 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 41ecfdb80b7..e24c29a86bc 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 837b90ce30c..9332b67d232 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 00000000000..7c24e94b552 --- /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 00000000000..0468cb57f95 --- /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 00000000000..8f8c84b952b --- /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 bf592396094..6c5e66765b9 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 7a8f754bd9f..c89e9e5964b 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 f99681d6d7b..1067e85f1f6 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 928b6bf3530..8a01f48e7ff 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 ba5b9f294d4..5ee8c5eb77f 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 d41d09634d8..8c805c6cac4 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 788d0c74003..6e5b1668ae3 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 1907d65f289..88c6677f1ec 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 838598f24f7..768d76deb8f 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 ec0f0d2453f..9b3c75bffb4 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 7553933b66e..6ebb11f7290 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 c72aab46801..4563adfb0d7 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 46bfe618176..b2cd8953d69 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 1417720714e..4d888941fc1 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 454cde320d7..3616626b123 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 0faf059c8b9..b921f2914c6 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 d22f128ffbe..e1b7cc0aece 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 774863d4f08..8843d7387a2 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 987a15f8a2f..025fe7674b3 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 c56bf118dc1..1a882fd23bd 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 26236397dec..bf99c857f73 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 82f063b365f..99138d83652 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 5d8ab236237..45dcec60231 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 ac1ebbeb236..d2f01f33bfe 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 f908f41e328..2a386a2c08c 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 2f8d4982afd..f23bc80877c 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 6dc41196af5..dd52c6360d1 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 987c54955f2..a98a23c7f0b 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 99feeb3c898..b004a2113c7 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 40d2514b59c..95646e7c7fc 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 91dafab0201..6d11110f1e2 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 66dc4ea8dd8..28421b72e1f 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 86fb32c0844..80d59ed8f53 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 21c8e60518e..e7180c39a99 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 25b9c10b2e7..07660869dbe 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 f0eebf4b7b9..a5ebfa778da 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 f1daff83069..0149962a5e0 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 91c428770f5..dddcb786909 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 7f550155658..f51d51301e3 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 6c733896d27..ee5fddaff76 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 c4399f95def..2dff5973a2c 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 e26a829480c..76a9f0d2b00 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 85d1b14484d..2eb62fd0a18 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 8a1d19c0ecf..1595f47e55d 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 da03eae701d..a44b3d91ed7 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 24a7215574d..9fde52f421d 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 aea55058d10..c712eef6886 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 372a9cf0760..e430e4135c4 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 2f2982293cf..9d0e96167a9 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 d4f1cf4c1a5..906f939166b 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 711ac320397..b95cab0f447 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 cf89911071b..7ff68cd7fae 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 dce3519f09f..5b9b095acbc 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 cf5f42338c3..6c94fe09806 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 119d172690a..e3733a4fcf1 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 5aca41f7f78..5844868a6e4 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 4e0b1ffca5d..ee5fc92391f 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 7cc44d7038a..d616634fdea 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 18398a2b048..8c3d92edf92 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 e88afa7caef..c5e56bc95a2 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 962f9ebe42c..699ca413604 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 55ac013f96a..db6d5c7ccb0 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 7c9fbe67565..c33d4c06e6f 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 a798ead27b6..341efe2d932 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 510b75658a2..f213befed4f 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 0c0e272e23b..6a395059625 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 39c78acc4c0..5219caa057d 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 605eb0b8182..1da2a7921f3 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 2655bb40f08..8449db1ec7a 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 f08e3e277e9..1968f3d866c 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 9e484f5d38c..8c8cbf8f36f 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 65816e696fe..75b269eee97 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 f1e18f8fcb4..99adbab2da4 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 882bc5de359..25dd4070453 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 5359f92b138..f853e2d5a0e 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 6c30efc594a..587bae0d5e7 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 2bcdecb2aec..03911b41cc2 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 aedd81baccc..a3ed82dddf1 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 97b1753ddde..5007a0e42d1 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 b543a10d32d..552e90dd42d 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 4d96e606c7b..9deb850b020 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 ed54abac03e..dea49b78e7e 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 e5b1683790f..feee2547932 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 e9859d23989..2d053c6b44e 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 118c4bc424b..7daaef692f0 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 4c2f74440cd..25518b5efea 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 a59b5215e7f..3c779091721 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 89e2ab32863..8ba74734a79 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 bc61e82b98a..56c4fdb377c 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 43bd868d0c4..d91499dd0d8 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 5f3dc09cf20..c9b42c49112 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 d3602540349..3d00dd1f6c1 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 b19e42cdf27..d75a5ef4704 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 edc31f48761..a96f48c970c 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 923a4cdc819..c2288786661 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 171aedc801d..211c97cd68e 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 6fc6bd8f811..129d96ee183 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 8c03db18527..13f65dbe413 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 dbd56e461bb..b0aabd40c0d 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 03a3ff49916..dff3b965586 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 9862d924ca4..85183b917ce 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 b8e5a069e4a..75e271a297b 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 180de6d8c18..80d1f452c3a 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 f122e794424..36ab96cb8ef 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 7286694fd9b..5de83e5fb0f 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 b0ddcbf4903..c3f714bf77d 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 2fa60015ca3..f5338e85d3f 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 856bb1445c7..f8e21aa44bd 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 b3e775fadf4..ad5fe4dc52e 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 1605e1dc8f6..4540db5f257 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 6fa2b664a30..5069457a4e6 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 d3a733a3f9b..375a4b44fd4 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 cfd4b7442d6..5a143252469 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 f433a6215b8..cb2118c3a0b 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 0b8151d23f6..78cd905a417 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 4b1d1bd86e5..90d9c0b0ead 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 cdf98f5e597..ccd4903bbab 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 683bb61dd44..c01c8a734bb 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 67d4f852625..fb8f82824c2 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 30feb3b5acc..c8dbbcbbba3 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 3caea70c4de..fc77fdc9d31 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 bbdf68ed794..6e8a55d56fb 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 34b4c86e77d..b8ba5afe94c 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 c9ab31597d7..a5ca34285d1 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 088b354fbb1..005ce5910ea 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 0f1247197aa..2058992de2c 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 8f0fdda3711..d8f55ea6058 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 5123dc2366b..92898ab0f9b 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 457b7d1b89c..6bf389bcb42 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 3bcbb592301..84fbb180397 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 ee386bece55..a626e78047a 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 544ab0ff2ed..6be08699b82 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 fff54bb3f6c..eb511dedf8f 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 91dd0ea9a54..01c1097673d 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 7cd82ed7935..2732c6e94ef 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 b82d99f87e2..117fc3e3398 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 ea65ffbab33..96c85cb4824 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 d2304a7aa64..e64ddeeaa00 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 93c54b3915c..dd415341f5b 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 0c2ecf9edb8..85463ad1fb4 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 da7878e94af..e7c09897d48 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 31148c80e30..ced8249c85e 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 72aaa84e70d..5bb9a4997de 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 e12668f082c..7973749aebb 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 00b9c1f437a..54487db6c86 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 61479cb78e2..a7675305ec3 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 611d38ba950..bf52e00b9f9 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 986795e11c9..30264b9c820 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 a10ae01e25f..b08157ecbc2 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 ace1f4182a4..18418b375a2 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 6d800bb0269..5345db7b04e 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 f0ea9e57ca0..1d73892e2b3 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 3d2f8358422..0798e8ae73c 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 15927059d32..6cd97221fde 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 11a8aac485a..f9c2683ff53 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 ada31494619..40c51f99d0a 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 030b54a1a66..a7478239682 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 3b1f5f8a8d2..9609b0e64d9 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 a29718fea7a..a4176a43085 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 fd2764e5ec9..7017d075a8e 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 658a39246d9..30778b4490b 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 e49671c88c8..6c1d1c1b3e6 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 ef01fcb4f3c..a9abb4aacd9 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 9fd9b61dda1..a60aee6a42b 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 3621cd1c404..941f04f5c9e 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 51f0cd00642..996b9c138ef 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 1173cc48e04..16477633de2 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 529170b111d..713cdd6ae35 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 efe69b575fb..e9e02a6e1b9 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 05b4ba93427..3787d37750c 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 b7bbb906508..a13903a0f66 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 cb932a0d9d6..ac10172933f 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 a46606621b9..ed813c9e505 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 f224d100929..ea46ae807c6 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 8183f28aed3..9a07b5ebc50 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 8183f28aed3..9a07b5ebc50 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 22ea3d2e196..a793985702f 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 b67d4d56fb1..33e4ece832c 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 4c5f477cc1c..b577b02e25b 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 7f6ac42d609..084db6adfa2 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 af1237ce211..e7b2842e0dc 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 f6dfc9399c2..3d06f8cb9ab 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 db41ee98e01..69db954c6f2 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 c682c07a8b9..2d06efc2fa6 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 1dbf1fa0c8a..199a1a83d7f 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 9e1cbbb636e..f5f1633dfd4 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 41a66b038f5..b3e07c6fb26 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 c106543e158..ff8394ee0e8 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 0be75b94be9..e4aef551359 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 89889fd6048..c042737ff67 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 cc1a7ac8510..717f037a836 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 2010495d959..2ca23b9c420 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 752acbdecd3..d3a4fdc1862 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 9871df0d262..5590df8dab2 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 5a96b853eb0..81b7a05690d 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 4d23ac8aaba..7b97ce66a18 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 c555a3e09b3..a1d35e134d9 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 6d709875771..d8bac88ebf1 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 de754080f17..18144097b48 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 88405328896..c8e5424ee91 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 b6bd30f7997..28ee1a39dbc 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 07fe5e11217..5ebf8da8f7b 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 8a542dd0d62..7fd74e1d008 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 3cb54145ad8..3943e5f07ef 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 4bdc104e7de..e9c3621c956 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 98a9e81f661..bd18159b134 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 774ce1f2035..e7b9c7db6b6 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 f23f83481e5..6e69dfe8253 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 d7262f50eaf..0847d858f60 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 777b66d5c91..cafebc6426f 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 5099b264085..49b5bb311bb 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 4e2a09c6bef..4b7bdafb9ed 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 be2500b38b3..62cefda80a1 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 d9de1368ec5..a12229a12db 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 08e18b89bf1..e83fb1547ec 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 ab20a6ec424..a0919a77299 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 b7a1bb41f53..98fb3f6519f 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 d26da82ad1e..dce019b8e33 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 2992d066d4a..fc31a6e1af2 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 87524cd7dd6..8776359503f 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 120daaa8a58..d87d5004a85 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 21f67a9471e..be74bc781d0 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 6d1a80424bf..25a2257dc89 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 fff92c32188..d721ba4671a 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 bbe77a36aff..1c2d53870f7 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 29fb34672c8..04462798fc7 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 589de2b6838..8baf1e12ccb 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 bb8b291f86b..d751f51edc3 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 bd8503fabd8..6fb6ef757be 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 2c4d16b5787..db6c064331c 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 614811db45a..c7db0e1cc0a 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 818783813fe..f9567c9a789 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 39072f70d82..58c9624857c 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 5544d2e7f7b..988d789d3d4 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 7f308fdf3a3..6e783913f67 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 0950d52bd0e..c37646fa6e8 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 2ecb587f19e..10591facd04 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 2fea66a9d38..c946ef74a90 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 ee1fd5246c0..ab9bb411b5e 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 56bb3ace26f..94c9e1f35b0 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 301239cf31a..b23da4e97d1 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 6658c3ac2e9..b925aeaf26a 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 bd4e7aa1ddc..48d36c53fd8 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 65394faba17..34650c72e1a 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 660e0064bb6..fe382a39059 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 d70be59afb5..b674dc12260 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 da62172dc10..2004d82aeba 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 e1eb6ebd357..983ae0351ef 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 3ba9029eb00..13bd7eb03fe 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 a10e4d9e89f..afcb56068d9 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 f5bca5e8416..e56b1e0bade 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 d52003d10e1..7815379f662 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 2653060030a..2e882321f34 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 2e689b5e064..c18424d5421 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 e8465a56728..2c121e622de 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 81e363aa01b..4179fa962f0 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 9d7ab4ef2b0..62eb49896a9 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 e46fc4364d2..8d01a111a6d 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 ca05983eeb5..0bf3a87222a 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 8642ae75025..a23c9a442f7 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 97e10b451f0..e35b89348ea 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 d809647c99f..c8b723b7379 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 1663ea4d23a..768ef131847 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 f05b0bcbd8f..7b637ee370f 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 83850c186c7..575ab28df49 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 c0c638851a1..597381bcd69 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 a426b7a3433..6952472fe99 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 40e6cff4460..7910b39368a 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 7671e250bf3..0efc9044be3 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 8fdce004c41..3cf4d12adc3 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 20ad7b8b007..14a3681410d 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 c3f1941d8b5..abb3d984502 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 4ef1e528c22..30e3922f0b8 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 bb56b4c8154..78350fab91f 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 86a4e67801b..7da8538134e 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 d33fb66f122..eb0248625b1 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 d40d927ae8f..7df7404d73b 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 ddb3c3a36a9..6c1725a16b1 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 bdd38b8538c..cccea2cb77b 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 0da64fac623..fbaf0d676c1 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 f9c8a21240a..8192bf9267f 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 376252966a3..b2d8f845cee 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 51c18c764db..85d75c81ff3 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 f727c8bf522..8cba52b9591 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 e284f6c3732..b94548b44af 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 629e006564b..dd115897e4a 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 9b6f7706253..ce182a3f00d 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 8f39309264a..638c1615a16 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 ddee892039f..3e1062e4201 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 11d1aa3ff7a..e797c38781e 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 fe26cda31e2..16c6ad1e512 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 fc349a0d9de..ccc9f5ac21e 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 a0b8efcacd6..ba4f87415a6 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 0dd32f66c9f..fcc37de1d2c 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 0f82f93b383..b4111a184e9 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 138e077d4a4..80a08aa09b8 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 32bf473ac38..3ff4a0c1351 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 768feb83747..467d1139ea3 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 4ae7a356c4c..ec12f514293 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 88d8a822696..cf413a3ef1f 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 40b4307ae02..0cb50c4e447 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 44a18396873..85b59110a90 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 2e6f8dc62ad..edc8fcd19a3 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 db4b4362a5e..62475b88a6c 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 c9852632cdd..75d34e925c1 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 f5236d1735d..3f58bf52048 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 a0a2d77d48c..962a417d09c 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 be8033f316a..003926d6d58 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 26fa4ec0bd4..7459f7a1ce4 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 628983fec03..f6aed1a1be9 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 bb77e87f6a1..8f50a6720fc 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 4d8068c801b..5eaac8bad65 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 8302d8b38c2..914560f4a05 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 a56130b2263..6e727e973a6 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 5e40c8ec5e5..7cc1215f820 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 b4fa669fbff..900f255e74d 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 ebd201b5550..10e6278ac04 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 1c2baa9e028..aca9bdb80e3 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 7e4a85f3514..a14be0aed6b 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 27d223012c0..cd168681c7a 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 5f4e9d3e4c4..afcabd00eba 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 37788522e4f..0f46cdce543 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 4839167785d..128f1ebf9df 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 bc229d190a7..48985734273 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 9cb58b1adbe..02061267cd4 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 bc70e908829..a07665dc9ed 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 e9fa25b30fb..33c17cd3021 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 2e63c8663cd..354f50b2a77 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 c0e8750d94b..84052396d97 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 7f1cd8c35eb..5cc83d418dc 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 00000000000..dd95b221da5 --- /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 88b83190806..fb36e267f94 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 fd2882c607b..416fe27add3 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 dddf7dc2c88..dc29217e3b5 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 0ac83023896..4df27df0f6c 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 ca868b8ebd9..5b20c4efca4 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 df104c5405e..f98770a7b24 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 c155a7f6111..27001b0d9aa 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 03c8d0bce09..f6a1b7e4b31 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 8e8b050ba7a..ba2831ad6c1 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 50f31707a61..6299bc03980 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 0abfc0ef52b..c49e8cd5ec8 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 72caccf49dc..a85f8e68744 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 75d925e2f7a..1d309944557 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 2c073e1d044..20e7c6f60e5 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 6a91abc7076..af732d70df4 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 6624167722b..8fd4287866e 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 56c91ad824c..b0e270572ee 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 21567b8f096..cbf680ffd96 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 cf8b3e55402..c7757eb8ac1 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 40fe7f097f1..d917ba507ed 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 4d4fdcc650d..f874e519f6a 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 e9865b9bf1e..4503700bbbf 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 38da7b96e03..8f82f6a623d 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 95e59cf350d..f1cdefd721f 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 ed8d33cc65c..01aed49ac2a 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 1bbc5e7edba..31e8c09be56 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 dc1dfe5e9bd..f9517b8c00a 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 5dac9131fb0..d60c1bf91e9 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 53c1d3e0b8f..4fb7efbf52c 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 f0dd8a79e5b..3fa5fb59dd0 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 931fa295962..cf26729c63b 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 2d942bbc6a2..aaf67ffe8ca 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 eb354821d3d..507b7c164b9 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 8289be66d59..d7e64cdbf8b 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 c7a690de6e2..086f2032d85 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 bc8669086b1..28206deade7 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 45d0296b668..932dcf80a0f 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 f8d018e1b1e..1bd753fcbdc 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 5b85611d5b7..ebc980860de 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 12715a97ebe..f77b7c18a09 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 8ddb5e61295..aa1835d13fa 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 5f5acfe7ccf..4dd50811ab0 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 64f3dd000c4..dd97a1e4858 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 12f94250402..aa66e0b2aa8 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 4e7ceb3846c..ccb2f2054ce 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 6c02b339541..6a87ebe5167 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 a4366cb5dc7..d1bb6e48b50 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 79bcba3388f..172c6b26ad0 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 249b47f9f59..1a281a0161d 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 10d6f73e56f..8daac5abd50 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 a4077ed630e..bbd5d6f6a82 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 62383e43e36..9a543d20558 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 f344c47365d..68b8ea06867 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 f4b90cc35c7..59b9a9448a7 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 f006832b5be..9a4aa3e80b0 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 fc522a1a263..f567173702f 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 3c7fb00056e..581b9886329 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 59f9b7be031..63bfc613d11 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 b9bfa2a3b41..35fbd15598c 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 44377ce3021..06f5c6f4c8e 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 2fa1dfc9f4b..bec6897ed34 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 6e9443af5e8..8f9b5a16516 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 f7773f13db8..0ac6edee190 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 27b6335c6f9..eed200f12cb 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 637a430a1f8..e87ce684ac6 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 04d5c01e03e..a43b2dd19e9 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 b390f2dab44..cdab9ab2b31 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 85f71d74434..488692028bf 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 1adad3825a3..74912d710f9 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 37f5ef0e76a..50e8242c264 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 490026b366d..1ed4b842b07 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 04aec33b5d6..b4378620b14 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 431c0e16e7d..e041048a043 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 e72e99242c1..23205426c87 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 20f21df5ac8..5c55feb0efd 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 bc68c3ec822..a8a162e55df 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 3663ff0114c..434a86a634a 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 e56d41d4f1a..77067ab1c92 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 88c9709147f..30384a1a372 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 d18d8bc8280..d86d0eb35e2 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 003a3db8bf1..d6a474f70f3 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 c907a6bafd9..79d0b591ef1 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 c422c1768a7..213a1c19ba8 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 15847cdadc9..0cd170cfd7d 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 a9d3c8dca79..3ed0fbc8504 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 41fafa5763b..1a253b18f1b 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 daab68f1111..efb3f5deda8 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 0a6fb793628..8c5791b0ed1 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 2b2cac02737..31fbeb84f66 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 30c534b18e0..8d5cec07df7 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 a4cbecc5818..f850c61bc99 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 4495dee078d..adfccab84c3 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 82160a4295f..e6381bc4376 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 b9763b61fcc..976c744e96b 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 1dcf264b3f6..10d5a7023f4 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 0b3d23bfa3b..f516da66d62 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 03f265f2719..3464e03e56c 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 3e27c340808..d32e17ce6a9 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 f46e74a35bc..900b97c3222 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 f895d282902..fcec44ea3a3 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 6874256e5fe..27924873597 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 a8c238a60b0..a779d8fbe05 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 59396e3a440..525bc38bd03 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 1175597908e..3afe70f570b 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 c6b92e83089..5af610a48a4 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 c93ae906a46..1f984054311 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 e53a91bcb03..41a27d72204 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 85bfc7297ee..1200bb174df 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 d19091e75e8..256b21f56c3 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 a7ad17e6bd5..dd420fc08f2 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 44d814b9db2..f2835c18036 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 d66e0eb6d7d..64179ade0e1 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 c51a69356a1..e124e632cfc 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 4c0cd317d48..72de59dafdb 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 6e7411f28b9..49fdfa21cbd 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 e31f473c26f..e143dd3302f 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 35e7e24c926..8846d85233b 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 0f74841fd7b..2ecc8c3a795 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 dadd38c24ae..3896bca3857 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 bd0e947f1dc..ffdd320ed16 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 5fd36f7a9fb..1caf8c0d41f 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 0a85aaa9d15..2a61daf25c2 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 fb9eead7d2c..433f3185642 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 3e870448659..6c9242872b1 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 75fcb2088a5..1ed03922821 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 b3d1b9a71cf..8780c8160f6 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 cc338a82e16..f749fb21d8f 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 3b23ba5eee5..95043a6e9b4 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 eb487681838..39ed17bcef9 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 9842ae67a4b..a633e68e798 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 677762c2930..eb8969254c9 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 0045b08cec8..936cb10ce2a 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 089435dee3f..71e09774f09 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 b5a865b5ccd..3adc8dc3b30 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 3f10f2eb37b..c3bb9b1b7b3 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 8604dda565a..c60247a6e5b 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 2610fe156aa..3c8a87902cf 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 7779c6e40a0..9bffbed2d91 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 e652ccc966b..efa2e69124a 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 ef1a8fb5e31..1b1099f509a 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 5f69c1236b7..3eb56a46021 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 b65df092b32..1fd25f69efc 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 1d7c2ea4023..df493fca339 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 5fbfba547d9..9c2197ba443 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 ad19b589d5d..37b580369da 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 06723a4bd12..965a21b892e 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 7de81bfee98..0ede723702b 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 2c9acc227bd..c392b228e89 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 b25241e34db..5ba05b639e8 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 f53d4d413e0..41634ec4d23 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 8effcc6ab16..648ab7824e9 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 b1d0fda94b5..1dd99a1572d 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 f4b95081a10..6e77b882211 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 12ba7670355..88286d42815 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 f7ce9a67f54..5b714dcd6a4 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 296159f2e5a..9679e19fabf 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 f79a9f5d739..11a0eb5ce2e 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 b118783cd3c..53d7bc89e89 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 840cbdf234f..cebd8ffcd2c 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 ad8f978bc59..ee7b32d7030 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 960198eb04e..fecd6608d4b 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 7b90a5c5caa..e46aec17902 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 ae2b2177712..34cf0a4f951 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 2d1dcad2174..eb87d9de8a7 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 aab8edbe44a..a293b4297fd 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 19bfc36e424..72b2aaf868a 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 78df911c868..d0bcc4f61f4 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 f34a21b7897..d47cedda6a6 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 488a09c3768..7e0d87fa3e1 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 434fdd2220a..9ec47e600a0 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 86c68a4cfb9..8bae8adaeeb 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 4dcfda52753..216ba66d20b 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 b33bde95aec..abf5f100fd7 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 8e205bef437..ad1a304dcfc 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 3a927a70e61..23b0e19c2aa 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 f99efa91c61..147075c19f3 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 c21e76a6eee..80955fa9e32 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 17c550636e1..929fcf40887 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 9bb36f00ba6..639633dc14c 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 f2012615267..1f77f9e7743 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 20b3fbe21eb..c5df2742338 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 891564ea4ec..ac6a232db3f 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 1e0c8c3e9ae..5fa28a09e7c 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 2aacd9a4bab..a43e5f7ced5 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 cc86f0a1b45..0f00578a96e 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 c0ee3bc7d5a..67024c06635 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 b47fd213ae0..af4ae8a2900 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 57484e84d9f..75f58fef9bb 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 6f03fecd58a..2337638a89a 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 1adbbe39f38..53b138535a1 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 d3918269d13..06f55e3dcfc 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 10c1666074c..c425e515f55 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 0dcc0f029c2..291e78095dc 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 badd381f2be..40972b3b93f 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 2ceb78ddde8..928e9899dbc 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 4f48187b49b..1688e3cb262 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 31e5f9894f9..63d52f53b9c 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 011060694a7..728a0d7ee62 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 dfa463fb148..dff49298166 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 4bd26876ac6..87779947d9e 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 13142fee513..11bf6161646 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 28326d97142..485c453777a 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 f6e46e25985..55a48f1df1a 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 46a574bdf8a..4f35153669e 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 ff0a8238d49..03bcb57aae5 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 385fc128b3b..73fb9b3722a 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 c22b02fd7ed..6a28fe831c1 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 9f9b121a7c2..5133b66cd1a 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 c8a5fb4481b..2103b6c38a0 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 ab061ee1a80..f0350e81016 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 1d08296007a..0c685c3020e 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 553360d8da6..bc4e518b1f3 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 a16c60128c1..442c5736c16 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 d1c3ed767ce..715937b678e 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 5bb98effb9f..c247654c7ee 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 64ca6da10ac..7161f3b5d44 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 993a191ef89..be4faf69a43 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 d4e6e360c23..ffb8ae30d3d 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 5c2fd47068d..1cac51a8393 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 f4e77752936..3a00a7b36ad 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 70a5c8707ce..a879b74fd80 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 00054dbc51e..b35ebcd587b 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 8d10e63c609..7d0691169c5 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 60848bea459..3021d70024a 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 4b88151f3d6..ff079e03122 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 392c06390aa..ac628f7b012 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 6cd2ab7d7bf..25ce58b97f5 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 4dd86965bfd..7db4f98d7b3 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 e5ace2e0d1d..7d7d3688e6f 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 b89296616b3..a7009c5ebc6 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 70be5180572..826e7288bad 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 dea7dd9bb24..48efffbb7ee 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 0987e11430b..eb90c5ea04c 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 fac6458c5b8..f77038cb8b6 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 f2d9441e48a..5d742100cfc 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 e98df7466ff..5358c356523 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 6d4d83192c7..c5b98770d62 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 b0d1d7dc3fb..1c48ceea5ff 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 da5d5e0ab89..6523d44639f 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 549cd00e8e0..29afed9c438 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 20ae78ae316..645c09105b8 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 824f7c3fb50..7f6b8b97666 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 e1cecbe35d9..c8c356e4a91 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 cfe1d347b0c..7b1040ba5d8 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 3e7105e8cb3..c7a55288057 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 ec2dc294500..24ea5ce4f58 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 b54b5520943..0c070f322a3 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 e494a6b34df..4a51f553726 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 5bcd39efd20..1140ad1ed8f 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 099d1978436..19dde27a164 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 8aacc8e165d..c5f01b15547 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 2978d2bbbe6..574c9f767e8 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 96d4991a5b8..c0cae40420e 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 9efacaf163f..4eec6bc1481 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 c758e9cc20d..c3c273c777d 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 7b237aecdab..c452b53bef9 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 3d479543231..94aebf87021 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 322c7e2f4c6..70d07ba36fc 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 b70fc8f05ec..71b5505ebd2 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 69f071bf5d8..ed7dca2f487 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 50c753538c7..1683d00b430 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 02716a96a73..963c23e4062 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 b584d18e8bf..2470fc975da 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 6d8b6b4b44c..c734a9ccfe0 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 33b93348300..49f910154c4 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 7360908a11d..7e320fbe9f8 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 e44e818ea60..d672f73d77a 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 e0ab5cddbda..45dfbbf8bfd 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 c65a5277f62..6fb23ac800c 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 3c15eecf6e1..4254aa260be 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 6ec35452e8b..c650796f23f 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 d4f87905da9..912d3e4b7b4 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 b1909ca2ec0..bca0eeec380 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 1d2331870e1..db174f049b8 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 59e402080f3..eb4a68c902a 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 20b209752eb..4794b5acc44 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 8223616f11e..9d69030da7b 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 eb994289a62..8cfd35b6c60 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 a99011cf8b1..f3a084e7545 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 67f6daa8469..b7639223f51 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 7f0566ddd42..a21ee3a53b3 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 53ca9a39015..53645196388 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 69bb1f13c84..0f19738748c 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 8837e501a8a..d42001f629a 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 e12789dcb40..148d344eaea 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 30494295f0e..20013168c81 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 995d6779238..a00780eb54f 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 a2816fa92f0..e70a463dcd6 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 33cd20dc9c9..498d927ffb8 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 479f6c6a97c..ff0dadf8c57 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 41393acb26b..d37ef1b014c 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 aa7977f5bfe..4dcd1d485c3 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 b4b721b7ff9..0c57e09b09b 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 c0311b0f198..938d6f2aad8 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 cc16ebc70c4..39283a733e8 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 d9fdc8f91c2..4b58e4f9fb6 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 25ad45dddaa..569d4581c10 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 d2b9a1b1761..eeeee01bcff 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 f7c14970982..02df0946bef 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 fa98029f6b0..3b4f99c6a9f 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 4b8371fc748..8056e4ad5c3 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 c2a7579e4fc..894bdb6dab2 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 605bb0d250b..2b7d7c17269 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 0919e211617..d9d9a90386e 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 206bd05a345..f7d36fc4aa9 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 7aedd80b5d0..fd3e8189af1 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 0e724d62bbe..07aee5dd625 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 c60294e21d5..d404c85a90d 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 61ff5ac5fe2..3817766103c 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 0487434274c..c7b7857a86b 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 c7f1af21f22..e35e02de479 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 2f47fcddf28..a3437c0100f 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 f8ae990d364..6c7acc9889f 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 ff3e2dea2cd..aafc2bf1a9b 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 da375563d91..6884739e818 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 9a4dd424bee..4465c4f88a8 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 78905da208e..e7154eab4b5 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 82166a1aaaf..3bb9119a036 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 0954f3ff4f9..787aade5de7 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 1ba33b0e6ee..cd75b53bce2 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 cdde0f12d78..96ac18a3c02 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 f155e8fd1c1..c21a0f65789 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 4c2b6268eec..4165e254658 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 c6a960f1a68..6925307e258 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 44746468b35..195cc641405 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 a52d101a486..a02b97ea047 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 8d7ac01c55a..f75445e66d1 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 19bc69b77fd..0d047af61ac 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 a346753aeb3..cd54a593399 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 c5f2b4a2a02..faa0284891b 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 c35d1eacf23..14fcfcd8f1e 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 9f6ae9a09bf..1921dbdf1dc 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 9f012c1c405..30c4dfa4a38 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 4ad17ecaa36..7f08dbcaee4 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 f6b3d855679..732c8bbc98e 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 d99c31d2d63..3d894048d01 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 297ec922abf..151214011f8 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 1a5c63f10f8..ea06e4158e9 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 606f6f96375..1d16002e294 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 17e4f7b8ef2..2613b66eea2 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 6e3a06ac662..db95d808fe4 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 c7c9e2033ef..fab87f065f3 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 c2d7e0bd983..13b70516cc4 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 16b192d16a1..88aebcdffd1 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 201e9afec4b..be95e0e73ad 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 5f28f4bde40..f73ca791153 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 53c248fe179..1e1312b096b 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 260dbc4021a..76afc8c3373 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 f5476f73edb..7e1f32135d7 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 c00c19be42a..41340856a6b 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 a4ab9123b48..494a7217de2 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 b16213bfbf8..02360d9a7d6 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 48a2ff233da..299f50a6780 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 6a5074c6e4a..eb04cdcf9fb 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 6bad10ed067..5362594e4eb 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 de54ddb3bf3..5d4bd86cc6b 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 ddc91ae2266..125ea33a0e6 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 16a1b19ff8e..05be972a510 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 e65286b5c64..52f89dc460b 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 253dedb7c4d..0e2cac536b5 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 5dd64364c10..33a49773c1d 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 ccd260cb1cf..ef2d27ccb80 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 8b1c413b205..09fd044a1fa 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 2b5b168817f..a0f03689a21 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 ba6ee67624c..5c717391c74 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 744a8e10c22..14e5b5cbb9d 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 961311d7304..2ddeb89d6b8 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 00b9374459c..aec784bca4a 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 3f69f9803a4..c37f8ac9dc9 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 a3e755fa790..422dbc94aa1 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 4866ace08d6..7850a0cb0b2 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 fa2f2e55744..1de7280fe54 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 09083742310..53a59c63d92 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 aedfc0c0f40..3b96ff44c28 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 c76064c0ab6..65b36418d2f 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 5e2f35bfea8..c7ecdd85e20 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 0aa75438f7b..dc48222b5f9 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 5b37bde3ee3..70d4247f40d 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 a5456c7b0cd..ef90886054f 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 a1e1c20cbc5..ae5c6ecb1d3 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 26ff4b9dcf5..d3e6fabb2de 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 4972c3d3ff7..8cc1c6ed450 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 698be68bd78..593f41e0e15 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 97971b99e9f..7a36a49f498 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 73d840bdbd3..0ce1fd2eead 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 26bfa37d6be..8fe750b661d 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 db8d67eea75..5effa2b9627 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 c0a515bb741..80ce76009af 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 ea78f0d0d5d..57b177c0572 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 0647f2ecfb8..d607343fe20 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 d14a2775c15..22a0d636415 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 8c8e30fe067..853b3527c9d 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 e2a7f94b3d8..d54bce408d5 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 aa2b4142616..aa4c31d0ae1 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 146088b4eff..abe05d9c37d 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 c9e6f046d8a..81d907c4824 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 49d1a82a753..44419d333ce 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 e317741a0a2..80f2612bfdc 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 19a07a19c68..2425a37207d 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 d81fdc804ac..8b6ceb83f58 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 e1a2517e4d7..c017f0a93d7 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 14c8c8e4e2f..9dc7b767e21 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 61cd4690179..60c38947336 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 8bc26c300e0..0469853fd70 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 0aa3c90eff0..3ee3f7a24f3 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 6e642b85933..5db8cf1fe6b 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 fe0e7d07572..c111234ed37 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 3ba3207cc24..ef1dd82f342 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 9c65891d261..636a2dd8694 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 4e45568ae68..f9e45c8af8c 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 b0869df14b1..f55a5d4ffa4 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 6887eddde66..6ee3355dfed 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 fc5b81b6591..72c0717d85b 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 dd5592884be..85159952476 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 935693f87c1..c2a8ac510db 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 683105db868..90b0574cb2d 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 979ed3cd71f..d4aa6099d0a 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 091ea9bc352..107657e9cfe 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 0e0c735eb89..3b0e2d4b9ef 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 a5b66156389..e5e5c2439ad 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 dae4b24de47..a5fdd0a5b1d 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 46096bbe631..3d88caa84f5 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 4d09e697150..4f2c6fb52d4 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 8c4c45f9c89..d8a4c453015 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 659b11ae98a..132d4f116cc 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 077956287b3..8e00d0bfe2d 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 3c4ec66e9a3..41ee9b50479 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 d6faf60d618..c93c6823e46 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 9c8083a1d94..7bf28893252 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 74e6b4926ef..1560b7c8996 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 9188b1f6b08..2e913abf64c 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 e3bef7270e5..d0218da5b2b 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 2fe38659fad..ad11a9b72df 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 206702eb593..e9aa35f5d24 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 9e91de08307..d96a34454db 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 e18541fcab9..e29c103de9e 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 dd7ae5f72cb..1025bedcf7d 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 128db247150..d2b7e6cd792 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 efb966880eb..62b767524a5 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 883bb042822..57c1d1a8d91 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 077956287b3..8e00d0bfe2d 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 80188b637f9..0061b9f6166 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 e9f7aeb36d4..bf8c63c571b 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 8610351f43b..f51ab3954a5 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 58028d1caae..c3cf8fd8df6 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 dcbffdcebd0..01ab34b1e22 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 3f6c634f38f..6be48c3a2e2 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 4a900097b14..07f90ed2d0a 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 18ffda135ee..bf6331c72b7 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 ae2e4e03f74..bad6552e178 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 38a12e7411a..5cae304942a 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 afd4fedc97e..9bc3db4e6f5 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 987c54955f2..a98a23c7f0b 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 934849549e7..da52ef752b3 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 e786e5ae843..bda9013f654 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 5ee001db3c5..3cd84f50b70 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 5813d9488f0..88d01439dc4 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 c2c5042e295..a1905d3d87a 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 283594a45b5..4ae14e28add 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 731371cada9..09303c4d952 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 8e5c46692a0..dc7036f8e26 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 9d2cf692006..264b3be1679 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 798ae93d33b..5184c27d59b 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 6240f074cfc..25c8bc48dc5 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 77efc04b817..5a8f41fce6e 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 d38b9abb70b..a9e779c8aad 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 5a83b5cd732..4de52c75d2f 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 282715ebb3b..455fcf2d4a3 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 28e9102aafd..46409ea5c96 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 5a605ed8987..ec982acc071 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 0de30f0f3da..a02d1d713e2 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 8cfedf31673..ba64432f93a 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 70d2c6ef6bc..99849ee9326 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 ad2d37524c5..9f36352003f 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 e2f72db7c4d..acaef8e3884 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 977b69576de..d9d485abb10 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 d47f0dfb501..a527f2efaeb 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 acb8b51a44c..ae4158bbc3a 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 d6a43fc790b..805a3eccd2c 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 46b99e6651a..5ade982afb5 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 4931fcaf94c..301a83c5e21 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 5165fec9d90..ef01256607e 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 6e89d425934..04600d8dd8e 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 c5614e17034..009048775fe 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 7d8280998fe..a45b0780856 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 00b9881fd97..9b2bebe4d0d 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 d7261732431..5c1e3fbf820 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 267b4e79137..410585d02dc 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 1f9aa1a324e..c780f92dcdf 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 2ddeb9a4b33..fead941a76d 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 96d4ee90407..84b1c6f383a 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 2dcfcde7404..14b67fda8a2 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 e8cba56a0a0..51b5cefd7f1 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 10d51832964..e65c05ab90f 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 de36336f2c4..ec51c7bcaa0 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 284907b2756..e517f81ce5d 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 ede4601928e..f3447565c0a 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 454ad3ac090..dabbca15fdd 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 5d88ded9db5..6742038830c 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 5f1f2fb60f0..c4f01461d6e 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 ab556519e07..7cdb01eef90 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 459eaacac4d..b7ce182dea1 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 ad1788e0bd4..d6fbeb4cbbd 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 2357aaaa86d..ea43c2eca2f 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 b6bdbc8b2c0..7fb1e4753c9 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 97d3056f60c..b484370a160 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 1ac04024932..72224eead48 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 249fd6d0ae2..5cb035dc622 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 f7bd64bc410..25104165f57 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 3a66a1e11a0..893cf540812 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 c3cc412d792..f85226ef50e 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 91e34e82903..1ba0877993d 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 f5e5907f2c4..45493bd79a0 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 492654c660c..c5640be83a9 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 a163891c042..c6020fa1d80 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 8dc7c3bc20e..7caf8d483ca 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 e0b3b667de3..3319539b766 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 89922b66f03..b1d656dc4d2 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 9ccca663fe5..3c30d0f3521 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 b8c014c3dc9..8d19882bb70 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 b9f716e8d3e..0abdd92f841 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 336877fda13..db42824b455 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 fa04c00c7a2..bde3e2099af 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 5bb4029dfcc..940fb127c54 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 4d92fbfd77c..7cef08a0e50 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 a09db3b02c3..b1551bf364e 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 26a55aa4ed8..cb0dedc6d20 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 b80d9bee4e2..ffe751bd02c 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 9dc3d88322c..9b0e0a81995 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 4a5bace5928..82de0a6bfea 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 5293ad2a1fe..2643e53db4c 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 9f82b1a7b1f..0bf1271e394 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 c90416b0619..db4b9649e3c 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 79c621ce125..2f2efcd6bae 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 5498624a061..559d95e05a5 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 91593b26511..b491faec9ae 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 c6e075683ad..cffa27defc6 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 979441f7288..b51e0bf55f6 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 eaf7601be9c..a45936716c8 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 6af3c9b063b..86ee2099b32 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 4f90cf71cbc..d4543a2ad65 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 7e632c8dd62..d06c9b64baa 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 cb2fe821297..705d907f592 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 c2c952d69fe..5d52e28104a 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 7448100158e..21f0c84e1b8 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 1c7b4e69ec6..cfb0880f6b9 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 a1545bd6575..16fbdd8099a 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 a0da84fd098..9266e134715 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 3ace7783f8b..04cd775f0aa 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 64069d4e756..11517e2cdc9 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 ccbc849ab58..ef37d210662 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 a79c2e0caf2..2d381f81f4b 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 34dd01d06b6..d9db35c07cc 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 f411c06a3e1..6447af84ce1 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 ef9c7a40b61..49d7e1e23e7 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 86d9fe877af..0d7cfecfb86 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 b0d721891c0..d5864315d82 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 f3b7f4d6d24..139dc8bf3a0 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 2b2269bee5f..8438caf251f 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 7e035264215..588700dd306 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 e51a099ba2a..ac8476824af 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 02354204f24..d56b7a333af 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 58401a33d14..5498ea9745d 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 32acc488dc6..d4ab3aba471 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 08a55d26cae..2c02b2aa2ce 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 e6017339b73..61711b5d3c4 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 512d0285ac5..25245dbb44f 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 68cf7ff847e..145c2fb440f 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 947425e4807..b76d96cc463 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 b7d2d6c8f1b..3233430d8ad 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 067b305b80c..cae763b42c2 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 3af9ab00728..be9de9cc943 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 08be66a8963..5f018605d5a 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 98345b022f2..09102bbb4ab 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 032dd606cbd..0e5920c384e 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 f82c8325828..edba5dc17a3 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 5181c37969a..c69ffec899a 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 c3f2601eb99..87eb9762765 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 2bb3bb4833e..7ecdd132bb9 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 ba28d973ec3..561d7418aff 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 75081c62d41..71150762e61 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 61b4953c17c..f3331e450b4 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 e8ef5bd31bc..2c0f9c185d0 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 d83ee576768..621aee364ad 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 99143f38c98..e364be3b021 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 2553e2d5e86..b7798bda7f4 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 64fdc7516ea..e918bb28cb2 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 905ec3ce2bf..96c9b6ef681 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 f897c673432..e1508bb06ae 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 96a264fa6b2..f6b52394eee 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 255b2efc91a..cbadc37a6c1 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 b4f940bc66b..2768a7ed85a 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 2f3ec6db13d..a6992289200 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 2e033280e46..6936dc7f56f 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 a23502729d6..8624bfc7639 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 c78905b09c8..a0ca32c0d88 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 ae32d43f1b6..403ea8f0c4b 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 d6a06ea9fac..16a843202ab 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 e5f88b5384e..f12ff5bd94c 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 d5c93c33993..e0716dd707c 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 12827082104..5b62cd46235 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 34f1d850a63..d2e0a2418a4 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 492bf9010dd..7bd4c366c76 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 a935e209bb4..591c4677fbd 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 bc9375d807d..2eec5575ce0 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 908394bcfd8..a5f9fba3cf2 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 e7901ba51bc..65a50f70e72 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 cc5239eaf3c..68da33e3047 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 9c4a3a19067..75385aa8a6e 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 2097d094a3a..e157b8fec56 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 83e56a52c6c..72a60759aeb 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 13d2553b0c7..142a87c9071 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 5bddb534146..c1efff6fa34 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 532c08a9687..b33163d99ed 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 6dba7e9af89..723261e164c 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 67418f616ad..ee362f9aa72 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 78c825398d6..7f7534192cf 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 b4c10bec367..6a1b1059380 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 5654edb08f4..e9f6476f072 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 6e084d1a9d2..b9f4c41692e 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 77b3bac8032..0a71a623b29 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 62da10e1c96..ebeb37c991f 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 9a4a710e522..0681172165c 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 a868f9666c5..69dd4717ec2 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 6ebe598e882..8c49004aefe 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 4880e065fa2..d4b784046f8 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 611428432ee..c5f291289ee 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 cc2154ad9d0..b21164458aa 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 c0396ccb182..6c3e379c1e9 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 7e1df67811c..d687518ad30 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 20fcd202ed9..c81c03bd710 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 a798de0530f..5d29b267fa2 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 9d4b84e9ecd..383a7d4263c 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 7a78029c379..c57ad99bf0f 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 a33e892c6ec..3edda00dc1c 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 a00a130bfca..9feb3950660 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 aa249f184ce..2b2f92ebdba 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 6f22d2c585a..5306d17ea2b 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 2427a7ae50d..2a2a194c166 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 82b614a8e17..26cce0fe770 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 3aea4075456..69d250ad6f1 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 b013fb3bd8d..80a11e4f16d 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 23894b20c9c..aa71441b8cd 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 d9f9b474f9c..3ef9309c963 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 d5ea8d0bc4c..7ad755226a5 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 1e80c86e862..a69c443c888 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 ff3c150886d..3aef44f1202 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 d48b6ff13d9..1e9eab323d4 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 3752b23bbe3..6df2a846c8c 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 ff8cfd97b24..63420c805ba 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 052557408d8..fc12bb2d1bc 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 8fb63ff18c7..1068dead9c8 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 c89a251b670..86116ef6845 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 a90f7ff989c..0221c2f02a8 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 3528f1c1e45..fba9ff9e13d 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 4fdef0a987e..6e691c84031 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 c53f538799f..a91681736fb 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 25db0ecef81..ebbae39b07b 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 26ec0951d88..b348b03f2ac 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 123b03d95a8..1363c39d8b8 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 23a4c98a54c..5d254874c51 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 2ca31ca1895..b6fa617b808 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 2104ad90607..b1571ae7516 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 90fa5253a61..2bb0cccc281 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 0b0bd45b7d6..77eb3f8a437 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 0296d079938..1f3ae163c76 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 d6c831d5a0e..807314ad06c 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 5135eb33c9f..e4590d8f9e6 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 406250cd77c..4b825f1dfd3 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 8e455023f2a..4be8656a3b1 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 1f2a96fe5b4..bda554b39cc 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 4d7ef918ddc..34c49f13b9e 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 bf3c059f81a..cd829c3f129 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 2393908e281..cb6285e479e 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 7209bdfefd5..17be05d9ff8 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 7f8a2f2a098..909116d8faf 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 d7c1d9ba9de..f5c066ae4c8 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 577f3475b58..afb9258cddc 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 b0befa80fd4..955507c447e 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 822447f353d..f1cb6881a95 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 0ea648256d3..42396486277 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 9f676e2acc7..58e86a3d228 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 333a295ad06..826a6c4bd0d 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 2912b7d7300..0ab768ae7b8 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 9cecf3081b6..b60748ad84c 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 3906f96a39f..04db56d126a 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 221d2a7a86b..59875cbe61e 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 1eb3b71c942..96e037ce72f 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 ecd7f17c84b..ced6f034400 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 b00c1b2e3e3..6b97a4c94bc 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 701ccf2612c..244284995ed 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 3a5f5e7b409..617ee8bf51c 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 46d75a6b73b..50c1bd8b430 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 d6c86e9ac1f..435497933dd 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 8e81e9e52a1..a53a04a3cc4 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 e93da557ae8..4f392558d23 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 3e1d41be349..ed73bcf0618 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 b8b2b1fc0d8..4677c69a7ba 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 27951378295..45fb05b0108 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 97af0e8ed9b..ae77202ec82 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 931d2a5557c..00b5ec5d08c 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 3284b581f5f..bc53a164a5b 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 52b1ec33166..2639d90be2d 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 ac15a68bc4b..10f635d8d4d 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 19e71b5156f..c7a20a8abad 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 c5e104694d7..004fbc36c50 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 9ed3611da27..5522e08226a 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 759fd926bdc..3d0530c54ea 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 c1dd0462f94..73e1b48b342 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 01fd9ec721b..96172796a59 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 375a08d8a45..693079bcd9c 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 5ea3f682631..310cf325f01 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 cfc3c290afe..970d722fe4c 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 3ae97ab164a..02c4b631fff 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 6bcb737588a..fe50470f59d 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 2f7c4e5a902..6dc7f9f0517 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 f9152633706..1b0b909e5db 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 93412ca75f3..c73eafdc264 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 98529a33815..dc2cd72d3ac 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 fd0c543241b..89a3c8751b4 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 4428d7e1868..1f061414727 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 5d86a36b947..e9a5835e2d3 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 975c106a26f..ca2468ced7f 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 4dea652aa3f..8230edd5ca6 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 8f1f021caf6..7d4fbb76be7 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 f84225444d9..ef622bb6b37 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 6a1ff24ef2c..c9fcc2d150d 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 2bab2e43001..9e8d91a8874 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 3d1cbd41a34..2a6aaa2984a 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 ddca4c432fa..725ade01ae1 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 8d9cb92e315..4b5471bc08e 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 72255c695ac..102d1420d6d 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 9e8a293b4bf..e21eb422a64 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 2f526826d31..b9594f9ec86 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 f26234e84cf..6bbd3cee3ef 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 5dd0a7aeabf..3569cc21659 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 f16533312fa..8d437f90dcb 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 1dc5156f7e7..df7ce905074 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 6901ed22934..c3c6adcc218 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 f4e2a3b1ebc..5154a9c2762 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 48682f617a3..f482761309b 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 182f06c33c3..e9144a14e34 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 00661d3f0af..e75a1667ad5 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 029fc2526b2..eb691d13417 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 428e2b1f994..6067a6e62d9 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 b082ef78965..6dfebbd9b43 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 b60495e7f47..ffdd4bce796 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 cdcc7087d06..0394dd99ba7 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 60cc9843607..881b7d57c8e 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 d4bab0e417e..e9306d95918 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 04dbb953d0d..a997675accb 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 72a251ef9d0..514ae2bc020 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 c098d041598..c89058465e8 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 aa85bed1d13..e5620f25c88 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 5335bfd48ea..0d0ca241397 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 e36a6511aa3..603d4426ca3 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 2fd772c8619..6114f89afb1 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 93d028b0626..ed51d481487 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 d744de150d2..67038a0a591 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 a475518bd85..b6ec410584c 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 164cb13967b..44025b84755 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 6505229355c..c8fa12df5e0 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 dcbc40b4c71..338593ec0c6 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 a1cfd12e8cd..0514010ce52 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 81a98b9754f..f66fc97a4fc 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 9f91d37c233..cc499625cf8 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 c8b120b855a..ca0d1626b9b 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 6daa5b2657a..cced4f6314d 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 9a3ef350ab1..0d83b874a6b 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 e22ac763d56..52ddf089cf8 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 ab93d0bbef7..a240fe50d7f 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 768152084aa..a92b9016b3d 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 71ffdaf8509..cee47da4714 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 d8b461913da..23b5c7a70cb 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 de7c34ffc87..393c60bc807 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 aeceb80a063..397edebc9ce 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 7c49d6f15ee..4b303e4a5b9 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 8f05ad18df3..a6b9b147ee5 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 804ad9d67b1..64b9b97b2eb 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 3cd7ee56252..a489b21033b 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 7dff0d237fd..da640cfb94f 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 f1719f4bf30..d243dd162ac 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 5a067430906..a55e799fc25 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 8b2c7f49735..9f39e513c69 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 e2ee25882be..b439b089225 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 648ef0c5fbd..fdbb9a4ea88 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 dc10ffd6a0f..d902ec35efa 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 38aa1944fac..8d886f249fa 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 6aaff5f723f..b281d43794f 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 845a89c4775..2f146841311 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 a7d021066d5..a2563779023 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 d3a35a6c713..ac17b44d37b 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 75a116a3f9f..365be074a16 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 35e3cd5a08a..f2233607e6e 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 97d28db4cfb..84cf754b04b 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 0423401bf83..aa9be503733 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 d149fe9d779..461eda1a632 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 220da6fcbaf..8ed4adbe04d 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 8afbeb69925..1fbd0216cc4 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 9bc10220a9b..8c97176e0ea 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 c91fd798d64..985c02493b0 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 2f11bad696b..89e102d844a 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 232c7d16173..0ac2ea20955 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 d4996d492a5..d05eda99524 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 8e18b27f0de..4fcd6894246 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 6d807672398..53367773da9 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 844181b5b64..32a4ec76caf 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 a10508f8bbe..df4e97ab970 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 7be080d96a2..7944a8135d9 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 6913f2c91f1..55764fb1dc4 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 e205090d0cd..5adeaf2f0bb 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 e536234ffdb..fde79efe835 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 31f0fe2c0f0..6341001621b 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 fa04208cac9..16771d94470 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 58328d973fc..9c4042720f6 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 c52021806d8..529d497e62f 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 4cf4a7a72fb..dffbe942b15 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 a17ed15a546..c8cd52a169a 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 ee3ee24db70..6fd77448253 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 23157202469..302c4b9cbd0 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 4f42a16362b..907327ea26f 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 cd627cbe4ba..fada51c6ece 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 e277579ea23..b0458e22bce 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 a07b84077a9..e0feb85f174 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 d1ed6a36c35..0f8c0a86f84 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 e95938f1590..857958c0319 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 fb76f697cd5..be37c8c8244 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 fbcde2a6be1..bbca18fcfc0 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 c89f66fec1a..c55904286ec 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 25af1d5e18d..2c2bfb7abab 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 b240e122485..fc299883cf3 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 54dc85e7255..ee06d4802f7 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 816d281752d..c6e67d666c5 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 79a5fe1fba8..a9af04df80c 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 271e38147c3..ac45fd59633 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 e88012b8613..28f08120498 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 54c945a7a4b..c02c0abf8f2 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 e95f4743ae3..de3450c581a 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 37c0deb9c2d..652f16c67c8 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 899845fcc2e..616ee6d8593 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 a66ae603291..618743d07f1 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 8140e7df7dc..ce2f97e06a0 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 b4494a45ad2..0ccb9a8b957 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 7189bc53c16..143b2155ac1 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 5fa53384ff0..b8e0636b950 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 d276b0511b3..132914b74fe 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 1c61180726c..fd1b4f2dad4 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 28a497ef219..994cb8da5fe 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 6236421ffce..318ab6220d3 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 4f9570146f2..03a52485c23 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 654eb7675a8..90dd206046c 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 5b234c514a0..7202144aaa9 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 4a5e14196b0..808637328d0 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 3b1ab72f7d3..a7e989f1abf 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 ce766671763..d4afcb7a1c6 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 ea2b8cdc6c4..167f24d3794 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 4ff655856f9..8f56813cbb6 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 31a72fc0b9f..4e2e3eb72c0 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 c3c8770d2ad..e78930a9d3e 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 dd5b44bf035..50502ce40e8 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 abb7caf4183..a174aba2a1f 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 f17e48c2a78..f7d53f1449c 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 25fa4ef7e64..0bb393e3389 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 6f084a9d48b..bf8c7dfc0c6 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 4312bdba6ec..50f54a17706 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 b8cce4bd808..a667f2224f0 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 dbda456587e..e023916c420 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 e018ab7aa14..8acd3966bcd 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 87c6a989f52..be7f53ec637 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 55baf3b7f0e..2eb4e7f9014 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 4f54e11a112..413af8497b2 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 07de20e7a15..0cb2a37698b 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 4ba36fd3361..71735d70d9d 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 eaf930b9a2d..fc8c3aeaafb 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 e1e2ed49748..1f0b1b4754b 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 b3c82fdd8db..f8e2f981a44 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 e45c287f44f..e4a906e713d 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 7a9bf8639e2..d106a400bdc 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 45f7f8dcdb5..a2789f6c1a5 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 8a0243013d9..7bb24458f7d 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 25814e1359b..dce5ea993e4 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 247755d8e89..228d30b2c60 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 fb650bc7676..aedbdb99809 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 8416f74e086..365a5ec232f 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 86561f89d2b..5d49f0f43c1 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 989526c8e09..c1011c29042 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 21b9cbdf755..ce1a92a8957 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 0bbf39315d9..f25c034e982 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 3559fcc6b2b..3583df79401 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 86b72665b71..dece8693da9 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 c54ae6e3e16..c9c67d1f0fe 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 c12004236bd..581e63a15ef 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 3c57e7b6bb0..23b299a9390 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 ea8fd9c10de..db2f7336f19 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 a345c05311c..5ebc1747f31 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 c367873cbc9..133c92f78d9 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 41db9de34a6..955b7081c6b 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 eacf5fc445a..98e2af15c89 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 4f495e670f1..eb052f4b9c5 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 db4ecc9ee4f..a054daab118 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 8556f60016f..12d9edeb42a 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 4d3ed384d75..90be81c68bc 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 ec89856496c..8e5f5cca27d 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 b7560ed40ce..68a77191b9c 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 14bc601214e..d4d0f0fba83 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 d30f9e5ad4b..87a6da7b09e 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 736234e92da..d08f9617975 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 2a75d11a9ec..2177c281468 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 73628c8646e..27f8eb25795 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 99e7574e4b2..571c9f59d66 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 941ed18660e..5ea3fadf430 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 50fa4b5866f..5130b3f9f64 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 d5615815dc7..140f3dd9e4e 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 391d0aee191..559aecbcd84 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 3043ec6ec37..ef6b051dec0 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 26b0bcb7fd2..37788b1e056 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 4846f0180f1..0d0188128c3 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 e04e73aef24..05da161730c 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 dc17289c0e3..f8d74363076 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 e6b55b12c53..199fdcd0c80 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 8c4c45f9c89..d8a4c453015 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 57989a346fa..ebc6f80f70d 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 7acbb718d17..9eab7eff5ac 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 64edf9e93ce..9334b572304 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 61f49cd5da0..44faede8444 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 3a4b705e7c9..553662de610 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 636568b96d3..4c9a9830bb6 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 c884226174b..dc1e3617709 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 39b85754c18..9df04019e6c 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 500862039a2..daec97603e6 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 cf448bb35e7..8d0304e883e 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 60a3eb65ca9..d75bf7e0533 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 8a154101b65..4f94c67d12b 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 4e8c0b23bdc..5297ac3263b 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 3cd7b003f66..f75e55b102d 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 7f777f42b6d..8d472c811c7 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 b96a358f2f0..5ab9a2b060a 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 dc26862f5ea..fffe08d20ce 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 58f86f5474e..7b244a681ea 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 b55c6d00683..a1ac11c17fc 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 4335b7d1674..2efbf376648 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 42170910d14..33336623be3 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 9fdf442c5ff..b8a8fc3e348 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 756eb07189a..9cdea36d208 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 be3915c464f..4af3f8dcc70 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 9f19d22d939..b60e3c4e955 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 d40c872e300..19382fadb47 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 3f33dd6c67a..c1d04ccebe5 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 5ea970d9fb3..ea811dac998 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 f315cf549fb..2ec7dfa7670 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 9abdafafa93..41072b29660 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 d038ed4157f..bbe9a31a7cc 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 721f891219d..ba5d2fbf007 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 82ec7f168fa..8dc744fad09 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 996c6c68eae..c317e5bb464 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 0825fdfdc79..389a306a538 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 c477557e7ba..ec8790d26f4 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 63de8699f35..eb361bcdb29 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 8fec2890881..82400e48f8b 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 57e717429c4..d962d259a1c 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 9d69a3ece50..62f2e05e158 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 7e39574d492..0804fb59dfb 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 23f0bca1087..d7c7da341e2 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 9994e527f01..b621bedfd17 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 f3e3dafcba4..cde5e827b16 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 e360c16d69c..39b350e0e20 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 b7e3a18bdae..ecec03f6ed4 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 5f5fe375117..b3218f473d9 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 98e5a7eb352..17686771cd5 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 35da44a9680..80f287cabbf 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 c34fb331ceb..20860d104ed 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 5288c84e44b..9bef8c10e38 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 2047bce5b17..a0199c3819d 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 24124e6fb35..d2fbb03c919 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 005edb82b59..66eebbf7c79 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 bda92cc7fe3..0aeca50a0ab 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 c6dcaed91f8..c2871984d97 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 836c6b514c2..1aea820987c 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 653cc0b3f04..20acbb6ab7c 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 5fdd9a6095e..767e73d3ed7 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 daabbe77ea7..90f01a0d821 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 ae80d218786..c6f600ef5da 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 84dbcf5b503..8860d0d0904 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 a294518a777..918a3b849d9 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 7a768c1ed21..3b83ce40836 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 1c78180e2a8..4df9b3ef11c 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 b6e73a5e209..04b3a1ed083 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 63b1c613505..755ce131b2d 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 6b139fa6e66..ed75e5b1f04 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 1ccd8c86bdc..359f3250f60 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 b729b368c37..96dddf9ba31 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 ad2f19b0668..36fee5bb366 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 8d0594629f7..7c5eab0fa5f 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 ae24ba70419..8a841ce0575 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 93ab9a4bf51..8b502fd37ee 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 e33b50f1938..dbd1c8fd7db 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 c848684ab59..da4daa0fa57 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 b5d2eabd507..bfa3ad3834a 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 f45ea87f972..70f155cebf3 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 302ef3f2b39..d9f369a6406 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 fb9ffaad9c0..3a946a22299 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 5f790c02a40..ee74ca27501 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 41627cc6ab0..04941b76270 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 5abe6164038..13d8dc69fd5 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 89648180246..705bea205c6 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 0e61657f615..6d73fbba8dd 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 2767c504b78..b346e92c217 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 6c2f739b94c..75cf013e696 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 adbc63b8157..8b56d89b74d 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 4b82319be62..c89411168dd 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 f0ce00ca7ec..d3ec784e3f9 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 21012de756b..6ec527da6c6 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 a98f24a9651..f7cfce0fd61 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 01db5835907..6b02df2045a 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 fd2b3114d4d..93194bdcab3 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 74c0b8a8f54..a3f4861ea89 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 e7ba18d393a..d2e8c68d85f 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 e228abeecd9..700a062b8c3 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 f6ef9e703af..0830995a6a8 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 a80fc19406e..7e73d5873fc 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 4024d1d0cef..536a3a137c6 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 f9fa46b6667..60a6a269575 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 7e9ec8ddd97..a84b260dbf3 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 131303354e7..2f8562da23f 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 31fc3e513c1..d018a59ebae 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 ee9a67b243b..94b0b467c83 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 63997b7960a..f31cff7d747 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 4163b393086..5b72d9a2019 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 fe9a611f115..d524e1a770c 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 4d39dec3662..def09ea4b69 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 bbdec393ab0..525b5b00fa8 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 92217c51c04..3b835faa2b5 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 5ba5d232bfc..baec16255ee 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 9acfbb4bf67..959621e364c 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 7508612580d..c208eb3295c 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 1a00570d324..8b1beebdc7d 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 c1392fdd077..6128361f85f 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 a51efdb197b..266315f6606 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 3a057ec4e3b..703a675f287 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 331307d3bca..b0b21e3c2d2 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 6b30b85931d..3d73199cbff 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 9d945eac27e..aaaee5d1ad7 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 6ad69e23c23..c2190ceba57 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 8eabe6839bb..c554b062417 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 61562b9562f..2360e81a4ac 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 6fa1f260c83..55bd70077ce 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 288fae919dc..968addd26bf 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 6e1e2db5ca8..0ae08cf66b4 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 ad2f391886a..929ded46fbb 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 9f6ad4f8d47..b6e3120f365 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 eaf2e127026..1c1f80cc6e7 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 cc8ee92df4b..134771d6c96 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 df0232d01fc..5cd75240de9 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 332a21f99f5..2d28462243e 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 03118f00ea6..0dedcaa8b03 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 288fae919dc..968addd26bf 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 2f83fa30085..6b6b3267560 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 262a3d732a2..7a9716f76cb 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 fd30f83c5f8..a6188bb18c3 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 beb7c839eb9..53b6fcd6b3e 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 1a231d680e6..b7550430aa0 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 c16481993ef..6abc49e8aa3 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 86e558cc807..4d941d73619 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 e2b264182d0..4d408ef525c 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 135e26cede3..dd7fef44ef7 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 2ffd5e7fb41..790819bbe3c 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 ff6d1b21055..859b9e72f9e 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 905fdbacab8..5181c87f3b0 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 48283a74106..2a2e2ec6512 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 976221188d3..d52cd1906a6 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 27d2921a7d4..846425ec421 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 6d8c537d6aa..fe95bee0616 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 d9de0f7c0a6..399ecfc0459 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 d8f46d6afe4..3e6a5820ed8 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 2310af22fa2..552ec1b7da1 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 1989e1a0703..d3abe40bf93 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 c733f0f12cc..4a828e919e5 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 25738b7618e..274cd02bf75 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 110f60193e6..a52c2e03002 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 ba7721ac0a4..d83a34ba9d0 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 a34077a0a83..77a9bbf2c01 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 f56cff977d0..c7036e93162 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 f5398c1c399..8da0aad2733 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 5975c34e78d..ffe8501b584 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 a82843bef53..2bf02b8cdf4 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 03b0c84744f..0e86684c610 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 ee1507d9e0a..4161597a7e7 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 146fda64b1e..f62821fbf08 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 21ee65a775a..c3400352263 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 cdfd651beec..0e0a71c8968 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 aba620541ec..08154069b3f 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 91afa020fc0..882cd328f86 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 3851b1cc441..3a6be91a994 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 91df7f5a8ea..317c4932e1c 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 0e9479c1ed4..8e4944772c4 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 e7ae5593637..0f35269d006 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 2077cceeb4d..7f765d5a931 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 64a6935a9b2..a5066e0ca3f 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 923f452450b..98ff43014f7 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 1fcf58e3086..8a217c57a6d 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 481450cbc5f..005175c5bf9 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 c4dc5ae178d..5114b578c3f 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 92dafa1c323..5c104c9399e 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 6d3aa2c59c4..5a41facb505 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 d63802984ef..40cca942a8b 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 ecb061e91c9..af1305b00e8 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 d710886b84b..849913b40bf 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 680571040b1..03963cb15a9 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 7e7697a339b..5d769289d2c 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 619fdcf736f..1591d0f3113 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 62caa58fe26..441fbef41d8 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 7711fe98a18..0ae305c76ec 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 750e14b1dae..5492aabed83 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 0de31a35eb2..c0abea57bcd 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 dc931b6bd8c..a902c3d4d04 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 a1903fa1075..1d6ebea298d 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 fc1255ed9ce..b74ad363658 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 b30bcb66d2e..85d744b252c 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 9b76bc744e6..8c2fc19bdbc 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 1bf211476d8..f07766c88de 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 53d15e1205e..ee2534fa776 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 46b7759a04d..e11634c2d8e 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 7bfdda60b37..5558a73aa7c 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 c86ffb97d3a..15b7a823a91 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 b9ca9b355ee..8383a6a3491 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 0546fcd7adf..dfddaf02742 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 3de562db21d..6190c0a52ac 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 354a5eaecf9..edbbe2d4d94 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 c59e31a3b95..cdf95c70173 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 bb48d95bc51..5db92410f14 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 5cb49836f4d..47d5bfcf9ce 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 c8b910b6dc5..94b0d55afb1 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 79ae6506d86..21235032c3c 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 a16deb2fca2..9158b0c83e9 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 be76411d8ac..1e3285a628f 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 8b21562a87e..f3a9bbbc7db 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 851a2f16ae1..d28ee5a2e45 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 20ad2ca0a02..a208aa3fda9 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 42afc3eeaa9..d8f5e4be158 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 6d46b8bc154..27e7cd47e09 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 3ddb9f998a2..a67d2423980 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 c4d9228532d..e834de8ae0b 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 71f13959b41..c39cec0c737 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 4b6017ddd01..8692c4c02cb 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 1072234a744..53b2f2f664d 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 705ac59b98d..c53605865ff 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 7436513ba6f..fec1cb0b40d 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 9a94e54dd5f..7488d527ecf 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 c20b62ef3b6..eda0c666b62 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 3192454550d..e6a90325e0f 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 3c0ef8306e0..507b4233144 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 0dd9cd43ada..1b54d0ca3b6 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 ea589a2c3d3..3090a8cb164 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 1ca54237fd5..bc107a24a99 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 865155c0494..e5a6ea182ff 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 1448b56d848..85e383be712 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 4de46c84137..0aad75fc4ff 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 8a7bff38db3..99d65227b2b 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 874f0832b6c..ea087c1af75 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 b0fc5a61f72..fb49b3e7fbe 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 bd0ac2f1218..7f97ee23f98 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 c68fd29f7fc..26c208ef9aa 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 e171aedf1ce..9ce14cc2ffa 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 f1bbb1c872c..5de59789797 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 6b375c93ad8..49093846261 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 1a442e7fbb6..4e032a70957 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 583a88e5623..ec46be861bf 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 f0d0c6dab6c..9e98e4a9496 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 b907b5d429c..376e8751505 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 0031ea5a9e2..dbbaf1c372f 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 d7fcd8bfe76..43c3560df99 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 c86cf73ba18..8be90459f71 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 63ce7b0da30..7f5b3e38200 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 4b162ed8c55..cfe47b199fd 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 b85ce09eff1..8e80584957b 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 fabd9032dc0..78a52d90872 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 166d2674934..a00f8930d5d 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 5c4e67a324c..31c94851158 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 cef13db3150..2b97431b1a4 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 66eaecbb548..53c357fa8f5 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 756eb65d4f7..242fbfe890f 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 0f7066df007..340d4742baa 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 d2d749e4deb..45af82bfb84 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 5c49723657c..0ce8b77e7e1 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 d9fa42b9e47..4b25ffa0050 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 de5eb4e5e6f..a9afe10984b 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 46bbd6b309c..23f58ad5bdb 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 0986b0e0240..9cb8c51d98f 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 8eaa20d76cf..3f239306ec3 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 86920906003..d8a7fb30220 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 b5db81356d0..b56efa60ac4 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 0770116f1c8..e9d7481bb6c 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 f6a86be0091..ceab0e65a32 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 5d4c8e12283..774e6a26953 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 c7ac8d76cf1..3d0fbad5b5f 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 f51bc45e0e8..f28083fd726 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 a36c8e28d9e..da010884620 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 b33002bcda8..beba04478d5 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 118226354af..53660148d65 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 56a20706470..5d98c837087 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 db996c75c39..9e3e8053392 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 2e80e3da6e6..341fb1afcaa 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 86aaf15c0f1..0dac2ae5dc2 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 8951c46b75d..396082c057e 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 5e0c6acef50..cd97e4aaa3e 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 e2bd6caaa8d..d9b547e8fe7 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 bed6af70e13..32871a64c30 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 0a7f93dda8a..04cb6dc6ee6 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 aaa10fa21b7..e8911d78e93 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 a10c499dd59..e31ee2373a4 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 468ab0b3f5c..d638cf5e54a 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 05bf5fbe4dd..523e2fc025f 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 bc87c370068..d02d1a45d18 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 e938c78677e..05c291e9d13 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 a7fd606b310..ea2b760cb9c 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 fe05d236e8a..96d6cec104f 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 d52aac4bf4a..373a30c435a 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 d43d4d9a044..b2abd3fb201 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 8b063018879..06fe7d4117e 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 3c07ea850c0..789893b5974 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 cb97cdac9dc..6d51f68a4d3 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 80e5f3ff99c..f7a6b7ea626 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 86338633f7a..ac162b546f4 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 03f0fe0e209..6aecb4703dc 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 494b1ecc69c..f21909d21cb 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 919956b8c34..010dc5ca95a 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 fe53a86993d..3fd8027faba 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 257a0908c6a..385fae5edd5 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 4ad5bfd7c0d..a753548a77e 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 2cb49dc0ac1..79306985200 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 518ff39f8bf..8375483af06 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 48ae0c049c2..b5918917e33 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 d95ec9eaa1b..fda712f0ba9 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 e0bdd7a2e1d..a8f1a65a366 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 66d6cb0b740..121d885c9fa 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 be25e92080a..6debf4ffb84 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 2e1e62c683c..2f6e4e14bf8 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 14b3c7e4dc4..3aabaabc3d6 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 34b74f56c49..7e36e6dd4f1 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 5e813243f13..01e43f011cd 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 8fdf05bd3c6..1654b40f9b9 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 12e77ed8e46..6dc636f9af5 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 e1bce5874e3..229db9e6b1e 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 68c466150f1..ae13a03b08b 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 864c1105446..985f2cbfce1 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 f3d8308fabf..ac2a895f7b4 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 3d9663a9a79..9c27fa443a4 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 c25bdb22eee..77e8a7db602 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 45aebd1ebd5..983bdf0a802 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 ca49bcef95f..ce7938ac705 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 54caa8f96e7..b30711c49c5 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 f5598c56d70..e9133de022f 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 c0397692bda..bd53ba0d480 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 578399c8152..08d8ed78d2c 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 2e50ee0d583..8ea41520343 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 f566fb592d2..c894277abd0 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 d004655eebc..42267f3b8fc 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 70736b15a9c..2091ed0b96a 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 bd8699a3617..8bf764ef224 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 e592522c43b..b44d707b476 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 905f23845a9..82d6644c449 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 58e86634312..d69f926bb01 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 e92790740fb..a31cbc42b7e 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 8ba71cab490..05b83631a91 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 3f9897784f9..4ea988465bf 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 3954d9d549d..7f30d92a63f 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 30c53e1d89e..c3b79973c7b 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 ffa850f6ebe..f6bc4cbd438 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 a76f68f2f61..073efa65f46 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 c530504c6ec..710f8a003d7 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 d7cad509da1..b41e1a3d8b7 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 da6136334ce..2130d13031f 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 df56aa5d35d..e9254635a3f 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 b92aab58df6..92e7bbd796b 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 0db5f9718aa..991882ac875 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 0745151cb0a..ce43bbbcd20 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 529fcb604c7..1dd9688b332 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 df142bdb31c..da9de46dc93 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 0f6e767f345..1c85587acc8 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 b8828c9c1c2..5d6d5200569 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 a74d2c04507..2c51f1d15c1 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 00000000000..5217518cdf0 --- /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 066de6d5483..1ac6ad5996e 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 a776c8876d1..2caa4455a91 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 a742cc546b8..0506560e61c 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 7a6b5540c59..9b20b711554 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 24afa67038d..5c8a491f6a7 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 37dc84d3e30..55fc24154f0 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 91581de59a1..e23c5cdbbab 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 8e722a7add0..344110ed1a9 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 6ed1d806739..5fd2f8b768b 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 692f91efea9..6b4548ba4fc 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 20b4496b428..3ab32508ce3 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 6fc78c96fdd..dfce3978ad6 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 3dcb9e59d74..4b204902389 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 6e02251f271..5218982315e 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 02231169b65..d0e2e0f6171 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 016979eb330..15e05bd376e 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 bbf39de3409..0de30aa5ffd 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 423bf61a750..619dbf8dc80 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 e23969be8a2..fb9a6399c6f 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 d12d47551c8..a44be6c5d7e 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 b1a49974cbd..c9e0b2fd48b 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 229b26e56bd..c448010e5b5 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 32e6f48e153..fd4b1f4af3b 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 07078670ace..057596e5cb0 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 999ac2a0ac7..73cf00b355f 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 8bcbbb835a1..c0760337f06 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 6041992e56d..d97d32c8967 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 74e7615cf5c..fd4c9373010 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 d3fe4028e0f..798048479cd 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 6a609a05f6d..d1d527c030f 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 9f7568ef249..5fcf42caab0 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 af124ca3eaf..5b3b13f9b68 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 61ef8f8d389..ec498ebe3b4 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 cf0ca26fdd3..2121153a600 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 7377dfd8aea..ecd3d4d2525 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 db71d8818bc..956c640379a 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 4d37438ff3f..74ec441a248 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 7951076a95e..965453fe405 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 7702874866a..9d58589d7f4 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 64318828e6d..c472cc5806e 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 4d0cd3178e7..03cecbfb349 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 b0dde032b73..48b3ddb0488 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 e91f57a1585..1c0988cee33 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 67bd1ea54e2..3eb2582b615 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 36ce52f74ea..83f2a11a8b0 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 d97fa159a87..1115cc97ab2 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 ada10db6c82..7b7a840b94a 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 b99381722ad..6306e1ab2ff 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 7f0968e7dbe..135779d6901 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 f1599b58be6..4a2c446f3d7 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 541ee0c0e9c..d384e46641d 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 13638985ee2..d2d6a42fe24 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 6a22409e8c6..e28b5076dcb 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 a2c89f0032f..b7baefbaa80 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 05034e3e58e..b5265a70784 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 ffd1c1d7f67..c1b10bc84b6 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 7885890d8b4..247fa8d9f4d 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 46f26637689..129d1b0e8e7 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 7945f3b0d3f..56a92234c70 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 d16122d0df9..75f09a944ef 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 e230421909d..84c6e2762f7 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 857ef6488e5..5875ad80888 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 f5d594ed6f5..6d90e9485cb 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 aea7a9b6409..dbb7d941b2d 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 0ec8fd3c6b1..7b1e2a3f350 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 f2d9db5797d..34d86a4b46e 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 2160dc226d9..793de99a32a 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 39324fe5f51..862ca6f28e4 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 08d5b31d202..c48ca23d27d 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 60c3784ee9d..d753a54b693 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 bf4127fbd84..34b0f198b50 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 fe159cf9fa8..84d0bf9e84e 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 e204fa96f1b..471a6a0cf68 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 613b5565470..3345d7882c0 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 71581e845f4..1ab01c14b4a 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 53e67cd5506..9db028011dc 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 a7e56f817d5..3c0c165aa53 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 bad1c408144..8c9da14a603 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 0568cad3f6d..1bcfd463ce8 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 436fba8fd06..7ba23b7b0c6 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 b673d28a7ca..d278c5d6f19 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 2f1fe9ca10a..a732debc043 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 809c8fc29a4..097c6fe3b71 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 33f284e93c2..a84e80f9d04 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 1e06319672a..7e116f62923 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 15131fb1198..81be13f879a 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 28ae99c1dc4..81c7db754c2 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 2981ee71634..5014ee44be7 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 bbe44a4fdea..dcb235d247a 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 8a13a76a2a9..bdbea8983e5 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 e1fca79c24e..9b1d0cc00b6 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 04fe2171f39..636943d119e 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 c6baac67898..4096720d02b 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 df28c6936db..9c1b9ae6248 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 4dc94324695..1ff1554fa2f 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 513b8ba3ffe..59c2f79d858 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 56c30acbf1b..1fd32fd1be5 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 7f80900d828..adebe4b8a73 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 e4970780bc0..56c29638be0 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 c2b17eed04d..0b96963199e 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 f7d86af8394..804cce84862 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 fc80ba9f722..2fb6b10a770 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 2b5b646c458..2ba0e1f3467 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 929e95dc2ff..68782329fac 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 a25de0e2feb..051fcb5e6d7 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 849ad174134..7bbce699274 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 84194fee482..dba578def93 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 f49fe04ae8e..0b8a9f88e81 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 f07586c16e3..0ad425bc930 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 506eb98cc95..ea7c3b80121 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 725957682ad..5cf7b43851e 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 c871679860e..47b04ed2c6a 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 2326c394cc0..7acf1e34318 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 10d73f8be35..b6164bcd3b4 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 9a8767fa7c7..2167553ce66 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 e265df40217..0ee1284a341 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 356603c9cf8..1e4ccb67942 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 52c4f54ebd7..66e56e73bf9 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 7c41731988c..dc12b0b2aec 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 6aa256d87d4..725e95cee0c 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 a3fb9ee5e27..e4524f4dcc3 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 627c534f6dd..5cfefc80793 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 aa4589e558d..bd0ad026615 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 8c79ff3bfaf..bd39f4cff72 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 1c886e4f20e..b3b4155a556 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 f307fa1ad23..3e3ab1e2ac7 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 46abfd2677f..b70a3059be0 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 88edc116e74..7227ff139b0 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 19c90f8ec5c..223150f2cd5 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 818f27853ff..5bfd1d487f1 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 848f85ed133..6e888f6d5c8 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 e814ffd5046..3272cd00908 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 6249e49d2d7..0ed6fd4d140 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 f3ba34adac3..6096d9b7f93 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 94c3750f06f..3dc7f769cd2 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 69073a0eb73..f79a2831438 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 a70bb7a6722..964bb4942ec 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 b982baac2f8..281726861a8 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 e4223e373fd..41154732530 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 fd3707af3dd..84b05f3a26a 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 7ed64f51083..978bacfbec4 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 cbe913e131c..f75a9af1b66 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 7b06c110397..d9345e42fdc 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 8708729bf4a..458ba0436a2 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 201e3ff49c6..f2d4e623fcf 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 ae8f51983ea..22d7727637a 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 6523f393628..483edab97b4 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 3d4b3448252..ff2e4b1e97a 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 afc558ca80c..76d928833a6 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 3cc52b43a63..15cf27984b7 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 4dd4177dd15..6f41bfe0a2b 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 5e80c1563f4..53370bac086 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 e6e7094648d..491072a841b 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 ebfefe40b0e..4ac26d670b8 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 25bb0f325a1..42a2c217051 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 698c28d99bf..f3802963243 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 6dabc169f12..7c730cbba47 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 6a041c7ea4f..699eebac65c 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 f2294823ebb..2930048d59d 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 a344832c61c..1ce3bc44de5 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 3e71154b383..621bd13ee1b 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 f1396045819..136ef6fe14e 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 2e6778ffbf3..4e171b99df6 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 0f1b4944ed9..d9a6a482e88 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 65c13f052d3..81ac10aad54 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 ea337d1e675..64c56cb37d3 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 8bfaca69d94..5d835341b6c 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 3965f71e992..36ccf94c22d 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 3ce86b4e10a..7ea0915a124 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 9fddb46cdcf..5963c62bd48 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 fdbf21feb92..00d2f264b29 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 3333d5c0d5f..5f9497d48f8 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 152152eacf7..8024236963c 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 981bd9fb167..9942533798b 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 e44d7a3f9d3..580418df94b 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 0b7dd3b689f..064da5cedf3 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 00bc3eef39c..b08beffb16c 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 49bf83148a2..b13fb51aa50 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 384e7ec4207..75a19c6a208 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 46bfd441fc4..46b2f34b7a2 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 6df113b82c9..420cf8fbb49 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 0889cdea2ec..69f98c18504 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 797cfa1b2d8..9c63ecc3665 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 6c7d0129708..6bd93ee7bfd 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 ea79a455924..4a1cca9e539 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 fdf180a1a61..b484d5925a5 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 058f7222666..823ee6c7531 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 6eeb4f75a3c..961b47595e7 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 c8cfa1473fe..43109352dff 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 102413bf446..c77ebb5369f 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 fa581eb0821..cb9786da233 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 01f7e50eb96..c8ea2251758 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 bb3ce895fd5..ece81ba345b 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 73b26cb91f1..e3882a4fc2d 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 4741ccdba6d..043f37e52f8 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 58b8853cd51..4c917794ca9 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 b50c030c636..0cd23e6a11b 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 b950a439ef3..9db0ccb3505 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 3b2f2e6beaf..54c6e3b8336 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 ff0383c7f01..ea066156c71 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 d20eb71cc55..ce2614b9989 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 29a3eb77853..70cf906841a 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 3a904102076..b9dad43c44e 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 c91536abc77..0c0ccf25a12 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 c7fa0e4d293..1ce59e3dbc5 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 0a1cfa83250..8ed84338a1e 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 b08bc3431cd..4d764b0dab6 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 ff0383c7f01..ea066156c71 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 f5944cbf9c7..3a28194f6e0 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 e08e921cf1a..d9a7fd5307e 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 302ac53bb62..2f3a55fc911 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 0cdb43e4241..8b9244c5d9f 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 bdfbade2bbe..cc8be930341 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 982b32a90a1..4fa8975523e 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 3b11e6ef6e0..1fbff59337b 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 392a30d01fc..c1f87cd9a70 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 67fd26f1b5a..ef651375e51 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 c0b26284cdf..945519c859e 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 c4b1a555245..20cb32c9c0b 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 920d25a3bfa..423684442e5 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 df9e9d2239d..14f85bae320 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 ff6924389d6..b260aa21080 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 d2372a7d9b7..4a1321bfda1 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 987c54955f2..a98a23c7f0b 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 fd2a77bd129..5891a80dfcd 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 54aa43c6151..51e4c113946 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 c91f9a78c29..835f113ba2f 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 7811a31ebdb..5c85ca25948 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 dc810d9773c..f9ba72d2013 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 06c873b436e..60c93f7b429 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 931a0beadfc..8bf0b347b9d 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 26eaec4584d..d39a4d544f5 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 de84482cc63..d47b5648538 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 e7df1f23f20..a3540b0e294 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 ae47916ac85..32780cecfbd 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 a45cb4e9824..2ebe0e5d3f3 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 e8264b2d6e0..c761b08c602 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 379ca965314..7296efb6879 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 e442ab9504e..c2e4899b5d5 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 1bff827d273..5389beaec72 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 6773465bbbf..e4fb004456f 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 756fe8a7483..439e9aca790 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 ebeb1a8b07c..5ff26dea498 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 de2609f4a71..4a29360e2cb 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 c6fb13c3605..d118212e77b 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 fa0fa734353..c4aacd2700d 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 bcb73eb66b0..7e0f58ad78d 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 f4f4950317a..b9cf4cb2eff 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 49670e77285..8d16fbf7f99 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 b26b2b6daf5..6400bfcd7dc 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 1e8a90246eb..6da10f785f9 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 9c233b9b947..7fa73eb02cd 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 414c82751b5..a51a4fb2583 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 ffe78aa0c02..893d33225f2 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 af151ecc2d0..9ebb4c70d85 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 b7d555cbce1..556c5d559b1 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 2721c5fdffa..01b2b7a38bd 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 abe59854044..357d307bc26 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 7a545d32bad..4dc334c6bdd 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 1f2e1213882..339f86f80a6 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 b19f226d8bb..d0985024f13 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 6ab0b0a40a6..c1067de1d6a 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 5c720a1f26e..525ebde7c6a 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 88755b800f4..f8f224d2cda 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 c4ba3d46343..688f406a67e 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 702c061c629..d2ae496f350 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 72cf1a66760..b6d7d072e5c 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 2a8cbcf1270..3be1164d19a 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 28332124f9c..1c845e1c594 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 afe8f8c732b..f93f6d3ff44 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 bc881ced6a2..9263a8c3ff7 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 d15f5c37edf..8854ec470d5 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 ccc5b7983d0..54d000ff614 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 f68732354c6..6828cffbf7c 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 4d7ecf427f8..8dcd6526865 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 527add9920b..6a917bb17b5 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 df6a51136b6..c5d7905c5ba 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 88b146144fb..cb69fa9c8d8 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 37d55aea194..c7e3a1fee38 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 71d54bbbcd1..f0b94eef383 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 aa84c36772b..5555158828a 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 3cdc5bc4bac..a2e3728ea71 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 83f2300892d..205088154da 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 6f8eeffc8b1..f6b7ba83308 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 ce408778b55..1e3f7b573c3 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 fcf31df3920..c9b127fecf2 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 3bac6d16288..f3ffdb997ea 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 3bf4555641a..80b55da4b63 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 60fcd9866c1..6d73cc6fc9a 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 553a2963437..cc5343589a2 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 1927227b65f..f5fe2bc17a7 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 00000000000..998080b1ca9 --- /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 5fae9bd32ec..a850db0f732 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 76144afa4c5..f7e1a9d2235 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 303e2c099ed..eb33565615e 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 00890a786d1..4eb4d59e642 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 908d0f7b176..68178af768d 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 00000000000..5d2a003e5eb --- /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 7690efe94f9..a2ae32f5aa9 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 97e1c1f282c..054c4464922 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 46ae4eba463..96beb3141c5 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 6f337d9a4d3..933ad3cf7da 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 895570c3698..c85251a0e13 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 c07ff528363..e58c6993179 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 4ed9ef597f4..601c83d31e0 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 1281784dceb..3b8cdff3985 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 0cee7ade0d7..b760f25a47d 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 70f4ef6f1d9..f5c7efb4cd4 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 8519f02ef5b..823b50fa869 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 ce152285e75..414286efdb0 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 10e289f2520..5790bc6d7a6 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 a01436f9ba8..3437a73f6a4 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 fac9475f6f3..905653b7015 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 934f56a420b..a98ce99c970 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 3977bde4a3c..854b7fb562c 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 68e53df57f1..5565fb21111 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 2183b9068b8..e0066a271dc 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 9f8134ed07d..e4f8bf05563 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 fa5b7e2d319..71204c88602 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 7e0a8d28b9a..0ee0c4b6ac7 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 809132e01b0..a7692f2a68e 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 657722f7f13..a9449ad999f 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 23093d247ee..959e1744082 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 2f0257d47a4..ad1ae6935d2 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 85091c350d8..a6036e47984 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 4f435aa7839..4c458f06bce 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 4dbee73717e..67d91759e24 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 3f9e9c4e9db..465d7668981 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 ef9d5162899..9712f1f780d 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 01090bbfa9e..976de89687b 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 e9bf5e2d4fe..dc7350982e5 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 a0f8d353349..4879d5ce9fe 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 64bf528e95f..9d5e030900e 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 5f3e83dd248..618ec938208 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 8df2cdd2018..e46a184ac44 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 89233646ef0..eac0ef77433 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 4b6de20d2d7..c8a1b1bd240 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 5354e4e6390..4dd852403d0 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 ec6d5850d92..6260a5bcb22 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 46263ff64ae..ec2763d01f7 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 c35cbfb944a..f302a4fdb90 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 0de9452b3cd..18759572439 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 0a88b82f829..3830c131650 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 e4f73bc7c6b..fe588e01439 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 cbcfd5d4adc..938b86add17 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 7d7d6c73e16..c43e8079ec0 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 598bc77aee9..800e9a1a18a 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 10b0532a53a..e37995b0aab 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 7c41cdc0d24..d711a2edfc3 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 79349135581..3793aa76404 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 dcdf19ca1c3..079f6eddb6f 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 6ea86c00057..4bf599b598b 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 2ca887b1766..32df2270073 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 eed288a5e39..0dcee9de588 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 80a101ac67b..aa65b65dc8e 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 52da6579a03..bdc98c5e2ce 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 8cb5ddaadd8..1b819056273 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 75b46d3f600..e9f1b919680 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 8fb71b80acc..8de052d911a 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 4427b90ab9c..b38d0fb8f85 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 f3c9cf9588a..88801597396 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 c8daeda3f4e..c239b1ec5bf 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 44111d74beb..797bf3c55a7 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 a456027be04..361e22534c4 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 00000000000..1f04e414991 --- /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 cd7f633f323..8eecf7a087a 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 aa8fb858fea..dfc201734e9 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 25ffb753076..8ee618ee6ef 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 cf286f853f2..3beb6170ca2 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 1d9fb41fc8c..12b54c61ff3 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 5225a89fb95..6a81b59c437 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 ba19fd04390..d96ea151ce3 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 ff349fe1b68..339c0bf6e65 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 2832804113a..51de23bec32 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 1a1199eeac6..4559384383a 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 7351825398f..87e3f720365 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 094174b09c1..b8a8c59f58c 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 4931e2293dd..0d591c0850c 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 89255d78518..c442ad2387b 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 11ca7218e11..3a40495a18a 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 622315fd84c..6fdce954a96 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 1d9fb41fc8c..12b54c61ff3 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 2cb30df1a42..38578dafc89 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 fa90495a5bf..40839e8f4cc 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 1289a9178f4..ce12d35086a 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 1d9fb41fc8c..12b54c61ff3 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 b7d76793245..b22057ca71e 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 e686ee4bc04..3f35a246054 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 14b6417d593..6ab2cf93a9b 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 80740c9190f..23c027fa4af 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 ca3ac913375..81f264ce16e 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 17cdebd3f83..d8ff1e97766 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 7fe89d491c9..68c2b1d11ab 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 0cfb9738d5d..52d5b776d5d 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 b1ab350c905..2159542b802 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 92b1f3e6b29..6cf78485ada 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 a8804835278..99bfc2f0ef6 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 dedaf02971c..294ffd96bef 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 0948a31739f..0fea457b5b1 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 a0980644a71..ce56480f01b 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 40e1aaf4d6b..07199c7cffe 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 8808d85a1d6..156fdcc6c4e 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 c4ee0544a2e..61295f3d90b 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 9fc23b3e394..8db28ed6982 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 805b952690e..f9ae3236a1a 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 b7eaf7fe16e..85527af7d61 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 4fa0c4e6714..b7ad0024d65 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 1a215c90d4b..e1d7aa08392 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 95aaca7e67d..c6cdc90aa4e 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 ddd33235e01..8a67cb2db08 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 22944e1c4cc..f1f50d84731 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 85e8994dc55..adb7da378db 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 a9ce5213d45..74abca0ce08 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 eb3f25e8b49..ee5e2de904e 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 58782a1b421..f7270ed9444 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 36995aaae46..bf6bcb094e2 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 68165dbb291..7b38a1ca342 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 0b11474d677..6a2889e3e36 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 4b3e1ed52d4..6387813915f 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 343810f92cf..151f7e8fd28 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 c1dc31028a8..4f8c2608853 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 09af3d09bdc..6d704b37d80 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 b9b9cc6c0eb..38a496e40df 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 88ff9e6104b..158524d9325 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 5e1439c8d7d..d10183877aa 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 99ba9053d79..6a1d26cb75b 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 02c46b52f6d..f551eff5243 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 cd3e61a42ce..0acf3a310a8 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 f190d378ec7..951a8419dd1 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 544604e2b2a..e60a9efa5e4 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 490fbaed5aa..ebbe5da4877 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 208687839dd..caa4291b881 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 50c987dba61..0ba666cee11 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 d728bc32f0b..f4ea7817990 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 cea0e6d938f..bc5444e7b0c 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 7d2925fd3f2..90902691e1f 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 dbdc39c6047..7b3e1fc2de1 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 65c7bbd9401..4959b35d897 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 d5c46f63f0b..f98e4d2ea6e 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 4ca6970b5c6..cac431bd450 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 3278f7a3a4c..6a04b7a166f 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 7630b50cdcf..ba0b48429eb 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 feabb364344..4b9712967c5 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 c3d912e5e77..716e4ad239f 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 3605f21e140..9f9a3e42305 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 e64a23873af..b6b4423f629 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 c7a78201797..f63c0a3ee54 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 8a1f01783c1..b20145b7c4d 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 4d3537818b7..fa1582daa73 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 0533574efb0..a32c2e539d4 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 5abf25e286c..52685142526 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 d18a854d6e3..413fe69560a 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 f3e8c01f3d7..0805a5a7ff7 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 2c162e66ce7..1e927c081bb 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 ad43d3ee600..b0445528e40 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 765fb284c3a..da77960f288 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 289c9f985e3..da20997d733 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 6ae573211c6..b05e458f5ce 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 df36ab070d7..2ef1a75001d 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 27ab8e8a8b2..caadb8b4da1 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 1e3ca933e38..2d60ef39d88 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 586e36a5d31..e01a5a40ff6 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 ce969a4f464..a747845c18f 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 02ac8ecf27a..c6156631284 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 60a412684f7..7402843f7aa 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 0321a6b73ce..6f45ff67fef 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 27850d207b0..6fb69db0423 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 a78867d86a8..1a9c683614d 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 b6f10842b4d..186f6f687dc 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 a420133f464..c376709b628 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 02ac8ecf27a..c6156631284 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 1d4395bb2c8..e9e341c8b03 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 130672906ef..0025a9a995c 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 73735dda1d9..15590dabc31 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 5d964604a77..6d975fc2037 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 7b74b96d057..3ccf19e22f7 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 ba2d8743681..edbd77699fa 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 0e0083ec5c1..46685b2b74d 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 1329a8418ae..5cc940b6d9a 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 bad78e51a36..e945154a927 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 d484ede413e..da50d02bf8d 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 d5f40d56446..4c3e69c3d87 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 46e53e182a1..5c69717cdf9 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 3ee0421469c..cfc522ba8eb 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 a5fd83abef4..81721c85bda 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 8112c2a47c3..25387878915 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 09ca0f63cfd..869520ee956 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 ae96d08976d..26e66e7d584 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 4f8926c23e5..80b740b62d9 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 b8e88820590..b42fcbf4e27 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 96b884b0c8e..c1329c0aee9 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 842307c666b..b0b021be457 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 86e5d9051b3..8831caab476 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 c3d6ff16e2d..3da622c7f51 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 c61d22db880..7191eba4a5c 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 28d6488f2ed..f715e1d5711 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 30495e5854f..8327206773e 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 ba8ed6179d4..34fdd4145de 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 86d2c44f11c..9da6470144e 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 673997d5aa9..b3863083cf6 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 6fda9f0143c..35ccf1ecfbb 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 858970539cd..c5ffa00dd5c 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 4b8b8977491..527b1a7a374 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 7eefb77b3d2..786bd871ff4 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 32711da56f7..0d7da884aba 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 1afd1ca96ce..8f2f33868e4 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 afdea87956b..db7cf1b6ab2 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 d42a647c82f..4b83deb174f 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 9b729e4c4ab..515e5fbe964 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 31c7e6c0bcd..87b64e7809d 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 659a567a91f..71930db04f2 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 f6919f985dc..6a5f30913ae 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 9439715fe79..7cb0a0a9ee1 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 d57d80c7911..730f11189f0 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 26872a9f9a2..b82c0036c7a 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 fe31651173b..7e03a1314ab 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 156faf83d92..5085372747a 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 08329aed574..b02484e1827 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 a57bb33ee7a..d60b4b5275b 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 c602a58660b..6044aa4fa6f 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 99b1ac57e0b..8b1c55af089 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 6cd09a947eb..2850f91efb8 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 a2c37f027b2..6606175b9df 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 dbf5373aa9a..c1ea81e01d3 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 ebed653732f..86855859961 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 e91bfca407c..df4ecc4a05e 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 6ee5961f152..66847b1a6ca 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 85370eec8e6..7d75b148148 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 17d9949453c..8f5a1a2cfc0 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 c41741b8635..334641b3059 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 253dfd59a6c..c195c8a7c7b 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 632d5112f1a..a913ee054c6 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 bd95b48359e..e8098013fb5 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 fa299cc379f..eb8695eb8ea 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 0c49a92bc0a..91834ec81bb 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 6864658b379..da06ae07939 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 29dab5e09da..a4caa11a0ee 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 e822895a6cf..99c9cd2366f 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 bd6aaeef4e2..4ce12cfbe3a 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 029e1e87cf1..4304a5e7954 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 a94471bb610..522a42ec172 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 8e173e4297f..ed6238dd83a 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 fb1508a1aab..9b45ea7965a 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 964e5a6818d..084ecfa1371 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 bfe4a2ab862..443bb933900 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 d559a05ff23..f05f025ff82 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 bb584da05dc..406d1e964f3 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 b0a7b7e7b65..358f589dd47 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 4c019d8f207..38fd6134bae 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 e3864aee4da..c5232db59da 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 2194a2dc264..3a0942e9156 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 1611dac2721..490b0c218df 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 e769f83d28e..283a24ea226 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 e38977a483f..3a9be7d213e 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 5e636c8bcd7..6d70f7c3d60 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 72af917e12e..48f23aa0cf8 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 898380a6f29..b28088efa6a 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 1e1e8897c30..197bff064b0 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 1e1e8897c30..197bff064b0 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 8d93adbf4a9..95987d48a30 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 e4f1fbf9c6b..d1b74e9ec22 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 6e218afc97c..06ca9a058e3 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 f38a74e5c1f..b902843ae46 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 b2908e8d221..03d97982757 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 c6b16170877..99a3706cf13 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 0856d142bef..a412d583fa4 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 10ae06ffa7c..ab07c0f6183 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 2fa1ccadcea..2e1cf68cf26 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 5a864439423..528c6143279 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 33f9191e8a2..5916b339ddd 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 d15d12ce6c3..9749a468b09 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 91f61c9c2bc..c10e24321e6 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 0578daa4c0b..898c533f1e0 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 672bcc9056e..347fb5ce569 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 d24bf97393e..24c7829a14c 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 cecde6b9183..4ebd3f804a2 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 440c576596f..c3c769ef7b4 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 de374358e84..6dece462ef0 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 6fb71a57abe..521b3fb9eba 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 a12436936e6..95cc2f4406a 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 0c253fd4812..96f991c0560 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 f2be5792f33..69f8b745290 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 44b3ea86c55..35730944811 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 cd8b3e59cbf..664721c2fd3 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 58c62fb64b6..2ed046a8153 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 856dc77a52c..a11d7b0a12a 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 4928ea4f0be..4382525752f 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 d3e53547559..1d59a36e6a4 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 ca43b90acc9..2d6cbb52020 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 0825bd0805d..7fb25b58853 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 d19d528c61a..c47e27f22c7 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 372e37133b1..3c1ca41456d 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 be5f27b7a0f..f97fee03c5a 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 d6584f11d29..62c28074808 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 23cb6fdfac7..47fb6fc5045 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 636237dcfc1..02307dd7e50 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 a477ca6e5da..64f413a78b0 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 05e4a1bbc79..72b340ec88e 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 07d9ddafb51..522a2db1a92 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 f233b4cb7b9..2ff2ad7f97c 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 fed2265def2..b36990d9a53 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 e6b9817f5a8..1941c399b78 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 a9d8b8c8990..f555647e8a9 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 64e48adc573..3c6643bf0e0 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 5ae11707c19..d7d9b1695dc 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 5523dcc0c09..2ea2434ac85 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 85cb147ff6c..c5b66f87393 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 7b88bd31d17..a02cd1362aa 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 db2691d3eeb..c7c30ca0fd1 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 61b9c56f496..840098abd69 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 e9cd91209a4..6868f1f7903 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 ce8f325e0ea..1863076baf5 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 a7d683e793c..84ccb05ece6 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 69edce6b9d8..5e2b3a1f6e5 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 788f85b9382..7ad772ae895 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 7553cc683cd..bdc14bb4f96 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 6b9a3a89134..fc103b73421 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 5317c1c2adb..83e5c363f4e 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 e2d391da0c2..97cddfb44ba 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 a4918978ba7..7e8ab705705 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 eb35fbb0b5b..44c732e4948 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 0c0ff56af69..81e38391a19 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 c8b74f33e3d..e47abb0d57c 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 4a26a40ad56..1786fad932a 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 df2fb243f88..48c91c86a1e 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 3146c8756a8..6301e8f1862 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 797836e0145..c16c99a455e 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 65e96945e46..0f79faa0e1c 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 2537279d998..ebd99d08826 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 ff729735d72..5dcf65435a1 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 ed325acd868..bf38cdb24e0 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 bafd7d1bd2f..a435fc1fc60 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 d5b6986e9db..ed40c4105d7 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 fe52c21e5f6..0c853a79a3f 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 62db7fa3eb8..f27fc576dcd 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 1da4d407849..72b322178c3 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 8af563b6dbb..b9c4d698da4 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 a3751b7f5d6..fa785558c66 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 df390e73dd1..196d1833bab 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 e5363a459e3..5f4664dae9a 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 08b55e2366a..444d4b93c15 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 389bfbd3cb1..36e06157eb7 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 dcfa1954db3..0974a312f9c 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 cc3a70a0bc6..ece4f091b0d 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 cf8a52cef2d..cc2cce56d0b 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 65fc3865bdd..86e0418be34 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 c1c8830cb25..e9bdca8ffe8 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 25a4172f00c..9e6edf3b8ab 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 a5315967ba4..18161cb7d99 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 b64fab85f78..0a6c90a15b1 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 c0572510925..d220fa7fb63 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 61340d9df45..ccd298e262a 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 0773b0079bf..f39ee5e11eb 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 4663cf579f8..a7680b67715 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 30e384e0bc0..4994ffddbb6 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 6363ddf1983..7c72068b93c 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 09e73e4ea8e..57ae3d10fc4 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 6295d918848..c214bd3215c 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 eefa54b9490..668927f2805 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 f0490e5724b..3fe3b06bf9e 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 f3e2c36ae72..b2ec33e67c0 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 d178ef6c889..d201fe70ab5 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 b13cf9ec524..177662c6f18 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 6deeff07489..edc03010a5e 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 8cdd8511919..5e4287caa66 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 14e6be4091e..ed2c1a7d825 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 7d8b268367c..a23ba89ea71 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 d534acc5c09..286550aafb1 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 7d8b268367c..a23ba89ea71 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 fac2fa3a8fc..0ec8d9d8546 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 c20f7a9ba53..1b3c2a17d83 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 eba16290453..ddbf61d9e3e 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 1de0a0d6ce7..8c204171e5b 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 dfaa09d52f0..02f627e07b3 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 61ae1fd8e06..b4eca4629be 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 d99df20187f..52a707a050f 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 00000000000..6e5a8c9293d --- /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 cf4d1d98f6e..305684b3f16 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 0ab3a789b3a..bd6feaf1019 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 2a7ef92b0ec..fe172b7aa9a 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 00000000000..6e5a8c9293d --- /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 0271f7d2b1e..74d981fa2e9 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 b7f567698ea..c1bfc9596b1 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 6f275ad8199..a39efca5fa8 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 644b61ceb73..d179d634143 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 300f88ddc46..c331024664a 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 00000000000..6e5a8c9293d --- /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 38496c01ee8..cb70263e07c 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 0e9381bd164..acd10f5794e 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 266f74ce6c2..6258ab61cf1 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 f50a24eeac0..e3edb991fb4 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 b2dc9cb6547..252b87e1e1a 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 6080336c44f..94c4f91abea 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 00000000000..6e5a8c9293d --- /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 521434d11a8..996f5823a5d 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 00000000000..6e5a8c9293d --- /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 a1893bbce58..c5d36b0dbab 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 00000000000..6e5a8c9293d --- /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 b9ffb347a80..3eaf52e8a86 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 980c023118e..4b2af95ccc5 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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 00000000000..6e5a8c9293d --- /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 14139a20401..311a6fc2c63 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 f252518fcab..b7effeac9a5 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 f7fe15f27ec..28772b25c47 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 6050207304f..7127066c129 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 df10f39657a..6370a98d6fd 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 487f2294dc6..f16a8cc4057 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 48896cc8682..c62cccaf490 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 6b2e5d23ffb..6b753642e84 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 22eb2c1e704..ebee314c56a 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 d19114286ad..06439ef5cf4 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 3dec14ffa17..6d4d31e0134 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 1733cfdf172..0e4ef864075 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 a71ebe3ea0c..db7dd9852c8 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 9632cb372b2..6fab5421373 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 542c53f0c03..af00e027a8c 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 fab8810ba5e..00704aad523 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 22d84209b7f..5ba66970d3a 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 296588f66a8..f948b11007f 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 b67d70e057b..ad4b78ae563 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 11fc4f00db8..a001deee547 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 3180c543452..ad738c2131b 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 e53d33512e1..3e13c944a33 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 fac13ffe77f..47180cf070f 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 916d09a6830..634e1f3b6d0 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 9ad486f5041..2b4edb07c29 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 908d8113b2e..60f9c60e8b5 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 f7a00fcfa7f..d61ab9ce434 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 500083a7e4e..803d058e0c2 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 edf38b4fd3b..eb02c27d748 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 2bf817daf63..32aa48328bd 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 99905bba836..3e22c7cba55 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 11b2a9fc833..df10e978d72 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 5048ce52599..70ab49a8017 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 76a10d2c976..2ea67ece4a5 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 c4c65bf2037..b447c2e44b4 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 fc7ae970503..64a6d760d45 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 392018bb1f1..d5a8a89ff60 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 656926017cf..096164e7291 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 bf651fb16ed..fc5b04e1038 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 7ccc661dd28..02db7d60823 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 0c86dc95d09..4883c764320 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 c5f38d00d69..54ed72d674e 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 53a45000701..2d6c9c687d8 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 473cf1cd2a9..e9887441c00 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 b0a553263f7..22a0152b73b 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 9547e7b5b7d..6f042345407 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 7140e3956df..77ec3bc45dd 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 bbf303a1f5e..cb6c71f06ec 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 a44fb8ad34b..90aad3286bc 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 25eee9b3d91..52ba1fe06f0 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 f2438f1561f..c245e010ded 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 081d5c858cb..bb35af63373 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 f2ca1a19aa4..5e44c2612d8 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 ba7885f2e25..bef69802ba9 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 8c4c45f9c89..d8a4c453015 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 797a64b2076..7f4ba7ac899 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 2842c535984..e067002ca89 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 c380d8e5625..2e73c109e57 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 e288019de0c..93d8e43553a 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 84b6d8aa67d..0747ed4514a 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 0b700b895fd..db03b4af231 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 8d1c737170f..98d65a2d243 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 1d5584a82a0..bc890e9715c 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 a985405c009..de31220ac5c 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 2b4b19cde5a..b069a5f0f83 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 23c653d02fc..4b82173125a 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 6920f56cdb1..79f6b986252 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 a1039c2dedc..50b4e4bc70a 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 fa799d1ed36..cb718668daa 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 508652a1784..9296127a38c 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 2c72ce72c60..92996894128 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 2a84e8b3fd6..c7ef7f65875 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 0519eec87d3..124d2b19a4b 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 a4bf785dd4a..d1324b9afb9 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 0216302c651..91e30c7b1b1 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 03e22cd72e2..1d485c4be13 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 3e43f824e69..3de41bc8918 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 3e82adeb2e2..3c7e4699127 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 58d904c8f4b..3754767dd9e 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 51afbae1cae..348b8ca6c4d 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 67bd1bc5600..bcb9ecac32d 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 00000000000..644bfec5b30 --- /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 ca747678139..02a7d577e66 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 00000000000..b78e7d58283 --- /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 ed2fbed34f3..fcd801616c9 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 dbc477203a1..345eae6f553 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 367a86eabb4..7801c897723 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 067f6a360ed..37cc69b6765 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 6dd29741153..4d3d1c96101 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 3b569ebaedd..8e6004d362e 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 00000000000..cd33a4207a8 --- /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 d35e7f48cc7..2553dbea74e 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 212c2bff910..5785759d591 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 098b04a3048..33280895ba2 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 4bc8a956f1c..5ec14e9ab6a 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 2293be4b247..ab2d21195fb 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 cb7767eba12..50f29de9104 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 a1541ef68c9..7c86a1ca6c4 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 73b6c372b4f..00000000000 --- 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 00000000000..f55e793ad92 --- /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 3b64b4168c2..52a39038107 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 348b8ca6c4d..57e23bee9df 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 27f3a884335..8886debd555 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 2191a8195a8..e6e4415f16d 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 644bfec5b30..7026aef2840 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 cf14ffa3cf9..ecd9ec405df 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 02a7d577e66..ad415481e8e 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 00000000000..e1735d81517 --- /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 00000000000..6f709b38963 --- /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 00000000000..077a39bb73f --- /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 7973749aebb..8978bb14eba 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 25a2257dc89..0bd9fc1d9fd 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 00000000000..5be8180dfc5 --- /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 00000000000..c77bebd296a --- /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 2a61daf25c2..7825a4a84df 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 33a49773c1d..352da3409fb 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 00000000000..9d8f6a8716f --- /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 7fb1e4753c9..32275bfbfbc 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 2d381f81f4b..2b025862ca7 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 1984cf31d79..eb8a1b5bb00 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 ae1492d514e..a95af835908 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 3edda00dc1c..a180d448fbd 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 00000000000..b3841ba87c3 --- /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 00000000000..fa58cfde3c1 --- /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 4096720d02b..dfe406db41a 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 0b96963199e..a4148036eb5 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 0ad425bc930..19051f906fa 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 00000000000..98a78e17d86 --- /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 eb33565615e..0acac0df43b 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 00000000000..6fbabbc13bb --- /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 c239b1ec5bf..6a34670b9db 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 00000000000..f4d91ccc352 --- /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 6a2889e3e36..b66cfb8d446 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 7cb0a0a9ee1..d959589644e 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 00000000000..56d69efe360 --- /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 1786fad932a..5b19b4ed66f 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 fe172b7aa9a..421ade35926 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 c331024664a..97cf128fc38 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 c5d36b0dbab..4fc85c40103 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 466b5321245..cbc9428b2ea 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 b93577a03d6..ec39734573b 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 d34ab0266af..6b71b1e8cfe 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 698e6ddac31..8b428c1b708 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 5279bcebefc..d8b14124c13 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 00000000000..4c40c305723 --- /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 00000000000..d7e51e5dfe7 --- /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 00000000000..1e705b37d64 --- /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 f1066fe2899..ba005f04a6a 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 5833d06c8a9..ac20c989de9 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 430720785ca..64585538948 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 00000000000..2f5eae5a86a --- /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 00000000000..fe6686e7f6f --- /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 00000000000..4f9acf2a6f0 --- /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 3d64aaf3bea..5f48b122e64 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 8e55bc2a4b9..987ba900bc8 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 345709eb7da..59e10a42c29 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 a1450518e0c..78cb21bc88a 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 66d3037b894..5dcac8b7259 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 1a24c883c04..f8120d8ebbc 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 e6d128d1e28..9167c8fcf5d 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 ef534d0e472..7093bebf9ab 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 8d51d5a7181..b77b799900a 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 5b5dcf8f3a2..26bb5bfdbad 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 93b781170b4..8ee533521e8 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 c2ba5a46525..aeb8cb7e4b8 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 124366ba241..721d25d09a0 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 874afb18584..59173e72fd5 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 333baab1ab1..19bbf8bf000 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 b37ad8c15a8..387c42a35b5 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 e1eb6ae77f5..da19c42ed69 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 00000000000..dd91b04bedc --- /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 66e791e627a..f39525f7068 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 00000000000..19d8de4bce0 --- /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 769f927ea71..dea1c36b5fc 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 b4b6e402941..2aa783f7a28 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 00000000000..44c5c6ca326 --- /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 8e4e7e560cb..457bba72bbe 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 521e75ab36d..975b62b3e99 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 26490e512f9..6dee20a0759 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 00000000000..b88be18bb4e --- /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 e6fe5707a0d..68c1e8c8130 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 4ebc4580ff8..2af76242410 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 f5f21dcfe48..a5893c54f5a 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 38133b1a476..fbc87c049c9 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 3bae7386c3b..3e0e523f95f 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 fa7f6745aee..bdf3bbbbe52 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 00000000000..c08ddcba48f --- /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 00000000000..d18d19806f9 --- /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 00000000000..385bb955627 --- /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 fbc87c049c9..c39d1760efb 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 620207c14bf..498a9605833 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 e58c6379e95..6989e7770b9 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 6b846703914..f85425c575f 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 0b5c8678f11..af323ecde1a 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 7c86a1ca6c4..00fd30b5278 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 76d62bda606..6d312bf8610 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 1f14beafd73..6971cc28fc9 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 660e8065966..ba9e971d02e 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 eeaf6f01262..7ae2ae818a5 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 0a17b5aab9f..a03bc3ebd00 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 71e94997b0c..05a9dee332d 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 89e0eb7fba4..5ff102ea480 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 e5bbe88edfb..ca04dbefb7f 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 75cc3126c24..ae50e14d40a 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 1bf239852f8..f87c66fe412 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 74ec59195df..3c2c03384f3 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 c39d1760efb..7cd4accf59e 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 6f013a52da0..92351e40108 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 928c8d2a2e2..19af428df2e 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 00000000000..c52c0f44f57 --- /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 f2b32f45304..45886a86ab8 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 00000000000..6c452164a39 --- /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 00000000000..3f8b8cc718e --- /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 ff071aed083..d1c9821f892 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 00000000000..4231e0268a0 --- /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 00000000000..dc6f2b5f52b --- /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 90dac7c7d02..df20bd5ca9a 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 285bac2cb4b..7af9dd35479 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 98c3012c123..b7925e0f728 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 00000000000..fd98cea97e5 --- /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 00000000000..b635fb6aaea --- /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 00000000000..b024071faf3 --- /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 00000000000..8d51025070e --- /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 00000000000..35bbbebbdd7 --- /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 00000000000..c3cd5c0c71c --- /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 00000000000..dac5995acad --- /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 fc089e64b36..81a4aaeb690 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 1645b78295d..f7296c9a4db 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 00000000000..84acd440044 --- /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 e9cb812767b..51be96633bc 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 00000000000..b9f694e470e --- /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 00000000000..f7a77f0d815 --- /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 00000000000..d34066b4092 --- /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 00000000000..bc338149d3d --- /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 00000000000..c8945c8e49a --- /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 00000000000..c92838ea322 --- /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 00000000000..b261c40510d --- /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 a05f57f4584..15d52149e18 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 00000000000..5083d17aca7 --- /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 77b842ba078..1ccf7aac06b 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 00000000000..c1fb1480047 --- /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 00000000000..d4fe2079d8f --- /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 4eee3f359b5..aa02e3046e1 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 f70cc72811e..3d9126610a3 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 e6e4415f16d..f2f95963cb7 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 bcb9ecac32d..02ac81cafd2 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 7026aef2840..a292c3b443b 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 ecd9ec405df..b22737519b4 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 162d6400fb2..f6e7039a908 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 c0c0c22f560..bf079e4c593 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 8e35b091b33..794f70901f3 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 86c6a2d2c6e..cd81d1862dd 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 dd31116212c..008d21c463b 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 02ccf930c0c..50bc8284b71 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 763c22499aa..0e49301198c 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 57eedd7885c..00000000000 --- 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 07c77b806f6..bffca81ab33 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 d20619c3df6..1e434cd118a 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 22df2e88d77..12b309b740e 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 06bbf1b764c..c7de86ba63c 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 c16aa9d52ad..3bb5d3ad4e1 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 9b21c015f58..949034e6bc7 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 e165b66f002..1e82d285eee 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 ab2d21195fb..baa749166de 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 1a477ca4d57..d1a691dc92b 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 254229d091f..606a2f0f0c9 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 9b56bc9f39d..e27083d2e09 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 535c5add3f3..6e3a5687db1 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 03708438540..bae8b6ff064 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 85d12844593..be7d0aa1d74 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 960e2f22af3..a47c1c4799b 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 0c1c50e493d..48b72d0de0b 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 b0bf08cd8fa..f801eedf73b 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 65ee5b59a41..50fa03f3e93 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 14ebb5ecb95..2a7e59989b0 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 bad618321e4..72265a54558 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 b0571bb7d80..1f14d91e04a 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 809d87e13cc..496b996823a 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 784fa3d0056..1c6a72f27c8 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 46dd3f25ded..fe328c05603 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 62537be6024..d364d76b2ed 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 124d2b19a4b..2187bcbc998 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 8c1078fb834..ae8ab0357f3 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 dfa66b5844f..f3d4344cd49 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 c7565881a82..d8ccb94fae7 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 13771825fc0..8d5229c9941 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 a486772139d..e093d02051d 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 12bc234fc4d..383afad1b96 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 1d92864aa27..47d8bce7e73 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 e269121086c..2b2a75ebc08 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 4c613a286d6..e3a89b8f418 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 185e9ab5498..f4ad099be83 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 d0f343a21f6..b9e22a7b042 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 2039f3f39ff..b637e0de13d 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 f714cee825f..3ab8573edc8 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 53ba28972ee..0029ad0688c 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 78471e703ba..5b325938411 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 0e6a005d3ed..e3e28ace1fd 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 62ceae7753b..efc9582e20a 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 7af3fffd09a..78512dba772 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 48f61ece4c4..95c14050a72 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 cb1cd5df8bf..60ab4cac7c4 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 10735b7f454..22d3f52c63b 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 d111aa9583e..663ba3a6680 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 e50a20aefcd..7770ce3d0ee 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 07ca5431869..53a0c160e99 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 f580e7bc1dd..347589c7881 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 8e4acd1ad96..2ac026d3001 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 90c9d4fc9c9..e3b74d8157b 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 354c69cd55a..00000000000 --- 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 8afa6eaed25..29ea3c0b952 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 5afa10f3aa5..f74398e9443 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 a5f0c6ce381..814df01b49e 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 0cd5c7d8da2..fc6e426b8d4 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 c0c77261e5a..3f4bd769eac 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 650f95198d5..0ca0b03134d 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 d6e1156b233..0576a466d7e 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 17a390fb575..c7b3aec27f8 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 fb7739546c3..2b639587673 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 7d55bd448b7..b182dc6b8b3 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 47157e64d96..a7300b16598 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 5346e2da3ac..f104a37a93a 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 bacd16f5f29..015df164533 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 4261608e248..e25ca1e5849 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 dc9b4833aab..2d5c5bbfb17 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 b9f694e470e..02027a84d8f 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 5c70e37ddb0..1764e6cc962 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 a3b34456b0b..6a3d79e0404 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 ef942394a56..76c12cdacfe 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 44c5c6ca326..4d9783ca1a0 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 4b257eca748..eb074e608ca 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 d1045e3eca9..f55ca587679 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 8692c42127f..2d4b530cd55 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 a79bee5ce63..b82761461ec 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 697b1466ef0..f78943ca941 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 d34066b4092..52e1d8165e2 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 2952c8436a6..962e8d35225 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 fc7f189bd0e..f3b5fd5c4c4 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 66ed7edff44..bb5ed671435 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 bc338149d3d..4949ec80ba1 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 ff7d2d82f05..c3a864565cf 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 44d3ec5f525..fbda22c5149 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 f905f7810d3..1c73e74902c 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 10e7e2e1400..0d1eabc1cde 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 9ba9bbf49c1..8c8c7b1e6ab 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 8494f350b2c..7d187994a24 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 7d55b1f304e..a679b2fdbb5 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 8a3d44f6229..36081fe967f 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 0577fc7d24e..6c90fdbaab8 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 d6dc5a3af15..97a945a5a9d 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 7ffb6dfbe1a..3d9d832c99a 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 4c78bbb23df..3f9ee75b173 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 31357050624..c8b938ebc6a 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 015b24848af..245260b0fce 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 ba02a718cbf..03b14c51a18 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 fe4b8540f4b..6d54e5a8be9 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 50570f8f396..7b82a658a72 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 82e62e7dd08..6e15b01e961 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 2b6dff2c0fa..90ea98f7a87 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 e5b81fe2c9a..b20ed95b410 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 fe12c6cedad..c7831e31ca4 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 d5119949953..41d303b7876 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 49d9e2974ef..f865ca00027 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 65d0462486d..1192ba544d9 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 3668209ac6c..d94b8965ce8 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 5c66562cbbd..7a15e5d35d9 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 11447a72d2a..3ab64dafa24 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 e2883db8d7d..0ce98c7c4d4 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 fd9f4c98243..f462f411bf7 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 f70795f2f63..8574f4f34f1 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 9052a228088..ce88766039b 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 d1324b9afb9..5f33549260d 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 e5ea812a132..ef8f49ab3d1 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 f5110e7bf88..75005e7cb37 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 c766993d454..96e0249df9a 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 50f29de9104..40f4e1f5008 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 be5aab88f21..8c1c3fa237e 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 700fd26aaff..d5f9d4e7ccf 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 17cb2ad85c6..7b294eddbb9 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 183892042b3..80c934c98db 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 ec4f7b41a2e..399e30446e9 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 a3773d83950..3a9766c207b 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 84ffc939937..41138029e60 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 908a122daa2..b4f5123d5af 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 1f69203992a..3900d0cb5f0 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 f02c5cebdcb..c3c9193df33 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 99d21c2886a..755ba7ae710 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 393d7f6b7db..f1bbad0ec0f 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 a292c3b443b..65d26a47f6a 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 00000000000..118a5c964dd --- /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 00000000000..8715bfb22a1 --- /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 00000000000..2c69d1c1bf5 --- /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 00000000000..40ccefb0c74 --- /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 00000000000..742f9231980 --- /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 00000000000..36ce7786de6 --- /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 00000000000..b138be83e8e --- /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 00000000000..e0bc56da9b0 --- /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 00000000000..c484ebc4589 --- /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 00000000000..1042bda1dbc --- /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 00000000000..57d644f0ff7 --- /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 00000000000..3a5c61dcebe --- /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 00000000000..ed2d6bc2fbc --- /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 00000000000..3e69ec05e80 --- /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 00000000000..dc8e2d498ff --- /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 00000000000..311b3516ffd --- /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 00000000000..cc160bf6e6d --- /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 00000000000..abca631cc85 --- /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 00000000000..aedf1bc5fe6 --- /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 00000000000..64159727e1a --- /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 00000000000..3021ac6fc08 --- /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 00000000000..39b69596915 --- /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 00000000000..38635ffa15c --- /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 00000000000..2c022f25ba4 --- /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 00000000000..75f35a48fd2 --- /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 00000000000..4a269befc24 --- /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 00000000000..c235a453619 --- /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 00000000000..9569b55f8a6 --- /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 00000000000..ca53ce780d0 --- /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 00000000000..25a9cdab104 --- /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 00000000000..c5dcc8f3087 --- /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 00000000000..73e71a0f350 --- /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 00000000000..73e71a0f350 --- /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 00000000000..5dc1e78a1be --- /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 00000000000..292b4186ce8 --- /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 00000000000..b3377bbf11c --- /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 00000000000..1be9e2a822e --- /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 00000000000..0ccb6b64fbe --- /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 00000000000..7d28e9b3a05 --- /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 00000000000..76ff4f8d5b5 --- /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 00000000000..41b261b92f1 --- /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 00000000000..679a9c0701f --- /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 00000000000..12901ae7704 --- /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 00000000000..1f16215f7e9 --- /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 00000000000..65350eea60d --- /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 00000000000..b36d7749f79 --- /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 00000000000..c9fbb307a4c --- /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 00000000000..fbedd03d808 --- /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 00000000000..c9fbb307a4c --- /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 00000000000..7cbc4542ddb --- /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 00000000000..f442b3e9568 --- /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 00000000000..6e49f3139cd --- /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 00000000000..c80dadbad5e --- /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 00000000000..c9fbb307a4c --- /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 00000000000..4a834715be4 --- /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 00000000000..c9fbb307a4c --- /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 00000000000..ae95841c3c0 --- /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 00000000000..ae95841c3c0 --- /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 00000000000..26d1b60db70 --- /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 00000000000..fdccc244391 --- /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 00000000000..1fc2c848da1 --- /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 00000000000..582aba7c247 --- /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 00000000000..c9fbb307a4c --- /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 00000000000..f7cd91ea130 --- /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 00000000000..6cf05d96755 --- /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 00000000000..6316af1892f --- /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 00000000000..715ef2c82d6 --- /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 00000000000..1210d512b35 --- /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 00000000000..1e5b40167f9 --- /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 00000000000..89d2b8e5aa1 --- /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 00000000000..63135ea5e1b --- /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 00000000000..ed650d75357 --- /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 00000000000..c9fbb307a4c --- /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 00000000000..c9fbb307a4c --- /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 00000000000..489ca490407 --- /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 00000000000..219b3168901 --- /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 00000000000..88f28fd40d6 --- /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 00000000000..c80dadbad5e --- /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 00000000000..c9fbb307a4c --- /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 00000000000..c9fbb307a4c --- /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 00000000000..518760278f2 --- /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 00000000000..c92e99488cc --- /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 00000000000..f442b3e9568 --- /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 00000000000..0b963871f63 --- /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 00000000000..83190e2c935 --- /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 00000000000..5bd171dfca3 --- /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 00000000000..2e7e568b00e --- /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 00000000000..140c06dbbf0 --- /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 00000000000..6189fc95e5a --- /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 00000000000..938dcac5fa1 --- /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 00000000000..48543378da8 --- /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 00000000000..a975126d9ec --- /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 00000000000..f39ec9e654f --- /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 681acd61015..3489c8bc866 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 f7431ee79f1..5a1552700d9 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 df5855b0cee..e482cce526f 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 410553fac93..c00fd6ad5af 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 acfd480e068..abbac44f2e3 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 6b83daece1e..feaef16fdff 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 053078c2031..ced57c4fdbd 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 d7be7f92480..76f06de9b85 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 1cff6db701e..1c4cfe00872 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 501ca5f4369..89b695da7d9 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 e3e80942bb2..414ffb92ef4 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 e27cafce1f9..857a460fa0f 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 cb75480e75d..4e8f6084b54 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 de52e9fe28b..580b1f487c0 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 f2c19a12a18..dc269b112d7 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 59b0c47ddb0..d7a25bb20b7 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 74137999700..1f9cf968fb0 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 2221106987f..505e1a850ec 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 1e9e403b00f..e0e6e131289 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 b75600bf2e2..d56b1335390 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 7a40f7b9410..40328574ba7 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 7b40e7ffaba..5120d529cb5 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 6d43dd7849c..90c3ddcb359 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 43fa21ce5a2..adabb83ab0b 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 d03b6c30321..3a1a73ac6bd 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 04c1c0eac6f..19c1a5ce6fc 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 d19eabc26ec..d9b5d81b469 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 10951367173..5a36b35d028 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 4c625cdaf97..8e4bc821fdf 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 9f20561b9a9..777e1e992af 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 fb818140f8c..c3c9aef22c9 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 981bb3f877f..95ce591747e 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 806d986f850..4c839fc9e18 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 5686ae42f15..4e3439dd624 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 8f8a98dc282..7c129cba3af 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 f40527697c6..5194e799b16 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 7504155ed6f..7b2886b660e 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 d8c1bd75d3e..605085af1f1 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 39c073ad5ba..8c83b8c024c 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 62d7bfac76a..7cad7c1ac3a 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 704ef784655..8ae4a5481d2 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 1687e393688..f3473fd3197 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 fcec0623ec0..d4e7dd2ec28 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 0fbdf397d96..76e8702e8fc 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 ab56e872157..5eaaeac8cfc 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 c3090fdd2c2..551c5cd294d 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 528f0ca6014..ab243699232 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 62507451e1e..43770d1767b 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 697fb332c7b..353acfe2fb8 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 3fe44b47c19..a454a38fbe6 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 fa22af87cf8..f91b2de241f 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 46079d04007..c42af14f030 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 f5eb89f9e46..5283797eb79 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 a9154d11f4c..9a935079d99 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 e94b35dfb56..f8edf64daa2 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 117bf40d271..9cf2b5d70fb 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 ae3b8cd7858..965b12ef1fe 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 f2ab2c7d5d6..3cc43883308 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 f5bdf90b9f1..971b4653be3 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 010f8dc827b..9b3a62331db 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 e329f1208a0..9fe84c532d1 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 c435eedd3cf..4a79f9cefe9 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 fb22747348b..d594922cd8f 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 5a08b7f07ff..d8866051c6c 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 0c50069f7de..82e4c122c33 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 2749cd65248..c7f2c32b4e3 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 14a73c551cc..ada76676ca9 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 d325b036ada..2c442f5c3a5 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 90571a9c6d4..f53113a6b6a 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 3ac89b1c968..268c82bfccf 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 55a12a37f09..c28790288ab 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 f9426000102..69e8ea6d380 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 2c50b00fc12..1a9463da15e 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 cc96048b378..8258c0e86ed 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 1784dd55153..1d2a5edd96d 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 6b4031efb03..376da5c3900 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 eb4169afe42..a655743685c 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 00000000000..558f49fb097 --- /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 00000000000..3e6de5ae7ea --- /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 a9342c8c477..3caca9aeac2 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 00000000000..3426337861f --- /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 5c33ac3c963..24af5bf3096 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 247a4e96da4..00c7bf78d8e 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 00000000000..ba8f7ec16fc --- /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 220034d23e1..7946020e1ed 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 2b319c4a8a6..265d423fee4 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 00000000000..d35aa5e86e3 --- /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 85b6be1138c..05f7a455dee 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 861d9c13273..bb52cc9d0c5 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 0acc0e5c98c..13c676dffa8 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 00000000000..a8fc08d0da4 --- /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 00000000000..6b9d2ee0ebb --- /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 00000000000..ea6d95099a3 --- /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 00000000000..282efed45dc --- /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 f87f1b79b87..a57315a9ecc 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 00000000000..bbf257ca18c --- /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 00000000000..b04df449464 --- /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 b249a16c9f1..d617a9d38fd 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 00000000000..aeeadc1438d --- /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 00000000000..fe0f0a10860 --- /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 00000000000..b21763c9beb --- /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 0857f0665aa..5bef0c6fff0 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 321bc442444..97cc34b29b4 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 6c0d32f42ad..c12dbb76481 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 00000000000..7de5a3c5b73 --- /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 00000000000..8391a34d2c5 --- /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 6f26cc99e21..f65ec99619c 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 00000000000..8901d664eec --- /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 c1125be31b6..6e54256780e 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 274aa8cb4c2..da6c981eeef 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 90b9b1d43d5..fd9b6b73086 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 00000000000..46bcb39baf0 --- /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 36705dbcefd..acabe6d9845 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 00000000000..6b479d22a80 --- /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 c817f7830ba..b1125b44cc6 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 65e4433f5a3..e0623464026 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 00000000000..85fe22c5768 --- /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 00000000000..541e5a658c5 --- /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 00000000000..821755f7f03 --- /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 00000000000..eb827764e19 --- /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 00000000000..c8b6740e26a --- /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 00000000000..8f09efc1d21 --- /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 a02ea1c1966..1d3a7a1efaa 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 29539f78eab..c2bcab535f3 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 e5b9b6f64cb..8747f1ed7df 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 12e125f4f66..9ce415cf8f9 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 e0c0c8ba0d1..d90bbc9154f 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 27a4106f3f6..2a587d46403 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 bdecd6454a3..de9fb58eabd 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 53a12848c0e..f39a1660bb9 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 30d5b4b6028..2f9be096d79 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 b5eeea46850..3e68336bf3e 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 e02232f0272..f8791895d50 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 6f696a7b1fa..3b866a326be 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 ea7e20a920f..7a2a60b1a69 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 d4527c69ba7..d27b903452d 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 bc26b8f5ff2..6b3feb4bd0b 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 efb460f0e01..94dfbefb86a 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 dd9004a6b19..3821a65e08b 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 b24954bb955..cc2197ffaba 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 5ce4086ce15..70743f68e4d 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 65b6198c9ae..96e3d92e060 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 e7c68a67b73..e76a714d5b0 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 1e9fe221fbf..d260691eb90 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 3f71608800a..da0430346a7 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 0039e484a05..3229e9f4127 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 2b21e1c0553..6fba5772a10 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 780599c2163..509b801fa62 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 93b9067414e..55fb20ef45c 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 7ec8e2418a6..01d6643b634 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 f62d3de9252..c16b0c10266 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 22de0b870e4..2da7a0ee4c8 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 6d4aeaf21ce..311e05fa19e 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 6ce77e0cd95..3d2b56ba466 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 2b782dd5c3d..17e6dfa9c82 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 ae69e238fff..e0df96e0361 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 1696fb3d6b7..69cb3f0e818 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 7187dfd0e84..1b0ae2a74df 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 cd3ad4ba29e..a1eefc78575 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 06429d200d9..e293b411226 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 f82c899184a..3ff8ed3da97 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 0490f2f7f96..2efd9f13549 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 0edb0b06e24..173b1c39c5f 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 75a12da869c..87934f8e90c 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 ddceeb5c5dc..b8a4f1ab29e 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 434c3007182..ae4fbe36505 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 bd9a4a659c8..10b7eebc38a 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 425cc1bc94f..d2c60aee5a0 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 0a5e46514c1..12272affdf1 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 4b915da3565..d88e9f9c9f6 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 f7ee20987a8..e6b95634827 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 7b3b4bb9f35..1991d053f6c 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 08137019284..83d273dc4df 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 e4d6c2c823f..c679b270e80 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 1054d22b2e2..53ad8c9094b 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 5ad62a7877e..972d1210f00 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 74a24d2f912..bb597971b0c 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 a53edc2ab4c..d3ac36bf0e2 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 ca258dbc9dc..56c8b5f718a 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 ee6ddcd32c5..a78bfbe3049 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 676f6f9dee9..0fbacf5ccc1 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 5adce28ab08..7c6be84d594 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 5a0255e74d7..fc092c7c247 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 59f8b132e74..f14d177e899 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 01cd9146f49..4f8f9cebe63 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 5159d8b9f26..e022fac3790 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 94e2e76d919..d46be650e2c 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 0a86c59934b..b8bf1b1bc03 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 7f47a67ba21..28d9743c073 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 d7191e0a317..da2df2461a1 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 1c992f4351b..3a5f2676acd 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 bdceb09daef..28d6ed8842e 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 bdbe41fbcf5..501af05c2df 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 51b6add6a91..2ba841ea139 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 6a0eae5d05f..5cc039b8e9e 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 67b85faf806..5d78dac5ef1 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 2ec3e6debaf..6b7e206d4c4 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 00000000000..533b050087a --- /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 00000000000..4dc0cbf56da --- /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 00000000000..76d41381eae --- /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 00000000000..af5a1d1c647 --- /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 00000000000..85ad9be7718 --- /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 00000000000..765ef3f1ced --- /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 00000000000..92f6c37c4a0 --- /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 00000000000..2e6c49d8993 --- /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 00000000000..364c1e6a7f4 --- /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 00000000000..377d161111e --- /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 00000000000..a9d5176d842 --- /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 00000000000..d42bb67a7cb --- /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 00000000000..d42bb67a7cb --- /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 00000000000..9c8a688873a --- /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 00000000000..1d581a8099f --- /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 00000000000..20d20198cff --- /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 00000000000..c0fe052d97f --- /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 00000000000..a9d5176d842 --- /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 00000000000..a9d5176d842 --- /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 00000000000..9fecfc15e05 --- /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 00000000000..22bca4eea0e --- /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 00000000000..af5a1d1c647 --- /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 00000000000..5af915af6a7 --- /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 00000000000..cdc8aef914e --- /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 00000000000..39fd058fbf6 --- /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 00000000000..578f496e7a3 --- /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 00000000000..b31bce51bfc --- /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 00000000000..2ad5a773f28 --- /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 00000000000..baf560f5579 --- /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 00000000000..a36d5e39803 --- /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 00000000000..7ce7b3aee43 --- /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 00000000000..1a6f96ff9e1 --- /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 00000000000..2e6c49d8993 --- /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 00000000000..4ee698511e8 --- /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 00000000000..a50d79febca --- /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 00000000000..d36d6a60c20 --- /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 00000000000..d36d6a60c20 --- /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 00000000000..8ba4a19e64c --- /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 00000000000..76d41381eae --- /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 00000000000..522cf4e238f --- /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 00000000000..109203867d5 --- /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 00000000000..a9d5176d842 --- /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 00000000000..dd710dddef5 --- /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 00000000000..1ec9bf6a48d --- /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 00000000000..5699356f670 --- /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 00000000000..616dac85b1f --- /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 00000000000..82e40903615 --- /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 00000000000..2a1a63c716d --- /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 00000000000..e98a4cdb792 --- /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 00000000000..fce4c42735e --- /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 00000000000..8c321e51ded --- /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 3006b8cadbc..3b5266ed09b 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 00000000000..e793b8a61f2 --- /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 3a3485a3be7..da64d5e4890 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 cb941e67883..0957dabe35d 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 00000000000..2ae1c0fe167 --- /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 ffa68b094be..be8ed7dd5f6 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 55a079ca42a..38f0975720d 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 00000000000..0ade7a09c99 --- /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 213d947236c..0db078b845f 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 f6f3a378eb0..60a844a1733 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 02fbc465252..9b7a4722087 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 00000000000..6dccfd6054b --- /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 00000000000..7870fed8bf5 --- /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 00000000000..960e5fa5933 --- /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 00000000000..a33c9bf4e8f --- /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 f5b2e2bfd97..ce5f0e4db8f 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 00000000000..63d106094f6 --- /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 00000000000..27f4ed3d2d2 --- /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 00000000000..afbb516a8ae --- /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 00000000000..e793b8a61f2 --- /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 d53e869e075..0286d3164b1 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 00000000000..d228e3312f9 --- /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 00000000000..0e75343c31f --- /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 00000000000..3b543a371c9 --- /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 db897b68da0..29c3f16a18e 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 00000000000..27dc24d0285 --- /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 733d3a8de8f..a6eed61f1b5 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 7120b1bb289..ecd276a8ec7 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 7668dfa5ac8..295919e27ba 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 00000000000..cbaa6c032e6 --- /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 04d40ecf9b8..552def8dbf2 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 00000000000..4f35d2212f6 --- /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 ef174e72336..e713441bb5d 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 00000000000..5b1e6642247 --- /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 caea4c6c97a..3a1401e7463 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 438822a97f5..8bf81d85033 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 fe1323c6744..5ca84a4b3a4 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 00000000000..597060def82 --- /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 234146e2e6f..25064209e71 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 ec5d57daa79..1e89b6eb75f 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 00000000000..fc106a12252 --- /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 00000000000..63a898f407b --- /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 00000000000..efa686ba703 --- /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 00000000000..bdc2f8a3788 --- /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 00000000000..d7b293c5429 --- /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 9ad8e67e6b8..ed74b1bf8b1 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 7b48833dd7b..5124c449d18 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 00000000000..a569c7548dd --- /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 e1735d81517..f46ff584d6c 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 9332b67d232..04ab5830739 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 6f709b38963..c6fe7db4439 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 7c24e94b552..afd0f0d758c 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 0468cb57f95..cbafa3c4b44 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 00000000000..d818bda11ff --- /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 077a39bb73f..33e8d71bd64 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 00000000000..99ab83a39c6 --- /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 8f8c84b952b..cf2c87f4c93 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 6c5e66765b9..bf96f4c3d58 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 c89e9e5964b..6d9edc1fcad 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 1067e85f1f6..fb1a1420397 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 8a01f48e7ff..6d453478083 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 5ee8c5eb77f..337f5b624fb 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 8c805c6cac4..7773a02d0b6 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 6e5b1668ae3..9dba52055ac 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 88c6677f1ec..77bdb4b6bf1 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 768d76deb8f..7631709d0b0 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 9b3c75bffb4..5b79c87c175 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 6ebb11f7290..d8d49b0b3ac 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 4563adfb0d7..2dfef67fb18 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 b2cd8953d69..c612e5f8986 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 4d888941fc1..94f23b8b5d2 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 3616626b123..b59501e8cfb 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 b921f2914c6..66c4df1ac6a 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 e1b7cc0aece..91085e32ba1 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 8843d7387a2..ad6372c423e 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 025fe7674b3..cf268cb4563 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 00000000000..ba22ae540fc --- /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 00000000000..bec892cb35f --- /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 00000000000..6552f959bea --- /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 00000000000..0f65da1b8f5 --- /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 00000000000..3209d2e34df --- /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 00000000000..1ef286616de --- /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 00000000000..89ab8601d0b --- /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 00000000000..ba22ae540fc --- /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 00000000000..ba22ae540fc --- /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 00000000000..a2481a086a6 --- /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 00000000000..0eac68d8a36 --- /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 00000000000..38a154a4b10 --- /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 00000000000..38a154a4b10 --- /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 00000000000..ba22ae540fc --- /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 00000000000..a478c39e279 --- /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 00000000000..15fc7951a2e --- /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 00000000000..9a11644e4ab --- /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 00000000000..ba981a80def --- /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 00000000000..01d71d8e126 --- /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 00000000000..5bd795c98f5 --- /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 00000000000..0f65da1b8f5 --- /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 00000000000..27caf391869 --- /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 00000000000..6ee3308d414 --- /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 00000000000..ba22ae540fc --- /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 00000000000..09c1bccc8ec --- /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 00000000000..38a154a4b10 --- /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 00000000000..f81d502bfec --- /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 00000000000..7e52dc3b9dd --- /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 00000000000..5c2ca2dd4a9 --- /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 00000000000..4048cac0a39 --- /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 00000000000..ba22ae540fc --- /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 00000000000..ba22ae540fc --- /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 00000000000..0f65da1b8f5 --- /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 00000000000..f813b69b68f --- /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 00000000000..c83427ddc84 --- /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 00000000000..c83427ddc84 --- /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 00000000000..0eac68d8a36 --- /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 00000000000..e62c8f2897c --- /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 00000000000..f529e83a594 --- /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 00000000000..83ba7739cda --- /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 00000000000..ba22ae540fc --- /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 00000000000..8194b8c28f0 --- /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 00000000000..ec9862732cb --- /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 00000000000..1e330ed3f57 --- /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 00000000000..6552f959bea --- /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 00000000000..4ee82e7a465 --- /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 00000000000..5b4f640364a --- /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 00000000000..3953cc14283 --- /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 00000000000..f3d16970c01 --- /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 00000000000..08b82064493 --- /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 00000000000..f1a15a7a821 --- /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 00000000000..f3d16970c01 --- /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 00000000000..41835346421 --- /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 00000000000..f3d16970c01 --- /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 00000000000..cc881ee406c --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..7203c2118d2 --- /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 00000000000..cc881ee406c --- /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 00000000000..e3c81d8bb6f --- /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 00000000000..e3c81d8bb6f --- /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 00000000000..1003a79e3c4 --- /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 00000000000..f3d16970c01 --- /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 00000000000..da13f0eb55e --- /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 00000000000..f3d16970c01 --- /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 00000000000..bbda5dfdef2 --- /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 00000000000..f3d16970c01 --- /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 00000000000..e1980ddd88e --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..dd0f2305562 --- /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 00000000000..f3d16970c01 --- /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 00000000000..b15ca270148 --- /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 00000000000..14b7f2226fe --- /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 00000000000..6cd37d2c0ad --- /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 00000000000..20799170308 --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..cc881ee406c --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..a72d99e23ab --- /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 00000000000..02fc2b75f94 --- /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 00000000000..cc881ee406c --- /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 00000000000..f1a15a7a821 --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..f3d16970c01 --- /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 00000000000..b11756de7a3 --- /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 00000000000..adeed7fbf39 --- /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 00000000000..f3d16970c01 --- /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 00000000000..f1a15a7a821 --- /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 00000000000..2636db35b4e --- /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 00000000000..5d04ffdfc0e --- /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 00000000000..1cc988e8bed --- /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 1a882fd23bd..746278595d0 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 bf99c857f73..0b358293304 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 99138d83652..79694e427ca 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 45dcec60231..3230e215bff 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 d2f01f33bfe..5a87e714bf6 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 2a386a2c08c..81ba0457240 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 f23bc80877c..c4374997d8a 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 dd52c6360d1..3a5f5653237 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 a98a23c7f0b..0e652624ef6 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 b004a2113c7..a4fef5a7c52 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 95646e7c7fc..019561c2b87 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 6d11110f1e2..e3f09f8b09c 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 28421b72e1f..83f0f959c71 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 80d59ed8f53..f4d66facce1 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 e7180c39a99..ba3cdc0645d 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 07660869dbe..f078c7c13e9 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 a5ebfa778da..c41b2407792 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 0149962a5e0..9ea5e36b379 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 dddcb786909..b22c25f1292 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 f51d51301e3..0c7d56d3ad8 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 ee5fddaff76..de041d89f81 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 2dff5973a2c..26897da5da3 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 76a9f0d2b00..25c0adf866f 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 2eb62fd0a18..dcf0391c420 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 1595f47e55d..4dd8c04c381 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 a44b3d91ed7..fae0cd417ff 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 9fde52f421d..eb4e930af86 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 c712eef6886..937604b1000 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 e430e4135c4..9806057716a 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 9d0e96167a9..7e75cfce4fa 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 906f939166b..9f834a98990 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 b95cab0f447..0b7101b5cc8 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 00000000000..89e000dff1c --- /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 00000000000..05fc8ce1119 --- /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 ac1b05b096a..9d918323c5a 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 00000000000..e8feb64aa87 --- /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 bde91c26b7e..5d6c73db059 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 00000000000..37d9647e01a --- /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 00000000000..0f0d63a675e --- /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 78731dd1577..cbb10514f8a 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 444c2cc460b..c48a617f678 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 00000000000..a4e6c9aeeab --- /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 2a56426e988..e759dd7525d 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 f3b861b9195..a7de025af78 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 e873427e694..25731f3b3ad 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 00000000000..6c81a5c1f76 --- /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 00000000000..4eb0277b457 --- /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 00000000000..307571e2bce --- /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 00000000000..592325be44e --- /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 0358a60f180..c4b087e22b3 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 00000000000..e8feb64aa87 --- /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 00000000000..19a1456e97d --- /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 00000000000..543b7d51251 --- /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 00000000000..e8feb64aa87 --- /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 38d6cc68822..dd7b55ba049 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 00000000000..9b63c0e17b3 --- /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 00000000000..7834c7ddfb3 --- /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 00000000000..8d3595d3163 --- /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 25a09b7d66d..566d431a7b7 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 299172958e8..769e0293038 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 2b6ca061fd8..a66dc687494 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 00000000000..70acb19f056 --- /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 00000000000..e8feb64aa87 --- /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 87e16c1c885..58f2c37536d 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 00000000000..e8feb64aa87 --- /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 f2a09eee3ef..5d9a8793c5f 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 00000000000..741ab50a8ac --- /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 00000000000..3633e0fb2f7 --- /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 00000000000..741ab50a8ac --- /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 6a9c52be209..04d324fb785 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 00000000000..2a1e7aecb47 --- /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 ecaf24fed80..e4a6c67cc75 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 51fe0540549..64e4c06d95a 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 00000000000..d96cc9128d8 --- /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 00000000000..f80100c2faa --- /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 00000000000..899c1766187 --- /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 00000000000..53b5ff7ba68 --- /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 00000000000..8602253dd86 --- /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 3459ef3b798..4be2137810c 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 28ff10f09f0..2e7c1839b08 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 00000000000..f4542971d34 --- /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 00000000000..b24fff873a8 --- /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 00000000000..2ac14a92210 --- /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 00000000000..099945f6201 --- /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 00000000000..ae7c391ec16 --- /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 00000000000..2ffb94dc973 --- /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 00000000000..f4db7378cf2 --- /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 00000000000..099945f6201 --- /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 00000000000..099945f6201 --- /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 00000000000..fb24cfd0b8e --- /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 00000000000..26ff6b741bf --- /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 00000000000..ae7c391ec16 --- /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 00000000000..ae7c391ec16 --- /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 00000000000..37e0a4ea1df --- /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 00000000000..ec5c8134eba --- /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 00000000000..d5527516e00 --- /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 00000000000..30355fa7e1e --- /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 00000000000..1989aecdbcc --- /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 00000000000..26ff6b741bf --- /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 00000000000..42c5ef0793b --- /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 00000000000..099945f6201 --- /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 00000000000..2ffb94dc973 --- /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 00000000000..011aa485dd5 --- /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 00000000000..099945f6201 --- /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 00000000000..e4b36d08778 --- /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 00000000000..c496e55f60c --- /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 00000000000..5b70415caf1 --- /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 00000000000..666a190572e --- /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 00000000000..0fdc255715f --- /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 00000000000..099945f6201 --- /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 00000000000..26ff6b741bf --- /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 00000000000..099945f6201 --- /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 00000000000..099945f6201 --- /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 00000000000..ae7c391ec16 --- /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 00000000000..ae7c391ec16 --- /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 00000000000..26ff6b741bf --- /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 00000000000..2ac14a92210 --- /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 00000000000..2ffb94dc973 --- /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 00000000000..099945f6201 --- /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 00000000000..8115938bd57 --- /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 00000000000..8be8e71bf70 --- /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 00000000000..8b0137018fe --- /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 00000000000..75194b60e17 --- /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 00000000000..29fea28b286 --- /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 00000000000..0bb59012189 --- /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 00000000000..de0ac733127 --- /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 00000000000..37ccced4617 --- /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 00000000000..b74d6fcd9a6 --- /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 00000000000..753558615c7 --- /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 00000000000..e0183cbce8c --- /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 00000000000..60795341d2f --- /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 00000000000..3bdf3862d6a --- /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 00000000000..8f7dfbe50e9 --- /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 00000000000..20d6f8fefff --- /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 00000000000..b27eaed6e90 --- /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 00000000000..aafff25ebac --- /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 00000000000..642c5a64ff4 --- /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 00000000000..54d9f55a046 --- /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 00000000000..2a05f60c1d7 --- /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 00000000000..bdb615bfc18 --- /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 00000000000..679432e2d4a --- /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 00000000000..8a4c2d9cd70 --- /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 00000000000..85516ffaf83 --- /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 00000000000..0a6f93565d1 --- /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 00000000000..54d9f55a046 --- /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 00000000000..05a5a43f511 --- /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 00000000000..eeccec319af --- /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 00000000000..60795341d2f --- /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 00000000000..863f34a2697 --- /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 00000000000..d7cd9c62424 --- /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 00000000000..3cc821278bb --- /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 00000000000..ec14e3986f1 --- /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 00000000000..7ee70b92f5f --- /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 00000000000..e2aec03cb12 --- /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 00000000000..b95eaea7348 --- /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 00000000000..714b1068844 --- /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 00000000000..b27eaed6e90 --- /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 00000000000..2b3dcdad5a4 --- /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 00000000000..b27eaed6e90 --- /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 00000000000..00e93934f92 --- /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 00000000000..20b82694d37 --- /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 00000000000..3bdf3862d6a --- /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 00000000000..c407b2a70b3 --- /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 00000000000..cb8c411d689 --- /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 00000000000..dcb27d50d69 --- /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 00000000000..8a24231aeb6 --- /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 00000000000..ec14e3986f1 --- /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 00000000000..8f3118176df --- /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 00000000000..35921d062e0 --- /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 00000000000..eaff1206952 --- /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 00000000000..713b6c28dae --- /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 00000000000..d8fdbc9b4d8 --- /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 00000000000..ca605ebd370 --- /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 00000000000..cfd34df797c --- /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 8c8cbf8f36f..a7fff4f036d 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 75b269eee97..fb256e52f88 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 99adbab2da4..56e7d591d6b 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 25dd4070453..5cd4b98faf8 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 f853e2d5a0e..b29decd38bc 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 587bae0d5e7..6c09ceb725b 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 03911b41cc2..e1da9263a0c 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 a3ed82dddf1..6835914c513 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 5007a0e42d1..f790e018718 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 552e90dd42d..33ac306ce1a 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 9deb850b020..cd9ac7a3970 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 dea49b78e7e..e010aeb3e66 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 feee2547932..46fb120375a 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 2d053c6b44e..328b113a182 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 7daaef692f0..8407a8429b6 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 25518b5efea..993a66539b2 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 3c779091721..d97fe244cda 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 8ba74734a79..60a26c21023 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 56c4fdb377c..a96bf8bd432 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 d91499dd0d8..c44da0ab21a 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 c9b42c49112..c368b5af561 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 3d00dd1f6c1..f2aee659bc0 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 d75a5ef4704..f388c734351 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 a96f48c970c..91bd835de7e 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 c2288786661..21a72d80f61 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 211c97cd68e..fcee85c40e8 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 129d96ee183..26b40e06ebd 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 13f65dbe413..e549a674693 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 b0aabd40c0d..916a3e1d20e 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 dff3b965586..359f15b3323 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 85183b917ce..4660aa81ca6 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 75e271a297b..7a39c547c82 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 80d1f452c3a..4ac4358dfc9 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 36ab96cb8ef..5bb92ac1172 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 5de83e5fb0f..22d5b893e42 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 00000000000..bd80a5fff77 --- /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 00000000000..da5bb48f0c1 --- /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 4651fb4aebe..8c7ff4baae2 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 00000000000..8fb2faafcc2 --- /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 1a0f0544698..cb42b906535 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 bed9bc976d3..447890ba7f2 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 00000000000..0c539f587b5 --- /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 29691b4154b..e4a4d62781a 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 9a9f0be21e2..dbe6c535092 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 00000000000..a45ed3b547d --- /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 e529d6e77d7..4bd1c90143f 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 00000000000..7d5ad113b22 --- /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 04efe4964e8..5232baf8ca4 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 00000000000..361a6957eb5 --- /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 00000000000..3985fed6db9 --- /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 00000000000..183ba79e064 --- /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 83bd5df826e..3033958d936 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 00000000000..1ba4c099483 --- /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 00000000000..ecc19f2f84e --- /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 00000000000..8fb2faafcc2 --- /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 5e91736a263..b6b085ce9c4 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 00000000000..8f24a7993a8 --- /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 00000000000..5a7095ea355 --- /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 00000000000..a62aa376d28 --- /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 1e2e85821a9..feda2c458c8 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 ae67663f46f..b0a10cd63c8 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 4cbbf348872..cea00af3e8b 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 00000000000..5cc8740ed32 --- /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 00000000000..91d23a039ae --- /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 472583687dd..10539d6204d 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 00000000000..d12951fe906 --- /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 ce035b2533e..fba3c760787 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 00000000000..4a016c9ec85 --- /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 6234d2685f4..2cfe9c76715 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 00000000000..876aefaf6c6 --- /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 97a8a8ba1bb..32073d7c3ee 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 00000000000..ca2ef720cb4 --- /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 818f17d58fe..10d72af13d1 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 906768d3eb3..1bef92f8dea 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 00000000000..dfa9112d5e7 --- /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 00000000000..6ffc0e869dd --- /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 00000000000..73d4b523b8b --- /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 00000000000..c1c4b89a369 --- /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 00000000000..f2d92c12f50 --- /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 00000000000..b576d350557 --- /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 d91010e974e..f525da61ff5 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 c3f714bf77d..dd80874adaa 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 f5338e85d3f..35d2dafd338 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 f8e21aa44bd..230bd7ecbd8 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 ad5fe4dc52e..ac7df0863bf 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 4540db5f257..f66f360d096 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 5069457a4e6..3facdce66d4 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 375a4b44fd4..b774ac67ed3 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 5a143252469..b15a9fae262 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 cb2118c3a0b..eef3afdc5ee 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 78cd905a417..72d5acd97a8 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 90d9c0b0ead..129da9b87d0 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 ccd4903bbab..4fab38c9115 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 c01c8a734bb..0e0db0c907c 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 c8dbbcbbba3..42d13cf6844 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 fc77fdc9d31..e4444c3f0c1 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 6e8a55d56fb..294e14b1071 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 b8ba5afe94c..7e8f0086194 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 a5ca34285d1..a7b57fcb757 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 005ce5910ea..f48d729b83c 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 2058992de2c..0825d6ed396 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 d8f55ea6058..4d01bb3e14c 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 92898ab0f9b..57b891d1adf 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 6bf389bcb42..bab54118687 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 84fbb180397..97b44175a23 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 a626e78047a..2e91223b27e 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 6be08699b82..9cdeb87ef0e 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 eb511dedf8f..07f0e91489e 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 01c1097673d..bfa31d93987 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 2732c6e94ef..9fbf86780b5 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 117fc3e3398..1a95816dab7 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 96c85cb4824..3f26699635e 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 e64ddeeaa00..ed756dbc2be 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 dd415341f5b..60772a762ad 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 85463ad1fb4..d14cf775ad4 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 e7c09897d48..9dd6fc8f831 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 ced8249c85e..4f2e6e8d261 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 5bb9a4997de..ef2688f413d 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 8978bb14eba..4ff508451d8 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 54487db6c86..d2c55261aeb 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 a7675305ec3..4007c23d2a5 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 bf52e00b9f9..193ad115b00 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 30264b9c820..bea2f2e0092 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 b08157ecbc2..b521fdc0401 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 18418b375a2..d48c695a340 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 5345db7b04e..84a4389657a 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 1d73892e2b3..759e6340edd 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 0798e8ae73c..1cf09bf8c0c 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 6cd97221fde..7d7ab2ac675 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 f9c2683ff53..933b48ca730 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 40c51f99d0a..07213aa9539 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 a7478239682..0d7cf62f26e 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 00000000000..b5f17b7b6c5 --- /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 00000000000..210306752bc --- /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 68affa5afd0..4546b7777cd 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 00000000000..e02959cb4a3 --- /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 3a95841559b..21bb882f72f 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 7e82f1a34f8..b03a107fb04 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 00000000000..a43481ced8a --- /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 d714b5b7d31..5313afe53b3 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 90a81db6b90..33e2d407f5d 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 00000000000..4a8c6db80e1 --- /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 1022608477e..7a9cad1d87b 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 cfbf7bcfe3e..2943fcb0e08 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 cfbf7bcfe3e..c9c5ab444bf 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 00000000000..343c22aa45e --- /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 00000000000..5df02049595 --- /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 00000000000..82c64c47046 --- /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 4c59d5ea1c8..1546d885b93 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 00000000000..d68f6442adc --- /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 00000000000..dba6c44f4c9 --- /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 00000000000..e02959cb4a3 --- /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 7302f40df9e..794eaeb2c62 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 00000000000..52323bd892d --- /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 00000000000..06d58c26494 --- /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 00000000000..55dfbb4dcc1 --- /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 112afc6689f..0cd34c90fd5 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 1834767222a..5202f8b6f1d 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 2c49f692662..204488d856a 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 00000000000..0e4d636cb52 --- /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 00000000000..574645aa537 --- /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 31ab788f171..73d583cdcd0 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 00000000000..420fab86493 --- /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 3930031ad38..1bdee103847 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 00000000000..299568d752d --- /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 8a8f662183a..193d1622f9f 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 00000000000..93c8ffc041b --- /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 58767361fd4..6bc3e75e0e5 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 00000000000..134b52d0475 --- /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 11d876883d3..36c1ca747ad 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 70287ad318a..df0ff63f236 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 00000000000..fce36c00386 --- /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 00000000000..259d2490371 --- /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 00000000000..c899992ba6b --- /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 00000000000..ca99ed4372f --- /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 00000000000..26d1be1972a --- /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 456e09ebf0e..83595d2b67e 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 6611cb0c279..e4adb451c20 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 e7b2842e0dc..069545d93c8 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 3d06f8cb9ab..17dd38ffb20 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 69db954c6f2..3ad8ba78c72 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 2d06efc2fa6..bcab485a51a 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 199a1a83d7f..cc65084d5ae 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 f5f1633dfd4..cc9eda6a968 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 b3e07c6fb26..1aa3d23cb7e 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 ff8394ee0e8..a25f2db891b 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 e4aef551359..81de11edbd5 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 c042737ff67..d44e7f60cc6 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 717f037a836..fe31d88e5c4 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 2ca23b9c420..ef49094efdb 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 d3a4fdc1862..a10adda6702 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 5590df8dab2..47395371797 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 7b97ce66a18..8abbc221b7c 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 a1d35e134d9..3b939a9f369 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 d8bac88ebf1..3d4ad4ca34b 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 18144097b48..e6ed255e6c0 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 c8e5424ee91..15ecb63392e 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 28ee1a39dbc..742302dcd17 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 5ebf8da8f7b..bd3ae17ae74 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 7fd74e1d008..8ae8cb6f78e 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 3943e5f07ef..a9c9316e600 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 e9c3621c956..98156c3c701 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 bd18159b134..0b3fa8f29e8 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 e7b9c7db6b6..e271497ae34 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 6e69dfe8253..a69cc9c32dd 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 0847d858f60..d165476de66 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 cafebc6426f..3c740c8966c 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 49b5bb311bb..8c3bbb94a8d 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 4b7bdafb9ed..1fb8b72cde8 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 62cefda80a1..9e0906ea2ac 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 a12229a12db..23010c90c1f 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 e83fb1547ec..a4538099480 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 a0919a77299..19387c68db0 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 98fb3f6519f..6546dafc133 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 dce019b8e33..9bd469ee4e1 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 fc31a6e1af2..ad9d99e555d 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 8776359503f..7e3ba803771 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 d87d5004a85..70717aef6ad 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 be74bc781d0..95a7cfb3086 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 0bd9fc1d9fd..c08c666d6f8 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 d721ba4671a..72632afed89 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 1c2d53870f7..b41931be828 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 04462798fc7..158b783406a 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 8baf1e12ccb..c6a638f2530 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 00000000000..336a40904d2 --- /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 d751f51edc3..b751d1bcf83 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 6fb6ef757be..773bc6bd11f 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 db6c064331c..916c700a183 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 c7db0e1cc0a..27af2cc0987 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 f9567c9a789..d0be33847c2 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 58c9624857c..a105296f813 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 988d789d3d4..26260e38ca7 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 6e783913f67..46e56ce8a16 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 c37646fa6e8..4910991e738 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 10591facd04..428ce782291 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 c946ef74a90..1973c3ab8a3 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 ab9bb411b5e..adcee0b0849 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 94c9e1f35b0..9bb62c258c8 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 b925aeaf26a..560fe4cf4e1 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 48d36c53fd8..c0fed1d075c 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 34650c72e1a..8b970c140be 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 fe382a39059..37c1f63822c 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 b674dc12260..ee84a98cf34 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 2004d82aeba..4bfb4e0ec12 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 983ae0351ef..db1ffa56c81 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 13bd7eb03fe..0a15bb12573 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 afcb56068d9..99ae908db6b 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 e56b1e0bade..fcebb7aaa05 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 7815379f662..1a2ff6d97f0 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 2e882321f34..46a008009b9 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 c18424d5421..3860a09de92 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 2c121e622de..7eca88dc2bd 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 4179fa962f0..6d9e8607676 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 62eb49896a9..50b8536ea05 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 8d01a111a6d..7c2e3cf4e9f 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 0bf3a87222a..7f027b63f8d 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 a23c9a442f7..2d60155cbb8 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 e35b89348ea..344c2c086ea 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 c8b723b7379..1684ce82433 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 768ef131847..a09a00b840c 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 7b637ee370f..eac8bcdb295 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 575ab28df49..f2b3001ae14 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 597381bcd69..87fe1df0633 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 6952472fe99..73ca29cdca0 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 7910b39368a..1574af9fa6c 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 0efc9044be3..784a9feb642 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 3cf4d12adc3..9dc4f4839b6 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 14a3681410d..6dd87e84718 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 abb3d984502..c9f3f0e1876 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 30e3922f0b8..96837972007 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 78350fab91f..6e1af6353f8 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 7da8538134e..6870ca4926d 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 eb0248625b1..45877e16992 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 00000000000..a815011988e --- /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 7df7404d73b..7362ec42e93 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 b2d8f845cee..c061f08b178 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 85b59110a90..f77d3957ea1 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 00000000000..9d6d417a053 --- /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 edc8fcd19a3..6cd1405b824 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 081275d3def..b8c245a66e4 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 00000000000..9d6d417a053 --- /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 62475b88a6c..c05e2d34f01 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 75d34e925c1..64262aa654a 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 00000000000..9d6d417a053 --- /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 3f58bf52048..b52dbc5a3f1 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 00000000000..9d6d417a053 --- /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 962a417d09c..7bbe61aceb2 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 003926d6d58..ff2f1f093c9 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 7459f7a1ce4..8159b3cac2e 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 f6aed1a1be9..b023bd03cbe 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 00000000000..9d6d417a053 --- /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 837d18d27ad..9c646def82c 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 00000000000..9d6d417a053 --- /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 8f50a6720fc..050c1222495 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 00000000000..9d6d417a053 --- /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 5eaac8bad65..e89f3360b32 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 914560f4a05..8d00a3d98e5 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 6e727e973a6..4edc46a372a 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 7cc1215f820..628fb01a2cc 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 900f255e74d..c04f0c2a09d 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 10e6278ac04..a2e56e09802 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 aca9bdb80e3..bbc56421899 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 a14be0aed6b..7a5e8621d4c 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 00000000000..9d6d417a053 --- /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 cd168681c7a..8361fa371a4 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 00000000000..9d6d417a053 --- /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 afcabd00eba..64aa9716f24 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 0f46cdce543..3c3a4a53f64 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 ceab9b6e11b..10520139bd2 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 00000000000..9d6d417a053 --- /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 79c9e70bcc8..ec22664e46b 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 00000000000..9d6d417a053 --- /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 00000000000..9d6d417a053 --- /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 128f1ebf9df..8c756a69686 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 48985734273..7495204945d 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 00000000000..4eb212a6a5a --- /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 00000000000..8f417f02abf --- /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 f678c870968..e20877e0253 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 00000000000..56bb146be2f --- /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 e2f3ce2b0a4..0f96ac99865 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 00000000000..21a705e17f0 --- /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 00000000000..a176c43186c --- /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 0c9556bfedb..290d2ab0e14 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 9c3559b7cfc..a50e53bef7b 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 00000000000..7eac2381073 --- /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 c27d983ca2e..a211308d68b 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 dd0c006d760..3fa024cb905 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 4ceefe9c721..477b7b47393 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 00000000000..42f2c242006 --- /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 00000000000..9205f5f38db --- /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 00000000000..7e843656062 --- /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 00000000000..15d8186b319 --- /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 e6944dab781..5317cd664ec 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 00000000000..841163d6080 --- /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 00000000000..4b76ba30b46 --- /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 00000000000..56bb146be2f --- /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 b559f29c581..5f8c57542e8 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 00000000000..360eb4af7cf --- /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 00000000000..057da694269 --- /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 00000000000..975cd23385d --- /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 4fab847f1cb..b3844afce19 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 dec2a711e57..f0af6a71bb4 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 f5170949bad..af051c19b7f 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 00000000000..33b887870d6 --- /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 00000000000..1cc3c49dad3 --- /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 4837b301ea7..641361bc5b4 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 00000000000..1cc3c49dad3 --- /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 709a63c2389..929c72732ff 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 6b95464bdbc..953726f0d67 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 ab78bc776bd..ffbcc229a09 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 00000000000..56bb146be2f --- /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 157c78975cb..9a52a68d44f 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 00000000000..21a705e17f0 --- /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 a2bca3352ab..aa112b4ed9d 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 c080d1b364b..ea1f26b6241 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 00000000000..6bba3eccb37 --- /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 00000000000..fae832be1fa --- /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 00000000000..0c6f96bcf69 --- /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 00000000000..48ad928b0a7 --- /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 00000000000..1582154a5b6 --- /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 f909bd8ac62..f6a592b67d3 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 01da8652b2f..57bb4bb438d 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 02061267cd4..71ee4fd2345 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 a07665dc9ed..99a10728890 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 33c17cd3021..ed24c552d8f 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 354f50b2a77..cf872da6de3 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 84052396d97..b44e5fd8945 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 5be8180dfc5..6d9974f9481 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 5cc83d418dc..fe67b5734d1 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 dd95b221da5..1440d3d0477 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 fb36e267f94..eb9b1261bd9 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 00000000000..9673cb6c960 --- /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 416fe27add3..cc7dea80e52 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 dc29217e3b5..c26c1f55b2c 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 4df27df0f6c..69e4fc0f478 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 5b20c4efca4..88997a89c90 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 f98770a7b24..cdaa475037d 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 c77bebd296a..fc90199664e 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 27001b0d9aa..a41afe3ebc7 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 f6a1b7e4b31..2692e9219e9 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 00000000000..3b8a17163dc --- /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 ba2831ad6c1..b4ff15d4044 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 00000000000..843794b8a52 --- /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 6299bc03980..b10552d0fe3 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 c49e8cd5ec8..264e0ed3038 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 a85f8e68744..cf18dce0870 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 1d309944557..15e18a8982b 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 20e7c6f60e5..3c62f33c3be 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 af732d70df4..3854823843b 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 8fd4287866e..11d27eebd69 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 b0e270572ee..9c86ce6a775 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 cbf680ffd96..eccc419c79b 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 c7757eb8ac1..0ec9bf70ecd 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 d917ba507ed..084dd70ee52 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 f874e519f6a..1bef863e15f 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 4503700bbbf..0a36450501b 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 8f82f6a623d..be643ab9fd9 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 f1cdefd721f..d128e1d2e25 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 01aed49ac2a..504c95290e1 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 31e8c09be56..f664ad0e1f4 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 f9517b8c00a..54d27e9956e 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 d60c1bf91e9..52ae403cca3 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 4fb7efbf52c..e14769bc670 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 3fa5fb59dd0..ce97ccccf1b 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 cf26729c63b..fd805fc4e4d 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 aaf67ffe8ca..70f4bf84017 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 507b7c164b9..4727a21db6a 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 d7e64cdbf8b..6a5b859c3e1 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 086f2032d85..e9b71c49c71 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 28206deade7..ae678abfe05 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 932dcf80a0f..e144ac994f7 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 1bd753fcbdc..b3aa4e6604c 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 ebc980860de..594cbffeaa7 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 f77b7c18a09..0f11ab2a8b9 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 aa1835d13fa..f13f62abbed 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 4dd50811ab0..db6359c881b 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 dd97a1e4858..cc59dfa78bb 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 aa66e0b2aa8..07d1a4bdb79 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 ccb2f2054ce..8b4d3522ce2 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 6a87ebe5167..816b44ceef0 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 d1bb6e48b50..df44a1d9fa5 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 172c6b26ad0..47eca9a7fac 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 1a281a0161d..3fad0146c13 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 8daac5abd50..1aeaf219288 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 bbd5d6f6a82..5125ce8c58e 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 9a543d20558..f2a09892a66 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 68b8ea06867..372a24c0b38 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 59b9a9448a7..406f8af58f4 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 9a4aa3e80b0..b9466944037 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 f567173702f..24c4e8a9b50 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 581b9886329..6688b68eb57 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 63bfc613d11..3e643c732c8 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 35fbd15598c..1bd9cf1a818 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 06f5c6f4c8e..315b1d3be8d 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 bec6897ed34..a91fa1cbb6f 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 8f9b5a16516..176ba84b768 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 0ac6edee190..c585ee467aa 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 eed200f12cb..dad5e9c77d4 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 e87ce684ac6..bb8160ed5ef 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 a43b2dd19e9..ae7f87b93bb 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 cdab9ab2b31..142f40754b9 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 488692028bf..026912e0d3e 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 74912d710f9..0640d351e53 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 50e8242c264..f1ed98f50cd 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 1ed4b842b07..16f973e5260 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 b4378620b14..bedf5f7efb4 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 e041048a043..ea9e1827b63 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 23205426c87..9180d3483ef 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 5c55feb0efd..1f715bf4a7a 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 a8a162e55df..c5b080f0dcd 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 434a86a634a..dd2a20ad61c 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 77067ab1c92..ba293c8c11a 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 30384a1a372..f18a7bd25bb 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 d86d0eb35e2..5be88f69e41 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 d6a474f70f3..4bf9f6b7158 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 79d0b591ef1..8b4d3e91f2c 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 213a1c19ba8..e97142a6e3f 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 0cd170cfd7d..a1ef4d41469 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 3ed0fbc8504..583712c6c4e 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 1a253b18f1b..68f73bcf089 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 efb3f5deda8..0de80cf346a 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 8c5791b0ed1..e448f9993bf 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 31fbeb84f66..c07f04cdb64 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 8d5cec07df7..b231629e856 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 f850c61bc99..482330099b3 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 adfccab84c3..4fb50788fc9 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 e6381bc4376..b14e0ded378 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 976c744e96b..80d891a441a 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 10d5a7023f4..9f08d6b820c 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 f516da66d62..7ee4f64431e 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 3464e03e56c..b1e20711463 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 d32e17ce6a9..b1040e9bc23 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 900b97c3222..1d697401b95 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 fcec44ea3a3..e50751ad49e 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 27924873597..8af45618a17 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 a779d8fbe05..b83162e0b35 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 525bc38bd03..8c3cd960b4d 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 3afe70f570b..fe24b6dcea0 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 5af610a48a4..c26033e1861 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 1f984054311..2692768910c 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 41a27d72204..e1d2bdb9f9e 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 1200bb174df..c566cdfb81b 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 256b21f56c3..9ee235ea2b6 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 dd420fc08f2..0d5108982b6 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 f2835c18036..73c7c1eaab3 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 64179ade0e1..17ce4a32b40 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 e124e632cfc..23a5640ae6f 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 72de59dafdb..904bcd68310 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 49fdfa21cbd..33a7f90b6a7 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 e143dd3302f..885c41957f7 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 8846d85233b..3abddb78c68 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 2ecc8c3a795..a587c9c0fd4 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 3896bca3857..1e451432be7 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 ffdd320ed16..d4442982e1e 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 1caf8c0d41f..0a5cea1819d 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 7825a4a84df..3d07ad843bd 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 433f3185642..a7c30cd9d72 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 6c9242872b1..b06c41208bc 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 1ed03922821..5702d3b33d2 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 8780c8160f6..e49fe2ebfe8 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 f749fb21d8f..2ad64efadc1 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 95043a6e9b4..66cd2393a22 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 39ed17bcef9..09fddb56225 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 a633e68e798..93c78b33db9 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 eb8969254c9..4d4b07f31cc 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 936cb10ce2a..ca94b617c93 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 71e09774f09..f01728783cc 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 3adc8dc3b30..a8bafa50119 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 c3bb9b1b7b3..0d75f83f9e5 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 c60247a6e5b..ef60201a57f 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 3c8a87902cf..dd9d151296f 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 9bffbed2d91..995ae9d3bba 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 efa2e69124a..69c34907f19 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 1b1099f509a..0330e8cef65 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 3eb56a46021..16b768fd922 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 1fd25f69efc..cc9be2d6ce8 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 df493fca339..ebb44dc1d6e 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 9c2197ba443..7e8d5af6d8f 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 37b580369da..d0e318a0454 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 965a21b892e..4aba9293bd9 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 0ede723702b..c2f2b9d473a 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 5ba05b639e8..dd593c4add6 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 41634ec4d23..b0dcfe0c36f 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 648ab7824e9..d87bcb536cf 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 1dd99a1572d..081b9ebfda1 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 6e77b882211..c4ead9e6aa6 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 88286d42815..dd7c3711e37 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 5b714dcd6a4..56843e752c9 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 9679e19fabf..aebd839a837 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 11a0eb5ce2e..d3420c011ca 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 53d7bc89e89..e14b3a9ceb0 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 cebd8ffcd2c..3aab63489c3 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 ee7b32d7030..46bbb231483 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 fecd6608d4b..a6d855dc758 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 e46aec17902..0c20258fba4 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 34cf0a4f951..65db2a5a300 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 eb87d9de8a7..6080cf11c5e 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 a293b4297fd..8c26f19ac5b 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 72b2aaf868a..e0848849758 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 d0bcc4f61f4..a69ac61bc98 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 d47cedda6a6..c5cb3b737db 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 7e0d87fa3e1..2b3dc0f67fc 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 9ec47e600a0..76cac00025f 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 8bae8adaeeb..6362914f52a 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 216ba66d20b..de430273ba5 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 abf5f100fd7..fabf2477590 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 ad1a304dcfc..1d33f450699 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 23b0e19c2aa..db53fcff973 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 147075c19f3..f6934cb5e4f 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 80955fa9e32..9e410084f81 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 929fcf40887..cb363a7dfab 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 1f77f9e7743..ad6a6e10ab0 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 c5df2742338..bb1e217133a 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 ac6a232db3f..a3727721b2d 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 5fa28a09e7c..845c0968827 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 a43e5f7ced5..2b573170e69 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 0f00578a96e..9eda02551e4 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 67024c06635..2e2458cb8ed 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 af4ae8a2900..000b5dae306 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 75f58fef9bb..43a16be8d79 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 2337638a89a..9fe98107510 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 53b138535a1..8df85c6dc67 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 06f55e3dcfc..e112a2c682f 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 00000000000..755da4e86fb --- /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 00000000000..0274345b0dd --- /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 00000000000..dbe9eb15946 --- /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 00000000000..ddedd5e0a19 --- /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 00000000000..4d3cabae91b --- /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 00000000000..dfb23d2c61e --- /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 00000000000..60260ba9619 --- /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 00000000000..b41c930ac9f --- /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 00000000000..b41c930ac9f --- /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 00000000000..39521a87a0b --- /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 00000000000..1a85d1ddb3f --- /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 00000000000..c3c49f56eea --- /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 00000000000..c3c49f56eea --- /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 00000000000..4ec00acf89d --- /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 00000000000..6862a085612 --- /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 00000000000..77445f57da2 --- /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 00000000000..d92d58bb302 --- /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 00000000000..f18765d86ba --- /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 00000000000..b41c930ac9f --- /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 00000000000..0a96e99d303 --- /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 00000000000..debda9db895 --- /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 00000000000..ddedd5e0a19 --- /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 00000000000..0ae5c0d3f15 --- /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 00000000000..c1398138df1 --- /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 00000000000..c6d0480b1b5 --- /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 00000000000..89c542cacb0 --- /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 00000000000..16eb80c6bfb --- /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 00000000000..e5ad363cc48 --- /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 00000000000..cd50cc2a158 --- /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 00000000000..b41c930ac9f --- /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 00000000000..ddedd5e0a19 --- /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 00000000000..b41c930ac9f --- /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 00000000000..755da4e86fb --- /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 00000000000..b41c930ac9f --- /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 00000000000..ddedd5e0a19 --- /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 00000000000..c3c49f56eea --- /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 00000000000..c3c49f56eea --- /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 00000000000..c6d0480b1b5 --- /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 00000000000..4478fc5ae10 --- /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 00000000000..dfb23d2c61e --- /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 00000000000..dfb23d2c61e --- /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 00000000000..4ec00acf89d --- /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 00000000000..4803077aed8 --- /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 00000000000..e8862d529cf --- /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 00000000000..c6d0480b1b5 --- /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 00000000000..dbe9eb15946 --- /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 00000000000..83a77447dc0 --- /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 00000000000..7f17036379a --- /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 00000000000..068bb733693 --- /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 c425e515f55..09ffce392a6 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 291e78095dc..a186723f345 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 40972b3b93f..6b6d430307e 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 928e9899dbc..e490c33805d 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 1688e3cb262..5602713d245 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 63d52f53b9c..bd2170a0f92 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 728a0d7ee62..9ff97592d91 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 dff49298166..692df44c5bc 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 87779947d9e..b1c29f3577b 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 11bf6161646..2e8bec54c34 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 485c453777a..c3863a860f4 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 55a48f1df1a..ea7fd49a548 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 4f35153669e..1bcfeaeba50 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 03bcb57aae5..094280da4ef 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 73fb9b3722a..4a5af0779a2 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 6a28fe831c1..fa146adde23 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 5133b66cd1a..fac77660251 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 2103b6c38a0..883a53441af 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 f0350e81016..9402687b8ff 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 0c685c3020e..20b17ec37b7 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 bc4e518b1f3..3f8fd23b07c 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 442c5736c16..d85caeb2bbb 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 715937b678e..682d561929c 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 c247654c7ee..580c858d15f 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 7161f3b5d44..853dfa1487a 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 be4faf69a43..f9e5ec14c54 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 ffb8ae30d3d..46d1de99c73 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 1cac51a8393..1619eaddb63 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 3a00a7b36ad..a7c520c400c 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 a879b74fd80..ae640f12870 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 b35ebcd587b..17964db6824 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 7d0691169c5..a5d96ec7ef3 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 3021d70024a..4343ec3139d 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 ff079e03122..8095fa05156 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 ac628f7b012..3272c8941c7 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 25ce58b97f5..abcc0948835 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 7db4f98d7b3..9cae0663208 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 7d7d3688e6f..533c14097a5 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 a7009c5ebc6..85b61f923e1 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 00000000000..9c99ba98bb2 --- /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 826e7288bad..5b4171de5cc 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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..d8a4c453015 --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 00000000000..981cb51c83a --- /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 48efffbb7ee..4f52830af09 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 eb90c5ea04c..02e8e22d920 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 5d742100cfc..b395497d67a 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 5358c356523..bbd0d8beec7 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 c5b98770d62..3227e5115f9 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 1c48ceea5ff..01338dc5af3 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 6523d44639f..b79871d487c 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 29afed9c438..7f76c932c71 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 645c09105b8..8cd10b3c246 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 7f6b8b97666..2e6cfab035b 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 c8c356e4a91..1e7902adfb3 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 7b1040ba5d8..de124207d64 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 c7a55288057..f3e9dfed7e3 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 24ea5ce4f58..8703148b3f8 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 0c070f322a3..25588d79e01 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 4a51f553726..fbba14d88d6 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 1140ad1ed8f..abacf5c8ca1 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 19dde27a164..d0c219cefa9 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 c5f01b15547..9983242b349 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 574c9f767e8..76fe3aadc5d 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 c0cae40420e..8215388a161 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 4eec6bc1481..01ca002dd54 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 c3c273c777d..607347ff9e9 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 c452b53bef9..a0aef80e031 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 94aebf87021..d75ffed4c56 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 70d07ba36fc..e42d91082e8 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 71b5505ebd2..ca0738ec9a8 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 ed7dca2f487..c9c4270360a 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 1683d00b430..dafe3836a50 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 963c23e4062..389653422fd 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 2470fc975da..3d878ed40be 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 c734a9ccfe0..18199edf856 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 49f910154c4..cdfbb069c0f 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 7e320fbe9f8..9fef289f545 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 d672f73d77a..65c9968dc1e 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 45dfbbf8bfd..77e5c6298eb 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 6fb23ac800c..bb406e90f92 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 4254aa260be..d24c8398652 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 c650796f23f..01d484075e0 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 912d3e4b7b4..44feda4fffc 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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..d4578360f53 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..d8a4c453015 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 00000000000..04b5b760f60 --- /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 c60ed155569..f4ffbf157bd 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 eeeee01bcff..dd04e1e8250 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 02df0946bef..4cb5e8d092d 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 3b4f99c6a9f..efb73dd6e7f 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 8056e4ad5c3..a520aef37d7 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 894bdb6dab2..f3ec84fe3af 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 2b7d7c17269..26ca6eb60d6 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 d9d9a90386e..a853d7677c8 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 f7d36fc4aa9..a017a5a1df7 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 fd3e8189af1..08bd179b4f9 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 07aee5dd625..212a6d27796 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 d404c85a90d..9e650e132fe 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 3817766103c..a410d9e28b6 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 c7b7857a86b..8c99cddf6fb 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 e35e02de479..d00f082d2ed 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 a3437c0100f..954aff55b63 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 6c7acc9889f..393a0689bff 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 aafc2bf1a9b..af5b37773b0 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 6884739e818..c4154e74897 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 4465c4f88a8..e6a506a7768 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 e7154eab4b5..7c0497c2d43 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 3bb9119a036..5f7fc81bd9d 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 787aade5de7..649530de53c 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 cd75b53bce2..58ee71e722b 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 96ac18a3c02..a0179dfc90d 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 c21a0f65789..85c71ca3fad 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 4165e254658..02781ba48f4 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 6925307e258..e457ce1631c 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 195cc641405..5c765c83bb9 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 a02b97ea047..762132a459a 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 f75445e66d1..6ba708f2b0e 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 0d047af61ac..e07499b0073 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 cd54a593399..d3a9aa3efbc 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 faa0284891b..3a66c447e54 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 14fcfcd8f1e..495ddb81bc3 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 1921dbdf1dc..39e8b1045b5 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 30c4dfa4a38..485a29f5a77 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 7f08dbcaee4..9f5a2cf04b2 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 732c8bbc98e..28885b9435d 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 3d894048d01..25846f40b7c 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 151214011f8..0a1ebbf2ea2 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 1d16002e294..77c212c10b8 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 2613b66eea2..86e6e4e5853 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 db95d808fe4..a55c5933260 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 fab87f065f3..6e4c34c095d 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 13b70516cc4..fe4a8db5d06 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 88aebcdffd1..3dd267ed731 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 be95e0e73ad..4094733ba62 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 f73ca791153..76db584bae7 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 1e1312b096b..d0f625e7344 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 76afc8c3373..d9070c7c295 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 7e1f32135d7..fa966b7d0f4 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 41340856a6b..031076172ac 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 494a7217de2..c2b667431b6 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 02360d9a7d6..e250da7627f 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 299f50a6780..8b2b90456bd 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 eb04cdcf9fb..550fd805bcd 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 5362594e4eb..92553c84cfe 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 5d4bd86cc6b..5b3efb94559 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 125ea33a0e6..3b03fb84bc3 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 05be972a510..aa28e012caf 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 52f89dc460b..80e90f16be0 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 0e2cac536b5..2af5753f654 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 352da3409fb..fff0016a46d 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 ef2d27ccb80..6c4290140dc 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 09fd044a1fa..31bf427196c 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 a0f03689a21..cbdb31e3b36 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 5c717391c74..346bc8af9ac 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 14e5b5cbb9d..01ca31cec2b 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 2ddeb89d6b8..a0873737a7e 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 aec784bca4a..fa9f3f5abc5 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 c37f8ac9dc9..251ee74c9de 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 422dbc94aa1..dd465659567 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 7850a0cb0b2..055cd02dffb 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 1de7280fe54..19908402098 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 53a59c63d92..cefd7393f2a 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 3b96ff44c28..894c4f9f988 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 65b36418d2f..3de410802f3 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 c7ecdd85e20..f3b763c7b0c 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 dc48222b5f9..b7ec9588b3e 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 70d4247f40d..4da913f8e24 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 ef90886054f..b86dd4358b0 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 ae5c6ecb1d3..1988db1767f 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 d3e6fabb2de..2b9e1068b60 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 8cc1c6ed450..bebad01c319 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 593f41e0e15..74ae609c0d2 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 7a36a49f498..60e9634acce 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 0ce1fd2eead..471b21cdc9e 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 8fe750b661d..23b3602744c 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 5effa2b9627..b0d193254fa 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 80ce76009af..a83dfe806e7 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 d607343fe20..622cf931cba 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 22a0d636415..dd8ca0adc30 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 853b3527c9d..a5d75662546 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 d54bce408d5..73e988139f9 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 aa4c31d0ae1..4bab2dda632 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 abe05d9c37d..7161fec645f 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 81d907c4824..ade0c4a3bd3 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 44419d333ce..1c179b25322 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 80f2612bfdc..0b06ae422d0 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 2425a37207d..0e944188222 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 8b6ceb83f58..49bd9d612eb 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 c017f0a93d7..cce095e0298 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 9dc7b767e21..4dcf547619c 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 60c38947336..27429081e1e 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 0469853fd70..a39940d42ed 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 3ee3f7a24f3..b6e9abe94bc 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 5db8cf1fe6b..bbfb1fe32b1 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 c111234ed37..84691ebd134 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 ef1dd82f342..f1384df73b9 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 636a2dd8694..a4c7f1f8d9c 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 f9e45c8af8c..53a0e0090dd 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 f55a5d4ffa4..c8949bdc16c 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 6ee3355dfed..18ffb070948 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 72c0717d85b..3ca8252a558 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 85159952476..0fed17b7ce1 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 c2a8ac510db..f917bfedd60 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 90b0574cb2d..674757b92b9 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 d4aa6099d0a..29f9fa29fe9 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 107657e9cfe..1f14283a05e 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 3b0e2d4b9ef..109be40acca 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 e5e5c2439ad..1633f091a6e 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 a5fdd0a5b1d..5a54f5a9aa5 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 3d88caa84f5..097ecad5b79 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 4f2c6fb52d4..7160627e544 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 132d4f116cc..823801e9743 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 41ee9b50479..560c2c84064 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 c93c6823e46..ce037f1c5c3 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 7bf28893252..30dd8b04c11 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 1560b7c8996..a13dd946a3e 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 2e913abf64c..f6ebaa0e7c4 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 d0218da5b2b..23bf7895ade 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 ad11a9b72df..54c2f71f40b 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 e9aa35f5d24..47bf2c29a16 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 d96a34454db..18e0791b187 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 e29c103de9e..f32ced997d3 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 1025bedcf7d..36e75204e92 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 d2b7e6cd792..c78fd1090ad 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 62b767524a5..83a5a4567de 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 57c1d1a8d91..6de7b1f4f27 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 bf8c63c571b..e58bd80af7c 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 f51ab3954a5..8337aa82479 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 00000000000..15f4ee4a228 --- /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 00000000000..06862b4a626 --- /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 00000000000..8bce5cce6d4 --- /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 00000000000..fcfae2b4d67 --- /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 00000000000..ecd84483d1d --- /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 00000000000..86c01e96a9f --- /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 00000000000..ed5077cdca2 --- /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 00000000000..c191ba65252 --- /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 00000000000..dbac7284832 --- /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 00000000000..dab56cff29b --- /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 00000000000..54e00868393 --- /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 00000000000..abbb60ec223 --- /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 00000000000..abbb60ec223 --- /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 00000000000..add6434b024 --- /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 00000000000..0782c872fc9 --- /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 00000000000..113626f41ec --- /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 00000000000..d902beb7479 --- /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 00000000000..5a5fb880a27 --- /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 00000000000..b54f9ef1afc --- /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 00000000000..fcfae2b4d67 --- /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 00000000000..8e6fc147065 --- /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 00000000000..5911e500645 --- /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 00000000000..19e3a64dcba --- /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 00000000000..cfb4b6144e6 --- /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 00000000000..ec0bd86fe87 --- /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 00000000000..0f90ef2df51 --- /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 00000000000..baf495d13ad --- /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 00000000000..0ae600eeb16 --- /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 00000000000..cdaf3b4128b --- /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 00000000000..15f4ee4a228 --- /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 00000000000..e5e3c7ffe98 --- /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 00000000000..c8a2c98ee1f --- /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 00000000000..96c31ffda19 --- /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 00000000000..96c31ffda19 --- /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 00000000000..f5c041230d0 --- /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 00000000000..351f89c4343 --- /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 00000000000..4d38e1f8c4f --- /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 00000000000..b20e427a352 --- /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 00000000000..9aa4622a971 --- /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 00000000000..a00e3b6a8e0 --- /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 00000000000..97c0283501d --- /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 00000000000..ecba43fe4de --- /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 00000000000..fc353e04967 --- /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 00000000000..de0ffe51490 --- /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 00000000000..9d4f10ce0a3 --- /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 00000000000..9e4bd590859 --- /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 00000000000..f5bbc92c4fc --- /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 00000000000..cf0a52133b9 --- /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 00000000000..6ca01629e66 --- /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 00000000000..12893142352 --- /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 00000000000..6b5bdac6b71 --- /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 00000000000..63ddcc2cc49 --- /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 00000000000..fab62477d57 --- /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 00000000000..0331e29f37a --- /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 00000000000..29b5b3d1f45 --- /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 00000000000..c06686e7db4 --- /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 00000000000..81d89eb53ad --- /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 00000000000..6b5bdac6b71 --- /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 00000000000..6b5bdac6b71 --- /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 00000000000..eb5f6b8e651 --- /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 00000000000..c8d78581a4b --- /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 00000000000..2710baee30d --- /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 00000000000..4b01ea6066e --- /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 00000000000..d2b33ef935c --- /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 00000000000..8e692afee12 --- /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 00000000000..b9e7c7826bf --- /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 00000000000..81d89eb53ad --- /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 00000000000..92d2f41d806 --- /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 00000000000..acc0dd2ade2 --- /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 00000000000..81d89eb53ad --- /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 00000000000..4122af6a37d --- /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 00000000000..bd252181db4 --- /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 00000000000..b9e0a40035e --- /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 00000000000..a6535cc544c --- /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 00000000000..e10574b1e68 --- /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 00000000000..e3908eefa7a --- /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 00000000000..786980e5a79 --- /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 00000000000..7e75ea439b7 --- /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 00000000000..6b5bdac6b71 --- /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 00000000000..bfca0cadaed --- /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 00000000000..7f4de4021aa --- /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 00000000000..33ccfb0a3a4 --- /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 00000000000..a62957781f7 --- /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 00000000000..4c7c0eaeb22 --- /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 00000000000..fa235bcc11e --- /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 00000000000..d48149c6556 --- /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 00000000000..355cf7e394e --- /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 00000000000..4c153798016 --- /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 00000000000..a8ae01ea81a --- /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 00000000000..fb601442b65 --- /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 00000000000..a7c564e9001 --- /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 00000000000..c5e809e7e85 --- /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 00000000000..af6bb4e8dcf --- /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 00000000000..110852b9142 --- /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 00000000000..8946ef71fdd --- /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 00000000000..dd819183296 --- /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 00000000000..570c7b17592 --- /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 00000000000..810b63fdcf9 --- /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 00000000000..08ff0bf4e65 --- /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 00000000000..ffff2a6597f --- /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 00000000000..79c01a21fc0 --- /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 00000000000..9de1e52eeee --- /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 00000000000..54c8ad79368 --- /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 00000000000..e86a07db952 --- /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 00000000000..025943ee4fb --- /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 00000000000..e72e7b10288 --- /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 00000000000..2e81fb69eeb --- /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 00000000000..385584a5e8e --- /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 00000000000..26c1983d162 --- /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 00000000000..14c37289ac3 --- /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 00000000000..43f76822683 --- /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 00000000000..99600fedc7d --- /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 00000000000..9d9d0cdb3d7 --- /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 00000000000..fa1b82196bc --- /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 00000000000..c5835319547 --- /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 00000000000..22c089f8f0f --- /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 00000000000..dbc7d7f3662 --- /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 00000000000..a5984527e15 --- /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 00000000000..f3970ce802a --- /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 00000000000..d3641924ce2 --- /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 00000000000..c22fa606524 --- /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 00000000000..a8c4d08abd0 --- /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 00000000000..673793f919a --- /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 00000000000..9e990791ed8 --- /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 00000000000..ede9ff7bd1a --- /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 00000000000..b4d83e081fb --- /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 00000000000..6b9dfbd7717 --- /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 00000000000..51eb69a073e --- /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 00000000000..65becd11953 --- /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 00000000000..13933457561 --- /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 00000000000..c3657e30efb --- /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 00000000000..8df80264846 --- /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 00000000000..944a288f773 --- /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 00000000000..1b0c21d3029 --- /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 00000000000..bd087e535a5 --- /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 00000000000..f1bb56d3bf0 --- /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 00000000000..7b80fb16d4e --- /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 00000000000..631f486d463 --- /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 00000000000..21588860453 --- /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 00000000000..972b4007387 --- /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 00000000000..3d9ca48933e --- /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 00000000000..32be17c859a --- /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 00000000000..cd3606e03a9 --- /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 00000000000..c639bae22f0 --- /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 00000000000..d9cb424783d --- /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 00000000000..5108e16efcb --- /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 00000000000..51a7a178a09 --- /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 00000000000..04e57ee945e --- /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 00000000000..4f474990db0 --- /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 00000000000..dd280ee7c6f --- /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 00000000000..e05a9130580 --- /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 00000000000..f4182fbb3d5 --- /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 00000000000..a5a7b0c35dd --- /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 00000000000..b521ec9fed3 --- /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 00000000000..22045841160 --- /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 00000000000..6fff8ef5e31 --- /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 00000000000..abcbfa4f52e --- /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 00000000000..0a909c435f0 --- /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 00000000000..766e7458244 --- /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 00000000000..e39ed6234f1 --- /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 00000000000..4c533f5eac5 --- /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 00000000000..677efd751f0 --- /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 00000000000..c635f1d295c --- /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 00000000000..68960733dd8 --- /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 00000000000..7d2ec79080e --- /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 00000000000..6268cf2df3e --- /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 00000000000..c36d2b6aafc --- /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 00000000000..c5cc3712430 --- /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 00000000000..65240785840 --- /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 00000000000..4ef827032d0 --- /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 00000000000..e31e0ccc72f --- /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 00000000000..5c6efb211e2 --- /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 00000000000..d519b992eb8 --- /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 00000000000..64c8e55f836 --- /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 00000000000..c2449db709f --- /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 00000000000..09988294d46 --- /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 00000000000..981034c73b9 --- /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 00000000000..1ca8fbd4ec4 --- /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 00000000000..ec93697dc3b --- /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 00000000000..c1805180884 --- /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 00000000000..0e4265d7ca0 --- /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 00000000000..0fcc548a682 --- /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 00000000000..b230db9fc60 --- /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 00000000000..76806d23a5c --- /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 00000000000..3c6b44d43d6 --- /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 00000000000..af85b8135ec --- /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 00000000000..73689e0e6d6 --- /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 00000000000..34a36e0cd81 --- /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 00000000000..8a20dd83cf5 --- /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 00000000000..c36a4687fda --- /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 00000000000..0558e76de4b --- /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 00000000000..7354ebf3d77 --- /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 00000000000..8b58030eded --- /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 00000000000..0832123d47f --- /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 00000000000..e74785ed24f --- /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 00000000000..ad5d4266d2c --- /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 00000000000..ad5d4266d2c --- /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 00000000000..22378cd35a0 --- /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 00000000000..d55843eddae --- /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 00000000000..4f9dfdbf6c1 --- /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 00000000000..e93b725dc49 --- /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 00000000000..6fb50ef1c67 --- /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 00000000000..822ba13d9a4 --- /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 00000000000..9927fb325f1 --- /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 00000000000..d528d526afc --- /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 00000000000..296e047ba06 --- /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 00000000000..fb8243c7f3d --- /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 00000000000..87462c94213 --- /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 00000000000..80f397dd89e --- /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 00000000000..5620635d903 --- /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 00000000000..4e1ceb45c94 --- /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 00000000000..bd5971875f2 --- /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 00000000000..6840f1416c8 --- /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 00000000000..9abccb1411b --- /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 00000000000..45abc169e44 --- /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 00000000000..9a1b05e3234 --- /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 00000000000..129d8326824 --- /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 00000000000..6d9b589e7af --- /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 00000000000..b745ad43594 --- /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 00000000000..51cc2815b26 --- /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 00000000000..3d6843727de --- /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 00000000000..94e92eb924f --- /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 00000000000..e16183afa01 --- /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 00000000000..94afe97c81e --- /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 00000000000..4e92c4d99e1 --- /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 00000000000..76026f5c0d5 --- /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 00000000000..ace44f8d7a7 --- /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 00000000000..84306384eeb --- /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 00000000000..49380782fbd --- /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 00000000000..8fd89f7392c --- /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 00000000000..9d35992c729 --- /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 00000000000..e348970b1f7 --- /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 00000000000..3bbafad402a --- /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 00000000000..022ceeff507 --- /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 00000000000..2648fa7e910 --- /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 00000000000..a0e09f9fe84 --- /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 00000000000..fedd3397d0e --- /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 00000000000..c0f3910152c --- /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 00000000000..b9c5f81e9b7 --- /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 00000000000..f657840f1cb --- /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 00000000000..dea91ea03a7 --- /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 00000000000..a44a36a38e7 --- /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 00000000000..1b39d854665 --- /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 00000000000..047874d6328 --- /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 00000000000..0e331395185 --- /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 00000000000..6c530bc7e54 --- /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 00000000000..5ba2ca12a76 --- /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 00000000000..31c429c04bb --- /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 00000000000..66ad4c1e7ce --- /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 00000000000..1883aae18b2 --- /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 00000000000..e4970693949 --- /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 00000000000..a729614ea9f --- /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 00000000000..8f8d4e036e4 --- /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 00000000000..31b0f430193 --- /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 00000000000..e2795fdc36f --- /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 00000000000..6f8e3a04f2a --- /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 00000000000..713f325e404 --- /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 00000000000..e35d6931232 --- /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 00000000000..a643fa15fda --- /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 00000000000..13826884fa0 --- /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 00000000000..fec4d20c339 --- /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 00000000000..5a08514f41c --- /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 00000000000..1b39d854665 --- /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 00000000000..d4f0554e653 --- /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 00000000000..e5fc063ceda --- /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 00000000000..87a2a7629be --- /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 00000000000..3799a441e41 --- /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 00000000000..c0954d42ea5 --- /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 00000000000..d93e6d62627 --- /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 00000000000..6a7d984a3e2 --- /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 00000000000..b2e6fe41a41 --- /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 00000000000..943e1247709 --- /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 00000000000..378d9d5ad3b --- /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 00000000000..a80f4325203 --- /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 00000000000..d23f7f1eaf9 --- /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 00000000000..fb1c570b7f6 --- /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 00000000000..2d8af029612 --- /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 c3cf8fd8df6..69e1523ac1f 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 01ab34b1e22..3f16dbc2204 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 6be48c3a2e2..afb0307492d 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 07f90ed2d0a..37db62d1205 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 bf6331c72b7..337ed3ad7c0 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 bad6552e178..6352142e717 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 5cae304942a..5938e27930e 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 9bc3db4e6f5..9e94d536718 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 a98a23c7f0b..0e652624ef6 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 da52ef752b3..02fb127e363 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 bda9013f654..fd0c5c7c470 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 3cd84f50b70..77bbc56e392 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 88d01439dc4..1c69ea0a48a 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 a1905d3d87a..e41382ea62e 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 4ae14e28add..36c18ea34fe 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 09303c4d952..bb6ec7b9f8a 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 dc7036f8e26..34050865768 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 264b3be1679..2fc5a3f1c52 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 5184c27d59b..5645bd91e2a 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 25c8bc48dc5..58b02fe8cad 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 5a8f41fce6e..8eee79de746 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 a9e779c8aad..52a1a66ba32 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 4de52c75d2f..b4b13d3955a 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 455fcf2d4a3..d19343acc89 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 46409ea5c96..e0958432a6e 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 ec982acc071..03d91e02193 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 a02d1d713e2..8e659dbadc1 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 ba64432f93a..ba85332cb7f 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 99849ee9326..fcabe7be75c 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 9f36352003f..2318a5eba05 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 acaef8e3884..dca37f61782 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 d9d485abb10..62e2e1e59c5 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 a527f2efaeb..823bf9ab93b 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 ae4158bbc3a..7b319c66a49 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 805a3eccd2c..a3f83c150e7 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 5ade982afb5..9a3a11a7a73 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 301a83c5e21..c4818393edd 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 ef01256607e..0aeb36b0442 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 04600d8dd8e..5ab6af8d218 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 009048775fe..3fd1a8d8ea9 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 a45b0780856..e4896df58ba 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 9b2bebe4d0d..79248e0d064 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 5c1e3fbf820..4e4cdebeec6 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 410585d02dc..f87f915c247 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 c780f92dcdf..4a0d8e0b01b 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 fead941a76d..2e67da76241 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 84b1c6f383a..b9e98886e63 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 14b67fda8a2..d42b858157b 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 51b5cefd7f1..1606c8cb5ed 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 e65c05ab90f..7e0da1fb844 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 ec51c7bcaa0..a3d084ddaa3 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 e517f81ce5d..8ed12b70d6a 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 f3447565c0a..19ad3f2eedf 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 dabbca15fdd..4040275d895 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 6742038830c..7fe5132ed64 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 c4f01461d6e..c56083bbf61 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 9d8f6a8716f..d2f53fec24b 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 7cdb01eef90..2f4b9a1171c 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 b7ce182dea1..c331b9c7e22 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 ea43c2eca2f..2d4fe3e64b4 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 00000000000..742dd8621ec --- /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 32275bfbfbc..5a8c6068769 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 00000000000..8141aa276bd --- /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 b484370a160..68cda398da2 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 72224eead48..8a233f30fff 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 5cb035dc622..cf75f845ef1 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 25104165f57..ee478a67dd5 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 893cf540812..c42f9092d9e 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 f85226ef50e..63ffc145594 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 1ba0877993d..0fbc0ecceb0 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 45493bd79a0..c5b8d0cbd81 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 c5640be83a9..85de80b5c97 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 c6020fa1d80..6b7a63d102b 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 7caf8d483ca..5a1f257f8f9 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 3319539b766..a8e1ff5fa7d 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 b1d656dc4d2..edbbd37f82a 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 3c30d0f3521..37fb766ee36 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 8d19882bb70..38e10460ae9 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 0abdd92f841..3247c162e7b 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 db42824b455..69b1bd3745e 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 bde3e2099af..69297d6aef9 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 940fb127c54..3e47ca925db 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 7cef08a0e50..066fae277b1 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 b1551bf364e..035b952d20b 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 cb0dedc6d20..2aed0f309b4 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 ffe751bd02c..016e0fb070e 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 9b0e0a81995..6c08029d9e0 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 82de0a6bfea..47032413607 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 2643e53db4c..7c9b7008f24 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 0bf1271e394..664cc72d96f 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 db4b9649e3c..9fb3163ae15 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 2f2efcd6bae..76b88ebb6b4 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 559d95e05a5..8fd2930e8ff 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 b491faec9ae..8d8e15d218f 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 cffa27defc6..5b0576a12eb 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 b51e0bf55f6..21dfa2f9ad4 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 a45936716c8..af7146230d0 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 86ee2099b32..49c806aa564 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 d4543a2ad65..2d0bcdd3292 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 d06c9b64baa..41c39c32c68 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 705d907f592..2e05823ebe6 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 5d52e28104a..fce7cd70960 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 21f0c84e1b8..7f7bb327ea9 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 cfb0880f6b9..afe65f67f62 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 16fbdd8099a..48751d0d8dc 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 9266e134715..36ab7150c1f 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 04cd775f0aa..11adeea4c9a 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 11517e2cdc9..05e3fa3368c 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 ef37d210662..566c623c80c 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 2b025862ca7..84fdcac4880 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 d9db35c07cc..6945c5ae47d 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 6447af84ce1..7e8ed675992 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 49d7e1e23e7..c513a9a0d7b 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 0d7cfecfb86..fe1879875be 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 d5864315d82..fe3ce92f476 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 139dc8bf3a0..b4f8d74d68f 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 8438caf251f..0a6a52d2fb1 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 588700dd306..3e6136fb2c3 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 ac8476824af..5a1c8fe08bd 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 d56b7a333af..9c8dca0b06f 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 5498ea9745d..a61e4372b78 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 d4ab3aba471..76f46e7c816 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 2c02b2aa2ce..09970c59014 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 61711b5d3c4..18f22d7f1b8 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 25245dbb44f..33d8d59d080 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 145c2fb440f..fc6c58d8ed8 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 b76d96cc463..a08c6bc6efe 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 3233430d8ad..3142208b70c 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 cae763b42c2..426f3b242a6 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 be9de9cc943..f4a455212cb 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 5f018605d5a..ad1ececc858 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 09102bbb4ab..7c129cba3af 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 0e5920c384e..fba620789ab 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 edba5dc17a3..19a6c6d8828 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 c69ffec899a..b841e7b28fd 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 87eb9762765..d95bb809cd5 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 7ecdd132bb9..857f12041d1 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 561d7418aff..915c7e7f55b 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 71150762e61..025ee202696 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 f3331e450b4..e44a4524eef 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 2c0f9c185d0..a9a45f1f485 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 621aee364ad..9ebb8c43b42 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 e364be3b021..b6faac51acc 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 b7798bda7f4..654fbe82aeb 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 e918bb28cb2..fe7daaaed7d 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 96c9b6ef681..8676326e995 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 e1508bb06ae..5ed177125fc 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 f6b52394eee..60dc00a32fe 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 cbadc37a6c1..9b8fe3632c2 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 2768a7ed85a..380acd0a875 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 a6992289200..8fd7a0ca754 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 6936dc7f56f..8bf15060ed4 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 8624bfc7639..e8a42bd5676 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 a0ca32c0d88..c189eb1e180 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 403ea8f0c4b..82f99c45e79 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 16a843202ab..53e623e05df 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 f12ff5bd94c..e95f452c1e4 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 e0716dd707c..73fdb846b1e 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 5b62cd46235..6ef2bd8697c 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 d2e0a2418a4..a7f6dfbd6a8 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 7bd4c366c76..5bcb8b328c4 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 591c4677fbd..c85449078de 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 2eec5575ce0..6d30adcd453 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 a5f9fba3cf2..fc9e407b4b2 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 00000000000..1e21027a604 --- /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 00000000000..9d445724c1c --- /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 33b57d9e7cd..b9cc9118220 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 00000000000..7f157900132 --- /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 ec7641e1cab..62f026fb035 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 00000000000..2a3458c3f04 --- /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 00000000000..734a81fba16 --- /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 8115a3bfba9..dd9526e8ad7 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 eb8a1b5bb00..75178c5ed2e 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 00000000000..12356ef38ce --- /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 6a777265c7c..50cf04725f0 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 b63f0d44452..56469f7842f 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 f4e999225c4..18eb21be2af 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 00000000000..dc02240fb9a --- /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 00000000000..c1b2a001623 --- /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 00000000000..5669c448965 --- /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 00000000000..fad6bd2cc13 --- /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 4a1dc82bbd6..b6146584d0a 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 00000000000..fff5188e04b --- /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 00000000000..2343dac5bb1 --- /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 00000000000..f92740755bf --- /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 00000000000..7f157900132 --- /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 5192a8c7df2..51526034957 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 00000000000..d6eb30277ce --- /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 00000000000..b9ebd393795 --- /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 00000000000..7c0c5861cf8 --- /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 a95af835908..8049e365869 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 00000000000..9608bdb306b --- /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 c0c47dddfbb..5f8d9034a62 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 8ffa33a6a3b..e910eea1074 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 1436829ee9a..d9edc58b974 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 00000000000..81bd5e3a135 --- /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 e742a337cca..51ef35385f0 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 00000000000..81bd5e3a135 --- /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 1f2ff19f9c3..798a8f9f659 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 05414b1e03c..ecc540b2cf1 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 272516f4c6b..19b4e79fe9d 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 00000000000..2f757b4bad3 --- /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 d6c3d037531..8f8b220af88 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 00000000000..752d3a78a5f --- /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 5704ebb6826..7e62ef3f7ac 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 8df3f3d382b..6d9654f3c5c 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 00000000000..94b931e03ba --- /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 00000000000..695fba906b4 --- /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 00000000000..f48d00a7def --- /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 00000000000..c70dde76a97 --- /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 00000000000..8d5a70dc001 --- /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 00000000000..4626033dc5e --- /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 872b5b2e2a4..4cb2f1bab60 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 30dcf2793f3..ec83710e860 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 68da33e3047..dd337013f59 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 75385aa8a6e..127d2870ae7 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 e157b8fec56..2fa885d1ffa 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 72a60759aeb..c1f06d34a8f 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 142a87c9071..512c0567444 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 c1efff6fa34..ff559803e06 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 b33163d99ed..ef07dc2ca75 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 723261e164c..71dba36dbe8 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 ee362f9aa72..ff5e226dcbe 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 7f7534192cf..cd83aad724f 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 6a1b1059380..091a3b8d699 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 e9f6476f072..2c05353be3f 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 b9f4c41692e..6cdaaf837a4 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 0a71a623b29..b2c565e13df 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 ebeb37c991f..1fc09298fd7 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 0681172165c..bf2bc7070ae 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 69dd4717ec2..65e0269967a 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 8c49004aefe..3df56ac5bbb 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 d4b784046f8..2d8c2b7177a 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 c5f291289ee..7a28dd692f6 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 b21164458aa..e0df6934361 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 6c3e379c1e9..eebf7c1d0ce 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 d687518ad30..072f6ec964d 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 c81c03bd710..5a4077352e7 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 5d29b267fa2..7af25649769 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 383a7d4263c..c1933032ed0 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 c57ad99bf0f..09b894742a6 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 a180d448fbd..3e159254600 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 9feb3950660..2662eab36e7 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 2b2f92ebdba..a404e1747e9 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 5306d17ea2b..88de9704a6e 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 2a2a194c166..0b12afbcbb3 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 26cce0fe770..c5ae118ef2c 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 69d250ad6f1..24246ca5732 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 80a11e4f16d..e7e7a5647b7 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 aa71441b8cd..ca1103043e3 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 3ef9309c963..9c8f27dff8d 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 7ad755226a5..15103177179 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 a69c443c888..540724e578f 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 3aef44f1202..61c6a6c48af 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 1e9eab323d4..074443908f4 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 6df2a846c8c..afee5b832cc 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 63420c805ba..482d43c7117 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 fc12bb2d1bc..750797e535b 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 1068dead9c8..d28fb541825 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 86116ef6845..e699e41903e 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 0221c2f02a8..4e65415b1b3 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 fba9ff9e13d..7e3fe9bcb0f 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 6e691c84031..c023cd832b9 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 a91681736fb..e2e51a3cbd0 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 ebbae39b07b..42086f5cfe5 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 b348b03f2ac..655752b6e69 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 1363c39d8b8..46f9f413236 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 5d254874c51..7294b31ef74 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 b6fa617b808..11ea7c671b0 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 b1571ae7516..e7091e19c09 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 2bb0cccc281..591f2f42302 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 77eb3f8a437..13a2a33aa5f 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 1f3ae163c76..45185a5feca 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 807314ad06c..9a7245396a1 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 e4590d8f9e6..53df0ba59eb 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 00000000000..e9025e15321 --- /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 00000000000..4162a0f14ce --- /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 54b80842f4f..69acda4ed48 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 00000000000..51901bb911f --- /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 69655ac1daa..cb7f0207915 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 3843248a9ee..8fb24e3ce77 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 00000000000..696bff2f776 --- /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 e2f2588349c..b3081298e5c 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 443c70b68dd..0ec46ac387c 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 00000000000..62e6aee9f6e --- /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 262ba27d951..5654afd0281 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 00000000000..5f60b921eff --- /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 0c352d9608a..b0cde00f82a 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 00000000000..e830ed3c4bd --- /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 00000000000..f87e718561a --- /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 00000000000..4162a0f14ce --- /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 00000000000..221373a116f --- /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 cc7e7d6f3e3..52652197380 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 00000000000..a46901bff35 --- /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 00000000000..30915eaf557 --- /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 00000000000..d4242bd2700 --- /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 00000000000..0daad2457c1 --- /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 20b1663558b..d38a8884cc9 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 00000000000..9e48ced4eb6 --- /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 00000000000..46cf2729942 --- /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 00000000000..19571d3ecf7 --- /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 72c350dad24..beb955cdb64 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 fb202f73b37..8398212681a 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 1bdfa9ac4ec..1ce5fcdca0a 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 00000000000..ce72e3b3bed --- /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 00000000000..db774e6fa0b --- /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 61370236a97..dc18049ba16 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 00000000000..db774e6fa0b --- /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 a3123919615..527a6f45d30 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 f6bde89a3a6..76a1e7117b0 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 05bcf441660..b96299070ef 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 00000000000..2a983ee79b8 --- /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 479fa4bee21..40bc1f09a8b 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 00000000000..2e8dcdc14cd --- /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 01cf3feb4a6..8ee0aeaaa7b 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 7d50b4ea61a..d4eecaad20e 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 00000000000..5ffdfc78cfd --- /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 00000000000..b32becac871 --- /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 00000000000..e53864e7a02 --- /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 00000000000..9a0a1d8899f --- /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 00000000000..700372a9163 --- /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 00000000000..68af2a46398 --- /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 049d88ba3a3..52da286bbc3 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 054f7a5a18d..bbc7b0c3738 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 4b825f1dfd3..792290656df 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 4be8656a3b1..2da6bc19d7d 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 bda554b39cc..fecab818295 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 34c49f13b9e..81292c8306d 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 cd829c3f129..4befbe95f60 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 cb6285e479e..8cc68833875 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 17be05d9ff8..d262a9659d1 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 909116d8faf..170edcaf48a 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 f5c066ae4c8..6ce7948472e 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 afb9258cddc..de6ca6f483c 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 955507c447e..1d19cb32b8c 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 f1cb6881a95..01b6309e90a 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 42396486277..f6c91435c06 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 58e86a3d228..2a274bf75d7 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 826a6c4bd0d..80d075c3589 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 0ab768ae7b8..ece65955dee 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 b60748ad84c..906b647bbef 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 04db56d126a..e839d9864c2 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 59875cbe61e..d0ea36f7bfc 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 96e037ce72f..a94269808d3 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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..cbdc153a582 --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..d8a4c453015 --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 00000000000..2fc0c81a46c --- /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 ced6f034400..816d0519ecc 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 6b97a4c94bc..e1b5072b96e 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 244284995ed..0a38e6200b9 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 617ee8bf51c..c44ee107618 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 50c1bd8b430..b2169dbc2ab 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 435497933dd..0c325c70970 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 a53a04a3cc4..eddf31c91ab 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 4f392558d23..9f8276ff3b8 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 ed73bcf0618..8b3492a0427 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 4677c69a7ba..2d63c0f5852 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 45fb05b0108..f3673c2775d 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 ae77202ec82..a5b4c5cc466 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 00b5ec5d08c..d7f17fb5220 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 bc53a164a5b..f7c93460fa7 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 10f635d8d4d..1d48834f755 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 c7a20a8abad..1a5b58586df 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 004fbc36c50..e2fce8f57c4 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 5522e08226a..deb2de26fdc 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 3d0530c54ea..5123fa9438b 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 73e1b48b342..edf88f798f9 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 96172796a59..62d823c5fe9 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 693079bcd9c..02024b18494 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 310cf325f01..2c0e06f8006 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 00000000000..a3922ec5b6b --- /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 00000000000..287aace0fe3 --- /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 00000000000..d28a1480f9a --- /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 00000000000..611c172b426 --- /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 00000000000..2d25417753e --- /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 00000000000..13aad35f5b9 --- /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 00000000000..1673ff40443 --- /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 00000000000..3c5eee88fbd --- /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 00000000000..afbbced95e7 --- /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 00000000000..1c05c372811 --- /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 00000000000..9c47ef20696 --- /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 00000000000..a099f895f94 --- /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 00000000000..a099f895f94 --- /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 00000000000..6f16b99f5e7 --- /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 00000000000..a1a6b038670 --- /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 00000000000..eef7cb31d06 --- /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 00000000000..34f34c789d3 --- /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 00000000000..b19309b5aca --- /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 00000000000..c22e68673aa --- /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 00000000000..5fb0b0a2ad2 --- /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 00000000000..1a330a2e3e1 --- /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 00000000000..184ee25ab2b --- /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 00000000000..7671b559d56 --- /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 00000000000..b91fd076b8a --- /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 00000000000..d4fdf75a2d5 --- /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 00000000000..724a20934f1 --- /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 00000000000..dc980b39088 --- /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 00000000000..9f3acdac989 --- /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 00000000000..ddaa6a26c5f --- /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 00000000000..fd11ec96cef --- /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 00000000000..3c5eee88fbd --- /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 00000000000..4392f15554c --- /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 00000000000..3c5eee88fbd --- /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 00000000000..0950f58f183 --- /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 00000000000..91860a29663 --- /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 00000000000..91860a29663 --- /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 00000000000..fc36e86b9f0 --- /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 00000000000..900934ae82c --- /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 00000000000..260d2d80750 --- /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 00000000000..2e362de69fe --- /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 00000000000..1238dd85b77 --- /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 00000000000..ddc6e1a1d3a --- /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 00000000000..64b24fe6f16 --- /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 00000000000..bf46c84aa03 --- /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 00000000000..b9b8f447124 --- /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 00000000000..603e9049fde --- /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 00000000000..69b22a8448c --- /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 00000000000..276927624df --- /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 00000000000..0f163529163 --- /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 02c4b631fff..207dbe2b3ad 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 fe50470f59d..eb79eb5eddd 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 6dc7f9f0517..7a687ac8e92 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 1b0b909e5db..ee50332933f 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 c73eafdc264..d37fe5d0388 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 dc2cd72d3ac..85044505c84 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 89a3c8751b4..4e95e6934f8 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 1f061414727..27033df4049 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 e9a5835e2d3..84c69d1b6f0 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 ca2468ced7f..89cfcbf358e 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 8230edd5ca6..f913f513b21 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 7d4fbb76be7..975b0154da5 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 ef622bb6b37..e416bdc6a64 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 c9fcc2d150d..9444b5045d3 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 2a6aaa2984a..9f26892e703 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 725ade01ae1..c1184dbb9e4 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 4b5471bc08e..6285162878e 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 102d1420d6d..e6d7329f52a 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 e21eb422a64..c26b3b93832 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 b9594f9ec86..b660cb871da 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 6bbd3cee3ef..baed592049e 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 3569cc21659..1c6af1dc4c0 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 8d437f90dcb..1d500c180c2 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 00000000000..0e013c92be6 --- /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 00000000000..41a6cd0b14b --- /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 f6c18cbe119..359768ca7a8 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 00000000000..f611b8ee064 --- /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 4889c1781c3..eb23f36df46 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 afda756740a..35942dab17f 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 00000000000..eff781806b0 --- /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 a53bbed07d0..5e7f3874495 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 7efad821a9e..cc3d8a7364e 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 00000000000..792fad8c9d9 --- /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 472cb98f283..96bd7c448a0 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 00000000000..399a8b498d1 --- /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 d4cdcf3d254..b2b14626872 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 00000000000..a6c60e9e213 --- /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 00000000000..625a2197995 --- /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 6be3e609590..3b374ad9590 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 00000000000..aac497e66cf --- /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 00000000000..659e5eca5d3 --- /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 00000000000..f611b8ee064 --- /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 fbefbc43e08..08be4695734 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 00000000000..5550a4f1a10 --- /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 00000000000..9b5d837269e --- /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 00000000000..13918041a62 --- /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 93ab26d4585..119152d6124 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 00000000000..fd3335f2f45 --- /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 b7ebc93099d..223e78168b7 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 99b6f12fd66..0ef9f04f983 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 00000000000..ffa97a4cd25 --- /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 00000000000..1c1179756ff --- /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 cfd63d190c3..a5b73362a05 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 00000000000..6b4aa51f994 --- /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 29b3beaee63..c7afb44a0f7 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 00000000000..f611b8ee064 --- /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 00000000000..ea8b4e6855f --- /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 00000000000..a5b625e43ef --- /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 2b459ccab05..d1864a22390 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 00000000000..df9c217fe55 --- /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 eafc10bd8ab..a57aa704bda 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 b7f62a138df..2d59dcd5ca3 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 00000000000..83147683e3f --- /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 00000000000..c49493bd178 --- /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 00000000000..02970796a61 --- /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 00000000000..e37ff20a2bd --- /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 00000000000..f5c2c85e22a --- /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 00000000000..f611b8ee064 --- /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 c4020b8194b..1524b34111f 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 e3353c5e5b9..53ff574364a 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 df7ce905074..f384905d1a4 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 c3c6adcc218..23263beb4c3 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 5154a9c2762..2b4cf1316f3 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 f482761309b..4ab1ac566ef 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 e9144a14e34..9dbb9d4f1f6 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 e75a1667ad5..0385113787c 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 eb691d13417..c027473ad14 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 6067a6e62d9..5db3f001b4a 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 6dfebbd9b43..9bcf41c23af 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 ffdd4bce796..8ef8cc716b1 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 0394dd99ba7..fcdc00168eb 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 881b7d57c8e..070a509cd10 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 e9306d95918..3b23ca96bfc 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 a997675accb..cd78c5f2c5a 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 514ae2bc020..f96b2c05ea0 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 c89058465e8..0702ca3bbd5 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 e5620f25c88..895bf9c5bf7 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 0d0ca241397..242232663f0 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 603d4426ca3..7a530e44fb3 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 6114f89afb1..61d4dc4660b 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 ed51d481487..8c57e4226a0 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 67038a0a591..fc3d4f64fc7 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 b6ec410584c..e9cfbce5291 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 44025b84755..9f43be5d93b 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 c8fa12df5e0..5b57e11ac6e 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 338593ec0c6..8196d4bffe9 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 0514010ce52..18433ab1697 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 f66fc97a4fc..846aca7f4ea 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 cc499625cf8..88041b9abe0 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 ca0d1626b9b..3cb932e6095 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 cced4f6314d..0e024a0e1eb 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 0d83b874a6b..a46b53faf8c 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 52ddf089cf8..a0438b6af8c 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 a240fe50d7f..f16aac2174d 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 a92b9016b3d..85333490f3c 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 cee47da4714..d424f196997 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 23b5c7a70cb..9475a0b2915 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 393c60bc807..0128f0ad448 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 397edebc9ce..02f43e0d4a8 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 4b303e4a5b9..d0fe7cba892 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 a6b9b147ee5..1c05beac361 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 64b9b97b2eb..7b161dcda07 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 a489b21033b..4c04a5d32c3 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 da640cfb94f..9ad5f298fba 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 d243dd162ac..83333c60fe8 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 a55e799fc25..23b40164c7b 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 9f39e513c69..166ddaa68ab 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 b439b089225..1ec89b44d9f 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 fdbb9a4ea88..27dfb56f8d7 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 d902ec35efa..cecc1d75c6a 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 8d886f249fa..12e74728fc8 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 b281d43794f..47e2eda63af 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 2f146841311..912748ada8f 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 a2563779023..a3aac5f013a 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 ac17b44d37b..afece58eef4 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 365be074a16..10589dac474 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 f2233607e6e..d31465ac399 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 84cf754b04b..0eb7c99a91a 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 aa9be503733..692d1247fcb 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 461eda1a632..b575db70f11 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 8ed4adbe04d..533d2edf6f0 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 1fbd0216cc4..41858abd83a 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 8c97176e0ea..69cdadb4dfc 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 985c02493b0..8c73521afd5 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 89e102d844a..2ae18d83422 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 0ac2ea20955..d4fa954b407 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 d05eda99524..a3c86dda34b 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 4fcd6894246..6fa745a8b57 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 53367773da9..44ee1ad4403 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 32a4ec76caf..e21472d4da7 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 df4e97ab970..10030cba559 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 7944a8135d9..22cb8590c3b 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 55764fb1dc4..caca14b79ed 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 5adeaf2f0bb..e34e2fb7fdb 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 fde79efe835..60deb64a078 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 6341001621b..484be7bd418 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 16771d94470..fc736c667be 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 9c4042720f6..3f30c1babd4 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 529d497e62f..f2bb4dfa3de 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 dffbe942b15..3a2cb80fc9f 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 c8cd52a169a..7f214c47743 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 6fd77448253..9244acb2144 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 302c4b9cbd0..8b08af7b10f 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 907327ea26f..1d589f942e7 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 fada51c6ece..bc3bb2955ad 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 b0458e22bce..c5e1abdf729 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 e0feb85f174..b95c12a1d80 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 0f8c0a86f84..30607ad3b11 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 857958c0319..00255511420 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 be37c8c8244..7527294a3c7 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 bbca18fcfc0..6dc996fa67d 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 c55904286ec..487a036e44b 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 2c2bfb7abab..697f676df78 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 fc299883cf3..b1d244cc4d6 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 ee06d4802f7..e497ef546e3 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 c6e67d666c5..f7181424964 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 a9af04df80c..9ddf3c95586 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 ac45fd59633..cb666a7d72d 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 28f08120498..ca145bd68c2 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 c02c0abf8f2..55d1d4e0d9e 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 de3450c581a..608a4a7879b 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 652f16c67c8..1b91c566a53 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 616ee6d8593..f427f3e3a12 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 618743d07f1..77fd6517410 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 ce2f97e06a0..06375b4a0b6 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 0ccb9a8b957..25828e48db5 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 143b2155ac1..860d455d582 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 b8e0636b950..a6e7e738903 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 132914b74fe..79917f35d78 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 fd1b4f2dad4..d2c326270e1 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 994cb8da5fe..f2d2200f448 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 318ab6220d3..bb79e2d1e52 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 03a52485c23..497179b2a19 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 90dd206046c..0916a0ac34f 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 7202144aaa9..272e4d6f04f 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 808637328d0..5bef54b6df6 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 a7e989f1abf..d088b64b4d4 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 d4afcb7a1c6..e6e6208a8a4 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 167f24d3794..4c76920226e 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 8f56813cbb6..3e62a066308 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 4e2e3eb72c0..fabc33234b6 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 e78930a9d3e..d16a249d1a5 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 50502ce40e8..4ba78dcfbbf 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 a174aba2a1f..6f530fa8a80 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 f7d53f1449c..bbbeed0c1fd 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 0bb393e3389..a16cf1ae38a 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 00000000000..02713888762 --- /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 bf8c7dfc0c6..9113e3c8d8a 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 50f54a17706..384efdebffc 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 a667f2224f0..7b93dfe2fbd 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 e023916c420..d021c1fcba8 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 8acd3966bcd..ba605bd6595 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 be7f53ec637..8713163bdfc 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 2eb4e7f9014..f7bc89da80b 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 413af8497b2..af0bd912bc7 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 0cb2a37698b..131e0855ef9 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 71735d70d9d..20ff3db6518 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 fc8c3aeaafb..74eec7a1f11 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 1f0b1b4754b..f8defa49708 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 f8e2f981a44..67994227513 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 e4a906e713d..ee0ac26e0cd 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 d106a400bdc..0afc9ee7021 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 a2789f6c1a5..2007a946dd5 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 7bb24458f7d..32c3f892e58 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 dce5ea993e4..ba84a2e30c5 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 228d30b2c60..56684b32535 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 aedbdb99809..ab64bd1b9fc 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 365a5ec232f..3bfceb324a3 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 5d49f0f43c1..73a29caced6 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 c1011c29042..1fe0ef5c6e5 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 ce1a92a8957..0776c148e90 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 f25c034e982..5fb6d3a3e65 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 3583df79401..a3747044a59 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 dece8693da9..9ca44a36d84 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 c9c67d1f0fe..58855eeb62b 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 581e63a15ef..a5da0304c5d 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 23b299a9390..9b24b09b10e 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 db2f7336f19..d22f3a39085 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 5ebc1747f31..d5c890e4169 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 133c92f78d9..54392f3e293 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 955b7081c6b..a405883fd3c 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 98e2af15c89..4ae00e7495f 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 eb052f4b9c5..9e0484dd6bb 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 a054daab118..31e3f8646e6 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 12d9edeb42a..9e9ef66d1d6 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 90be81c68bc..4db38e2b91f 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 8e5f5cca27d..81ec65f0d63 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 00000000000..f39ed488a10 --- /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 68a77191b9c..5ed6e4c2f95 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 d4d0f0fba83..c2ebfb92f94 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 87a6da7b09e..d1cfe9f7a91 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 d08f9617975..33b3200927b 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 2177c281468..7316275f37b 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 27f8eb25795..d41faddcc66 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 571c9f59d66..766f05d31bf 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 5ea3fadf430..66f1bb52804 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 5130b3f9f64..329776ed228 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 140f3dd9e4e..a456a2688e0 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 559aecbcd84..806bf54d35d 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 ef6b051dec0..a62009f19b0 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 37788b1e056..6ada7a17452 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 0d0188128c3..5e828a82668 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 05da161730c..7c129cba3af 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 f8d74363076..63ce9b7bec0 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 199fdcd0c80..a040c880e33 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 ebc6f80f70d..92935906a86 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 9eab7eff5ac..ed20b5a904e 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 9334b572304..eb0fa0ec6c8 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 44faede8444..8d8fe629030 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 553662de610..c5b303e9cdd 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 4c9a9830bb6..92fd386c5c3 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 dc1e3617709..82a894ffb3b 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 9df04019e6c..2666696f8d6 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 daec97603e6..27b9b398e78 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 8d0304e883e..2ea9b419501 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 d75bf7e0533..d816813855c 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 4f94c67d12b..773a2d8c59c 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 5297ac3263b..238ac5711f5 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 f75e55b102d..6308098b9c1 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 8d472c811c7..a0ed6659865 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 5ab9a2b060a..d2418b00726 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 fffe08d20ce..8ed8bcc843c 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 7b244a681ea..3a805baec05 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 a1ac11c17fc..2e567a27ce1 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 33336623be3..2d65458665f 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 b8a8fc3e348..526c258bb26 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 9cdea36d208..85775d06e21 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 4af3f8dcc70..a70720a3327 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 b60e3c4e955..0adab5dcdcd 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 19382fadb47..b5953decc6b 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 c1d04ccebe5..2594540c6ea 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 ea811dac998..f0e074aca2f 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 2ec7dfa7670..afad668a98b 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 41072b29660..674a01556c5 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 bbe9a31a7cc..46b714b7299 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 ba5d2fbf007..f5f165e37e9 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 8dc744fad09..6a434860c08 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 c317e5bb464..4eb8677762a 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 389a306a538..ce0824075b2 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 ec8790d26f4..3d8e88d2d04 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 eb361bcdb29..4cfd8e27cf7 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 82400e48f8b..1f35d3466ce 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 d962d259a1c..0a8d187e50d 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 62f2e05e158..1e23982e0a9 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 0804fb59dfb..d157a746068 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 d7c7da341e2..d2d67e0e510 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 b621bedfd17..e71b6a20b24 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 cde5e827b16..e7d410a1d86 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 39b350e0e20..f5749ebf2ca 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 ecec03f6ed4..7332643a4f3 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 b3218f473d9..dd23b6ac429 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 17686771cd5..582dc1037b8 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 80f287cabbf..a4d4d1b9831 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 20860d104ed..8de4e5bcb98 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 9bef8c10e38..231db98bd54 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 a0199c3819d..2557123da33 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 d2fbb03c919..eba134e1566 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 66eebbf7c79..fcbb879548c 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 0aeca50a0ab..0ff4da3b2e1 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 c2871984d97..016518495dc 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 1aea820987c..d2d92d1e85b 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 20acbb6ab7c..8082f912bed 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 767e73d3ed7..034aff83ecd 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 90f01a0d821..a918de60fe6 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 c6f600ef5da..3179afd93a2 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 8860d0d0904..335d8834ec3 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 918a3b849d9..ee8fc183b3e 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 00000000000..55c234fbde3 --- /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 3b83ce40836..a57dbfa7e05 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 00000000000..158d5d0ea4c --- /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 00000000000..39bc6a8b2d7 --- /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 00000000000..490d3242f6d --- /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 00000000000..851833c7f70 --- /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 00000000000..3ecfc7048b2 --- /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 00000000000..fbbdd78888e --- /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 00000000000..53121aa8ab6 --- /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 00000000000..f1edbe1fe58 --- /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 00000000000..69d1f3539b1 --- /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 00000000000..e95012f3183 --- /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 00000000000..debb3433596 --- /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 00000000000..d92f73d4a77 --- /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 00000000000..d92f73d4a77 --- /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 00000000000..d2c08643c06 --- /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 00000000000..29392867d86 --- /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 00000000000..7c4a993c7cd --- /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 00000000000..bfcad73e8e6 --- /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 00000000000..5d7a44ad471 --- /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 00000000000..6e872e1492d --- /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 00000000000..0fbda59731b --- /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 00000000000..b5c88047f66 --- /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 00000000000..7bb60b0986c --- /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 00000000000..723b49fe6af --- /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 00000000000..bc22e65d2d0 --- /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 00000000000..389e5751581 --- /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 00000000000..b09c72c410c --- /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 00000000000..8d34274c238 --- /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 00000000000..622c197876c --- /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 00000000000..397eb6b0880 --- /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 00000000000..d475109f2fa --- /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 00000000000..409692f7227 --- /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 00000000000..d475109f2fa --- /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 00000000000..61c214981be --- /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 00000000000..d92f73d4a77 --- /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 00000000000..d92f73d4a77 --- /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 00000000000..389e5751581 --- /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 00000000000..b3126e52f89 --- /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 00000000000..cef031d505c --- /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 00000000000..13770eba67f --- /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 00000000000..737e068fd36 --- /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 00000000000..dbf23121794 --- /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 00000000000..254e99451c7 --- /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 00000000000..7339ffe3ebd --- /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 00000000000..3f10d1f6c19 --- /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 00000000000..86821a3e50f --- /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 00000000000..a9769af907e --- /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 00000000000..b09c72c410c --- /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 00000000000..b09c72c410c --- /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 4df9b3ef11c..dcb76f65acd 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 04b3a1ed083..7a4831517f0 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 755ce131b2d..26e37c64b78 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 ed75e5b1f04..8d0e0d37c4b 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 359f3250f60..4d587ba2e55 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 96dddf9ba31..7537482ce5e 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 36fee5bb366..6e0e7eb538f 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 7c5eab0fa5f..ca40862f475 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 8a841ce0575..c9bb0d6fa62 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 8b502fd37ee..1c9cabbf74a 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 dbd1c8fd7db..b60cdeb60f0 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 da4daa0fa57..84d55f51efc 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 bfa3ad3834a..c19a53619fe 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 70f155cebf3..b6a28495692 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 d9f369a6406..750906af83d 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 3a946a22299..45e48d8ad33 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 ee74ca27501..ee87b78aa90 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 04941b76270..9ae52b9c797 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 13d8dc69fd5..7d76bcc9ed9 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 705bea205c6..6f9ab3bac1c 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 6d73fbba8dd..736e9620ce5 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 b346e92c217..ae6e6c8a619 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 75cf013e696..165d889dbdc 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 8b56d89b74d..52c30681efc 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 c89411168dd..d7b2697d5e0 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 d3ec784e3f9..6b11fe39500 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 6ec527da6c6..da5c3260f2a 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 f7cfce0fd61..973ff695acb 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 6b02df2045a..1476e8beb0d 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 93194bdcab3..0f8f81b4438 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 a3f4861ea89..7ea083a3669 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 d2e8c68d85f..f4d06e8eca6 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 00000000000..e64f7d1d381 --- /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 700a062b8c3..f912b81f4c4 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 0830995a6a8..d00f3d08185 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 68651936a63..5cddc5b0828 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 7e73d5873fc..f698ad9287a 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 536a3a137c6..81b0f9c8b71 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 b3841ba87c3..177fd72067e 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 60a6a269575..74d1e6981b9 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 a84b260dbf3..f04c585bd23 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 2f8562da23f..2eaad319712 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 d018a59ebae..5464e034244 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 94b0b467c83..47139616e95 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 f31cff7d747..012ac2ae568 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 00000000000..1f0b269562d --- /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 5b72d9a2019..35cd266854f 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 dd91b04bedc..929281f736d 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 00000000000..f4b110f857f --- /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 00000000000..2447be7ee67 --- /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 00000000000..a5808a43f12 --- /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 00000000000..1b614a752d9 --- /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 d524e1a770c..5d23794c07b 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 def09ea4b69..41a155b147f 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 525b5b00fa8..25006b481b1 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 3b835faa2b5..1533e586514 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 baec16255ee..17d259ad1d1 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 959621e364c..73918a9e8a9 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 c208eb3295c..11cce45dcd7 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 8b1beebdc7d..6ccdae6437c 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 6128361f85f..f26e7998567 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 266315f6606..27b3fd1cbd8 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 703a675f287..1ce0a275f1c 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 b0b21e3c2d2..4b5fea8f312 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 3d73199cbff..07cc2f56ed6 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 aaaee5d1ad7..8eea281729a 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 c2190ceba57..b81fe14497a 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 c554b062417..5ab4b0145b0 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 2360e81a4ac..3b8cbf12ea0 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 55bd70077ce..c938db307db 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 0ae08cf66b4..9677642266f 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 929ded46fbb..e09ec648ee3 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 b6e3120f365..4a4776dc82c 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 1c1f80cc6e7..6ff9546167e 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 134771d6c96..d26ca0726b7 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 5cd75240de9..c493a15b05a 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 2d28462243e..158bb08b25d 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 0dedcaa8b03..3c87781d2c5 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 6b6b3267560..a22b01f9488 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 7a9716f76cb..6c253be7855 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 a6188bb18c3..6d7e4e99e26 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 53b6fcd6b3e..bb396d8329a 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 b7550430aa0..89d80216fd5 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 6abc49e8aa3..77f87a19e0c 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 4d941d73619..ebb09f2ded6 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 4d408ef525c..c4f7834ff89 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 dd7fef44ef7..284285af65c 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 790819bbe3c..4152b732a7b 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 859b9e72f9e..7e8691ebf26 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 5181c87f3b0..b3e40ae29bd 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 2a2e2ec6512..92ecaad74c1 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 d52cd1906a6..9e6e01c427a 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 846425ec421..5b4ce86e963 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 fe95bee0616..f95723b6d43 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 399ecfc0459..7c7f26b4328 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 3e6a5820ed8..d960e2d93b4 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 552ec1b7da1..faba0c7f6e5 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 d3abe40bf93..5e86cd92b4b 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 4a828e919e5..4082c2a24ab 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 274cd02bf75..451ab397ea5 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 a52c2e03002..83e99a166cd 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 d83a34ba9d0..bdfd4e55937 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 77a9bbf2c01..25dd4fab31f 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 c7036e93162..35ad2389693 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 8da0aad2733..bb79fca2c94 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 ffe8501b584..69f36504051 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 2bf02b8cdf4..ab6cc91324a 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 0e86684c610..1c2af9e8d73 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 4161597a7e7..72001c7de85 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 f62821fbf08..4504ca6a74a 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 c3400352263..00d2840e2f2 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 08154069b3f..d03ee6889cd 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 882cd328f86..f27d6a35c4d 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 3a6be91a994..e8d19233bbd 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 317c4932e1c..8aa3b52e9cc 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 8e4944772c4..816f2c86087 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 0f35269d006..f3909591bef 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 7f765d5a931..de605d6b52f 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 a5066e0ca3f..fe1dc22d92f 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 98ff43014f7..d86a5376d07 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 00000000000..17a9898a6a6 --- /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 00000000000..3e24c371eb7 --- /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 00000000000..64231ae8491 --- /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 00000000000..50c6d297723 --- /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 00000000000..3cab1ead063 --- /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 00000000000..10115f789a6 --- /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 00000000000..10115f789a6 --- /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 00000000000..10115f789a6 --- /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 00000000000..0a7edb3fc4a --- /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 00000000000..10115f789a6 --- /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 00000000000..50c6d297723 --- /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 00000000000..50c6d297723 --- /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 00000000000..1e1b86c7275 --- /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 00000000000..5c6dc94faa5 --- /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 00000000000..017a0a475fa --- /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 00000000000..eb19d67df39 --- /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 00000000000..b274386c76d --- /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 00000000000..124f9bc98ce --- /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 00000000000..3cab1ead063 --- /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 00000000000..360c50904c3 --- /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 00000000000..53fdb6259ed --- /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 00000000000..ae23fa734b7 --- /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 00000000000..63a76067d83 --- /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 00000000000..50c6d297723 --- /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 00000000000..c610af6a48d --- /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 00000000000..1aef1ab0e9c --- /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 00000000000..035a864fd75 --- /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 00000000000..50c6d297723 --- /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 00000000000..d8a4c453015 --- /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 00000000000..17a9898a6a6 --- /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 00000000000..10115f789a6 --- /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 00000000000..3cab1ead063 --- /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 00000000000..3e5f0c035be --- /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 00000000000..3e5f0c035be --- /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 00000000000..f35a370b2c5 --- /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 00000000000..c4925cda1d0 --- /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 00000000000..3cab1ead063 --- /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 00000000000..97bbbf11efd --- /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 00000000000..c3b0c189d7d --- /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 00000000000..10115f789a6 --- /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 00000000000..166b76408d7 --- /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 00000000000..6cf6b85da64 --- /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 00000000000..b8dcc73c978 --- /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 00000000000..877ae81ffcf --- /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 00000000000..504c447610d --- /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 00000000000..93c00b920e3 --- /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 8a217c57a6d..d8339e1100a 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 005175c5bf9..a0e610e4527 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 5114b578c3f..88b047a2a45 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 5c104c9399e..ec4c3b87d9c 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 5a41facb505..42d37f042fb 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 40cca942a8b..96dae84b853 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 af1305b00e8..e52a80be986 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 849913b40bf..79ea8c05b49 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 03963cb15a9..b1ab00551e4 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 5d769289d2c..2c6235cf17c 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 1591d0f3113..4cb94a81a72 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 441fbef41d8..5bded3676db 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 0ae305c76ec..4d46fb9265c 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 c0abea57bcd..4f771b7b963 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 a902c3d4d04..4edc54e357e 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 1d6ebea298d..d03486ceb31 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 b74ad363658..2e6e876e896 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 85d744b252c..63707d54c6c 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 8c2fc19bdbc..e349d5fba28 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 f07766c88de..4ad08ae6805 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 00000000000..dc3b3e99d4b --- /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 00000000000..269f050ca4e --- /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 00000000000..6d46e23214b --- /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 00000000000..febaa038f69 --- /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 00000000000..9a3593e0799 --- /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 00000000000..8248f17c180 --- /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 00000000000..93c8d3fea84 --- /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 00000000000..b882d5b95ac --- /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 00000000000..27e6172cd5e --- /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 00000000000..781ae4a3834 --- /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 00000000000..41e2c9387bc --- /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 00000000000..9a3593e0799 --- /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 00000000000..9a3593e0799 --- /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 00000000000..cc5b0927e59 --- /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 00000000000..c371e20d82e --- /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 00000000000..285be78528d --- /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 00000000000..b882d5b95ac --- /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 00000000000..27e6172cd5e --- /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 00000000000..5604e8e8ec9 --- /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 00000000000..febaa038f69 --- /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 00000000000..46523c81597 --- /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 00000000000..903ba4609d7 --- /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 00000000000..8e80040716c --- /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 00000000000..9a3593e0799 --- /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 00000000000..783b2fc3a05 --- /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 00000000000..89db16e8afc --- /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 00000000000..78fda836cb4 --- /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 00000000000..98a9a93b1c4 --- /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 00000000000..b882d5b95ac --- /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 00000000000..dc3b3e99d4b --- /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 00000000000..b882d5b95ac --- /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 00000000000..6c3395eac48 --- /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 00000000000..9a3593e0799 --- /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 00000000000..9a3593e0799 --- /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 00000000000..8429efc1734 --- /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 00000000000..6d46e23214b --- /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 00000000000..11dc6de7034 --- /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 00000000000..dc3b3e99d4b --- /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 00000000000..0133f893199 --- /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 00000000000..73e0b31dbe7 --- /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 00000000000..b0abb2165c3 --- /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 00000000000..7f8902dbf79 --- /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 00000000000..df25afb9fdf --- /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 00000000000..310b7f9cc7e --- /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 00000000000..5842ec092ea --- /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 00000000000..5842ec092ea --- /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 ee2534fa776..fabb44dc9ea 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 e11634c2d8e..250f1a3b2f2 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 5558a73aa7c..06b40f1b1ad 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 15b7a823a91..e8aea9921c7 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 8383a6a3491..731e95915ca 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 dfddaf02742..8fa797aec89 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 6190c0a52ac..b26c6a4b381 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 edbbe2d4d94..6950a0de170 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 cdf95c70173..5296b208e78 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 5db92410f14..503cfcbd110 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 47d5bfcf9ce..1c8e51f9f1c 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 94b0d55afb1..563d2282058 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 21235032c3c..6938bdea5f5 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 1e3285a628f..f3743bd0ffb 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 f3a9bbbc7db..53f80db934d 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 d28ee5a2e45..44de2e39554 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 a208aa3fda9..3ae1885e76e 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 d8f5e4be158..ba35af1b326 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 27e7cd47e09..da8f675a657 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 a67d2423980..9a52ca8ad52 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 e834de8ae0b..6ff775a8a0e 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 c39cec0c737..f9c802c2612 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 8692c4c02cb..4530705a8b2 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 53b2f2f664d..b505df4ec25 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 c53605865ff..e55bb54da46 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 fec1cb0b40d..2b6e51ba4a9 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 7488d527ecf..0589f7c8468 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 eda0c666b62..75f7a252102 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 e6a90325e0f..d63879b3b5e 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 507b4233144..62225188d8a 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 1b54d0ca3b6..1f8ca1cc107 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 3090a8cb164..9262a271fb1 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 bc107a24a99..a257ba3e111 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 85e383be712..e275d0f231e 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 0aad75fc4ff..d13d3201546 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 99d65227b2b..5816f1a0bcd 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 ea087c1af75..609209738e8 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 fb49b3e7fbe..972a232036e 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 7f97ee23f98..2fd65bb972e 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 26c208ef9aa..f7050c2c255 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 9ce14cc2ffa..ecefc3b656c 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 5de59789797..0337dad22ef 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 49093846261..f2a598770a5 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 4e032a70957..f5317e3046a 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 ec46be861bf..378abf486ad 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 9e98e4a9496..0489feb2709 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 376e8751505..d7e0c759bbf 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 dbbaf1c372f..09d103c6f60 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 43c3560df99..7922a11845c 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 8be90459f71..9f1e0670d64 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 7f5b3e38200..0c105f26168 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 cfe47b199fd..4f5f75dc644 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 00000000000..122d8bcfd02 --- /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 8e80584957b..91bb4b61801 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 00000000000..b53d6013fa9 --- /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 00000000000..ed1cef3d9f7 --- /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 00000000000..ee1630232e5 --- /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 00000000000..0981324d795 --- /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 00000000000..cd24bb9b58d --- /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 00000000000..a7b2b73ad2b --- /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 00000000000..5f1a1c66ded --- /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 00000000000..bad36c8d192 --- /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 00000000000..4561b1ff412 --- /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 00000000000..e7480941773 --- /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 00000000000..3a5a4259f57 --- /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 00000000000..3ed10dfad9c --- /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 00000000000..3ed10dfad9c --- /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 00000000000..aef8891a168 --- /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 00000000000..ab40939b84e --- /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 00000000000..7b798759704 --- /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 00000000000..97bbf34c7d0 --- /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 00000000000..1e840a5f52e --- /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 00000000000..e8ffb633173 --- /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 00000000000..0a64f65abd8 --- /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 00000000000..1e80961119d --- /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 00000000000..f243ae9516e --- /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 00000000000..0b0eddc0f75 --- /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 00000000000..dd8036a9ec7 --- /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 00000000000..5ea121f977a --- /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 00000000000..ef881ed0af3 --- /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 00000000000..a27e9b40395 --- /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 00000000000..54bd5b092f3 --- /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 00000000000..7c47e31401a --- /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 00000000000..2712cef60fd --- /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 00000000000..011c91def77 --- /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 00000000000..1e3280d0ca5 --- /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 00000000000..d051dc791ae --- /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 00000000000..d051dc791ae --- /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 00000000000..ce4664e8c42 --- /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 00000000000..7e2fb36b69a --- /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 00000000000..96f9e252825 --- /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 00000000000..b7977354c8e --- /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 00000000000..a7373074240 --- /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 00000000000..935a5a4a4fa --- /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 00000000000..a23d1446e84 --- /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 00000000000..dca2f176b5f --- /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 00000000000..2090978108f --- /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 00000000000..ec3b08eab1a --- /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 00000000000..962f435cc3d --- /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 00000000000..1cc79a16564 --- /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 78a52d90872..7d453374b9d 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 a00f8930d5d..09b41d00587 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 31c94851158..d61911f012d 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 2b97431b1a4..353edb079ae 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 53c357fa8f5..73fe6e8926f 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 242fbfe890f..a7c67304a76 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 340d4742baa..eabbc340cc8 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 45af82bfb84..d9d410b11d8 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 0ce8b77e7e1..ca152e727c8 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 4b25ffa0050..7513b5be12d 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 a9afe10984b..dc73362280e 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 23f58ad5bdb..7285ffb97bf 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 9cb8c51d98f..4295422780e 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 3f239306ec3..9b010ce2887 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 d8a7fb30220..a9b44db3731 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 b56efa60ac4..cd9b80175ad 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 e9d7481bb6c..f13c5b00bb5 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 ceab0e65a32..593ecd19f9a 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 774e6a26953..9250f5a3756 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 3d0fbad5b5f..f2a85e2c3e7 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 f28083fd726..13dfc6c2147 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 da010884620..3ed8a3765fc 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 beba04478d5..2ffe2fb805a 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 53660148d65..821cb0ed056 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 5d98c837087..80efe98c4b6 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 9e3e8053392..a96fa3b584b 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 341fb1afcaa..8e3e9b68e42 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 0dac2ae5dc2..7716dab8ad7 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 396082c057e..ee7192f6f87 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 cd97e4aaa3e..84f2fddcb83 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 d9b547e8fe7..35ac17a8bb8 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 32871a64c30..d176bc4ab6e 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 04cb6dc6ee6..d27b78615cf 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 e8911d78e93..4a2f4440a2a 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 00000000000..c6765575c07 --- /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 e31ee2373a4..7203356ab6a 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 d638cf5e54a..8d4f9aa7245 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 523e2fc025f..f3545c119a1 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 d02d1a45d18..364ca15b03f 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 05c291e9d13..ee7bdfeb26d 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 ea2b760cb9c..2278c7d3e1b 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 96d6cec104f..5a9c7618b00 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 373a30c435a..1c3c8120d3b 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 b2abd3fb201..1fbe2c7c154 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 06fe7d4117e..84872e89434 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 789893b5974..9d68b88d015 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 6d51f68a4d3..fce3d6d3a14 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 f7a6b7ea626..a7febddee05 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 ac162b546f4..59e5115e2e6 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 6aecb4703dc..a31785cad00 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 f21909d21cb..37d842355c0 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 010dc5ca95a..2b63decf0c3 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 3fd8027faba..a9b2fcedd2f 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 385fae5edd5..35cd1d1bbf5 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 a753548a77e..aabe3d35293 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 79306985200..73da8c7c1d4 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 8375483af06..0767c509bf9 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 b5918917e33..34c769faac7 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 fda712f0ba9..8f5b985bfe9 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 a8f1a65a366..5ec522c9c24 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 121d885c9fa..30d7fc10979 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 6debf4ffb84..fe0b3bc0091 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 2f6e4e14bf8..545d0ded465 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 7e36e6dd4f1..bc80cdedb31 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 01e43f011cd..8ea3ab6dbc4 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 1654b40f9b9..8b78ef25eb3 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 6dc636f9af5..3bd58fccc2f 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 229db9e6b1e..cd5e3d85d50 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 ae13a03b08b..e34b14b2a97 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 985f2cbfce1..a41d65fd09f 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 ac2a895f7b4..e7171ca2867 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 9c27fa443a4..d6c022cd5ce 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 00000000000..f09523e4431 --- /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 00000000000..be3fa50d1af --- /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 00000000000..a2c97570762 --- /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 00000000000..4ba22a7ea8d --- /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 00000000000..6435b122f04 --- /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 00000000000..57b03d57535 --- /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 00000000000..f353bce2db7 --- /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 00000000000..57ff8549367 --- /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 00000000000..ae5de70d897 --- /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 00000000000..34321691454 --- /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 00000000000..3e199a8d15d --- /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 00000000000..cca90650a6d --- /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 00000000000..cca90650a6d --- /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 00000000000..a66a0f1b241 --- /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 00000000000..2fc0fdcf3f9 --- /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 00000000000..ce40f1ee1f3 --- /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 00000000000..3764168ba27 --- /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 00000000000..f9d426a199e --- /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 00000000000..50a8171d5c9 --- /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 00000000000..b0226f8670b --- /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 00000000000..4ba22a7ea8d --- /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 00000000000..e18f1aa7685 --- /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 00000000000..6a7c57de12d --- /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 00000000000..b16c336d26c --- /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 00000000000..689006c6991 --- /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 00000000000..1ff748a07a8 --- /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 00000000000..ba603764304 --- /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 00000000000..3764168ba27 --- /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 00000000000..504763d0b10 --- /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 00000000000..ad3dec70b8f --- /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 00000000000..fe18f264f7b --- /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 00000000000..ad3dec70b8f --- /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 00000000000..2bb901f0031 --- /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 00000000000..cca90650a6d --- /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 00000000000..cca90650a6d --- /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 00000000000..8fbd1e5bf05 --- /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 00000000000..189ff4a1c7a --- /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 00000000000..ece8b289ff6 --- /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 00000000000..09ff45911e7 --- /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 00000000000..1779baf7a07 --- /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 00000000000..b61dddc9008 --- /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 00000000000..ef3632cfd7b --- /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 00000000000..8158c0b8fbb --- /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 00000000000..969bc6825b7 --- /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 00000000000..189ff4a1c7a --- /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 00000000000..94a0d38c1bf --- /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 00000000000..6db6e92c472 --- /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 00000000000..842392580ad --- /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 77e8a7db602..bcd3bd43af4 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 983bdf0a802..297e8b4037b 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 ce7938ac705..70463961dd6 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 b30711c49c5..79323e41bbe 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 e9133de022f..0b5d31869ce 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 bd53ba0d480..01bbd6587c3 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 08d8ed78d2c..fba6b944222 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 8ea41520343..a511f696f89 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 c894277abd0..caf6d824d0d 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 42267f3b8fc..17b1edda6b6 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 2091ed0b96a..08919a05608 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 8bf764ef224..1a64f0268a6 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 b44d707b476..319348aa8a2 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 82d6644c449..aa3b383bbce 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 d69f926bb01..7a6ae4b2ad7 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 a31cbc42b7e..ecb09354f0d 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 05b83631a91..b9a66540c3b 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 4ea988465bf..60382ca137a 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 7f30d92a63f..90b30dfafdf 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 c3b79973c7b..07414cc2b3a 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 f6bc4cbd438..3f190d41331 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 073efa65f46..64c3abf5d1f 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 710f8a003d7..0192c848e09 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 b41e1a3d8b7..7420611936f 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 2130d13031f..8674c6802be 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 e9254635a3f..0f126e6decd 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 92e7bbd796b..ba81c5b3e7a 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 991882ac875..52a33805e63 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 ce43bbbcd20..fd442881b81 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 1dd9688b332..5b310b20b63 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 da9de46dc93..a133139a8e9 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 1c85587acc8..a1069936c3e 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 5d6d5200569..2a9dcc9973a 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 2c51f1d15c1..28539c8fd5f 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 fa58cfde3c1..042959a67c4 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 5217518cdf0..c145637a656 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 00000000000..b063d57eb39 --- /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 1ac6ad5996e..2eaab685d20 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 00000000000..4b834d05fc8 --- /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 2caa4455a91..b06d7d53f2a 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 0506560e61c..1a0311d0800 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 9b20b711554..ec83db6aab8 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 5c8a491f6a7..026f00a8cb2 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 55fc24154f0..53a5cd4d061 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 e23c5cdbbab..fc997b4974d 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 344110ed1a9..e37b3104b1c 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 5fd2f8b768b..f6f09dab4ee 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 6b4548ba4fc..7b62a48e62f 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 3ab32508ce3..228c8b1f71e 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 dfce3978ad6..8e54495a1b8 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 4b204902389..2760ec7a181 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 5218982315e..9240842ff97 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 d0e2e0f6171..1124b5335a8 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 15e05bd376e..ab1135498cf 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 0de30aa5ffd..f147edad4d9 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 619dbf8dc80..ce75d775f14 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 fb9a6399c6f..3246b833382 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 a44be6c5d7e..ac440b1225c 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 00000000000..c200e286608 --- /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 00000000000..c5f684d24ce --- /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 00000000000..41f87cddbce --- /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 00000000000..5f89ee79ab9 --- /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 00000000000..744d02a54b2 --- /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 00000000000..b0c79f52277 --- /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 00000000000..5c3577c5ec0 --- /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 00000000000..827c0c81f38 --- /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 00000000000..2130b6acd80 --- /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 00000000000..8f639975a71 --- /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 00000000000..827c0c81f38 --- /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 00000000000..92aa6caa099 --- /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 00000000000..92aa6caa099 --- /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 00000000000..8f5f2b4ad54 --- /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 00000000000..cb6365c8bb0 --- /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 00000000000..de5c94387a4 --- /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 00000000000..7ad8bb6b9f2 --- /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 00000000000..3f93fa35193 --- /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 00000000000..2130b6acd80 --- /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 00000000000..569260601dc --- /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 00000000000..daf2ad0558d --- /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 00000000000..5f89ee79ab9 --- /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 00000000000..11082f7da45 --- /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 00000000000..61c147c0657 --- /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 00000000000..65f2adf7325 --- /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 00000000000..e52751789ed --- /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 00000000000..5f89ee79ab9 --- /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 00000000000..a5e3ad22487 --- /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 00000000000..8fdfc4c97f2 --- /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 00000000000..e2d73434c3d --- /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 00000000000..827c0c81f38 --- /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 00000000000..3f93fa35193 --- /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 00000000000..827c0c81f38 --- /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 00000000000..5f89ee79ab9 --- /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 00000000000..372fcc493b7 --- /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 00000000000..372fcc493b7 --- /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 00000000000..c9251c3ad26 --- /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 00000000000..41f87cddbce --- /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 00000000000..b0c79f52277 --- /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 00000000000..5f89ee79ab9 --- /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 00000000000..15a1f9b1542 --- /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 00000000000..9669feac114 --- /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 00000000000..ec57d754113 --- /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 00000000000..493d0700ee1 --- /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 00000000000..05cedace901 --- /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 00000000000..41f87cddbce --- /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 00000000000..74aadbed717 --- /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 00000000000..07f890d41de --- /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 00000000000..b05878668ab --- /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 00000000000..af1125a367c --- /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 00000000000..9caee964226 --- /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 00000000000..986bddec998 --- /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 00000000000..a884d82d265 --- /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 00000000000..70352282781 --- /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 00000000000..5a85cb524ac --- /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 00000000000..181420eb11b --- /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 00000000000..caeaf751b81 --- /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 00000000000..5a85cb524ac --- /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 00000000000..ebc54ba093b --- /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 00000000000..caeaf751b81 --- /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 00000000000..caeaf751b81 --- /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 00000000000..caeaf751b81 --- /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 00000000000..5a85cb524ac --- /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 00000000000..caeaf751b81 --- /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 00000000000..43eab1daf87 --- /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 00000000000..9ec9fbec9fe --- /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 00000000000..caeaf751b81 --- /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 00000000000..5a85cb524ac --- /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 00000000000..6ea4199b38c --- /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 00000000000..06ec52a4c01 --- /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 00000000000..a884d82d265 --- /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 00000000000..72bd266fcf1 --- /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 00000000000..48d4e047f05 --- /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 00000000000..af1125a367c --- /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 00000000000..15ff39db1d1 --- /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 00000000000..caeaf751b81 --- /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 00000000000..635c0cd8311 --- /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 00000000000..6325d0c475e --- /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 00000000000..caeaf751b81 --- /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 00000000000..70a0ee57576 --- /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 00000000000..5a85cb524ac --- /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 00000000000..caeaf751b81 --- /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 00000000000..5a85cb524ac --- /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 00000000000..18e80a08f74 --- /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 00000000000..caeaf751b81 --- /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 00000000000..caeaf751b81 --- /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 00000000000..c15efcf2c02 --- /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 00000000000..3a0ec791375 --- /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 00000000000..5a85cb524ac --- /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 00000000000..a884d82d265 --- /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 00000000000..5a85cb524ac --- /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 00000000000..f36754b197d --- /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 00000000000..4ea1d180c5d --- /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 00000000000..741c377a849 --- /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 00000000000..05cedace901 --- /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 00000000000..23ef9b1243d --- /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 00000000000..cdc70067941 --- /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 00000000000..ae63e4f89e5 --- /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 00000000000..97d4c5820e2 --- /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 c9e0b2fd48b..4b1035607d6 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 c448010e5b5..de9e6877f25 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 fd4b1f4af3b..a5915ae2ced 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 057596e5cb0..f80a5da1d44 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 73cf00b355f..11759880108 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 c0760337f06..2320eef1a9b 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 d97d32c8967..154094ae971 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 fd4c9373010..3627eb72dab 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 798048479cd..fdddc6de82d 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 d1d527c030f..163af6cb512 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 5fcf42caab0..8720f80a2c5 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 5b3b13f9b68..474634692e4 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 00000000000..4caec1811ad --- /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 00000000000..315e8540581 --- /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 fec70803486..d77c6bc105b 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 00000000000..67b14f6ce88 --- /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 94d95e7ddf8..5057bf6e27b 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 1b2dbad1a4c..ada081f4d5d 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 00000000000..5612ae88a9d --- /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 3febed8ac09..4992516ac03 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 0680bab7b48..5962e6e1337 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 00000000000..6896e08393b --- /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 07411b885b8..2025754e0ee 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 00000000000..4caec1811ad --- /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 3c957c715d9..ae0f51132f4 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 00000000000..edccbf24982 --- /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 00000000000..9e8213f6e25 --- /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 00000000000..9414fee722b --- /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 00000000000..a4ef0bdade2 --- /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 cc35f93cb51..1d6dcb072eb 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 00000000000..4caec1811ad --- /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 00000000000..d4853732bc0 --- /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 00000000000..37033396da8 --- /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 00000000000..67b14f6ce88 --- /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 a83db67b3e1..1bbdb6e01d7 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 00000000000..552e130db72 --- /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 00000000000..4caec1811ad --- /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 00000000000..3fa2ac38624 --- /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 0a1b0d13cb0..8683b6c0a42 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 00000000000..54d8d581d55 --- /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 7716cc016c3..1213d5dbcb5 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 f999e3c16f0..331317e6283 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 00000000000..d49a5a889b4 --- /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 00000000000..d8a4c453015 --- /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 03eff2a7f6d..829392289af 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 00000000000..4caec1811ad --- /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 7ef982e0d13..62b5e39e03b 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 00000000000..4caec1811ad --- /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 032d88e02d9..8c4525e7dbd 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 00000000000..67b14f6ce88 --- /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 0f2c1bc0e4e..61b0790dee9 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 00000000000..67b14f6ce88 --- /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 3f29b62e665..bbaf85cd532 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 90001148f12..25fd376ecaf 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 00000000000..65e6eda7f43 --- /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 00000000000..9c887e8da75 --- /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 00000000000..95806a05334 --- /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 00000000000..12b7e8eac3c --- /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 00000000000..96cee87c350 --- /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 00000000000..f66041ad6ee --- /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 12059aa6b1b..aef79f766cd 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 9bf8abc8230..d17cdbcf7d7 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 ec498ebe3b4..7db651b6b96 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 2121153a600..43302714b97 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 ecd3d4d2525..c84a80d0ccb 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 956c640379a..5d6e27bd737 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 74ec441a248..13387488ea6 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 965453fe405..445d7566240 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 9d58589d7f4..fce57ec4b9c 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 c472cc5806e..d79de976a83 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 03cecbfb349..44090de0b62 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 48b3ddb0488..7e60891e166 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 1c0988cee33..92baa5502d7 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 3eb2582b615..a3aae138232 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 83f2a11a8b0..26a469ce341 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 1115cc97ab2..e9bf022b12c 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 7b7a840b94a..29ae44ca9eb 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 6306e1ab2ff..114eaa6c9f9 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 135779d6901..1d07a82818c 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 4a2c446f3d7..277bff66dcb 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 7b1e2a3f350..9d9f60d309c 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 34d86a4b46e..32ff418a7bd 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 793de99a32a..c2bc5447d16 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 862ca6f28e4..eca91f39a40 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 c48ca23d27d..2c5a0d0971c 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 d753a54b693..1cbaeffe958 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 34b0f198b50..135e9f843e9 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 84d0bf9e84e..8ffd687b228 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 471a6a0cf68..4454c82c8f8 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 3345d7882c0..95331d8c8d2 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 1ab01c14b4a..c30d967d012 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 9db028011dc..97da5ac4e8b 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 3c0c165aa53..8e460289ef3 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 8c9da14a603..0aeb9cb1d95 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 7ba23b7b0c6..8fcc86ffb82 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 d278c5d6f19..6bfc6ce6037 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 a732debc043..800ac719ca9 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 097c6fe3b71..d5234ea3011 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 a84e80f9d04..7046b0992b1 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 7e116f62923..4f0b9bf4ee3 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 81be13f879a..5b10cd96808 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 81c7db754c2..48744428b1d 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 5014ee44be7..721ce3a94f4 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 dcb235d247a..975c863d95d 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 bdbea8983e5..9def747bbb4 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 9b1d0cc00b6..d41236a7f5e 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 f0d55c50b26..60a0ba0e158 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 636943d119e..ccddbe6ceff 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 dfe406db41a..95cd3aee0f7 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 9c1b9ae6248..ded899ad4aa 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 1ff1554fa2f..d5446773700 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 59c2f79d858..148fb6dfc1b 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 1fd32fd1be5..8e0acaaaa0f 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 adebe4b8a73..5cb63393be8 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 56c29638be0..d71e29e0171 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 a4148036eb5..248ea85eb3f 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 804cce84862..9c573476511 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 2fb6b10a770..e04c296dc8b 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 2ba0e1f3467..7e65645928e 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 051fcb5e6d7..7f843bfd7da 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 7bbce699274..0b6f347873c 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 dba578def93..a28daf34acc 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 0b8a9f88e81..9f2ed5a4b90 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 19051f906fa..5087506fc82 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 ea7c3b80121..b2959577adc 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 5cf7b43851e..a02483baa47 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 7acf1e34318..849d69d55e5 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 b6164bcd3b4..8a8735a8077 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 2167553ce66..85ccdf9abca 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 0ee1284a341..11fe5675d5d 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 1e4ccb67942..437c2105e73 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 66e56e73bf9..979f4b0f7b6 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 dc12b0b2aec..d17d577bfed 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 725e95cee0c..904ade6ef0a 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 e4524f4dcc3..3db65a34ad9 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 5cfefc80793..d9902ba7d08 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 bd0ad026615..ec535090348 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 bd39f4cff72..425cf927631 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 b3b4155a556..b45b60babfe 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 3e3ab1e2ac7..dac6c9018b2 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 b70a3059be0..9444569c4a1 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 7227ff139b0..06ce8442ad2 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 223150f2cd5..952e98b6481 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 5bfd1d487f1..612d12e7717 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 6e888f6d5c8..0bc966fdd6c 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 3272cd00908..c23a33b6e19 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 0ed6fd4d140..0261289fd31 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 6096d9b7f93..35c182455da 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 3dc7f769cd2..91fe7d8375f 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 f79a2831438..b6afc479b70 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 964bb4942ec..b2ddc3aa1d7 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 281726861a8..a37d47cd150 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 41154732530..72f1ad2a4c7 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 84b05f3a26a..56e1633e3a1 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 978bacfbec4..ed452d2c9a8 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 f75a9af1b66..236ff724a06 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 d9345e42fdc..75ce6f53612 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 458ba0436a2..f3a97d29f50 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 f2d4e623fcf..b03a29ad2e1 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 22d7727637a..ed182671709 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 483edab97b4..eeac06cee2d 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 ff2e4b1e97a..be49825c8fb 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 76d928833a6..eec29815f64 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 15cf27984b7..4b468218410 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 6f41bfe0a2b..f2c380ca30d 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 53370bac086..afef3401cad 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 491072a841b..1dadfbf94ee 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 4ac26d670b8..3f6e78fd3b4 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 42a2c217051..01c52eb7fb4 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 f3802963243..a63485cf300 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 7c730cbba47..bf4d97de505 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 699eebac65c..a159dd1f6e3 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 2930048d59d..1c4afe26662 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 1ce3bc44de5..8d02a79a5ae 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 621bd13ee1b..8b10d00e538 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 136ef6fe14e..72c1acf7bd1 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 4e171b99df6..fcf2b0c58bb 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 d9a6a482e88..2de03d82c31 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 81ac10aad54..046faae52f7 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 64c56cb37d3..058f9ac9a9c 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 5d835341b6c..e0008dcb4cd 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 36ccf94c22d..8ccf5e626c7 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 5963c62bd48..5b7f2e43e3b 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 00d2f264b29..a61257b6d16 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 5f9497d48f8..ecaaee01aef 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 8024236963c..8f2682b3fb1 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 9942533798b..5522840f189 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 580418df94b..435b7564bcc 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 064da5cedf3..bfdebd385a6 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 b08beffb16c..3d79c8d744d 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 b13fb51aa50..2f582b0826d 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 75a19c6a208..79cd15df3be 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 46b2f34b7a2..6f28ee53ae2 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 420cf8fbb49..008404df599 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 69f98c18504..b0a287b1708 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 9c63ecc3665..357ff2ac170 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 6bd93ee7bfd..0119fca7388 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 4a1cca9e539..ff241531ecf 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 b484d5925a5..af48b1ab8c8 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 823ee6c7531..fad7efdf398 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 43109352dff..e71dd3c4ea5 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 c77ebb5369f..8d83b05e736 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 cb9786da233..119bd828c60 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 c8ea2251758..4b68d5dd42f 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 ece81ba345b..e71d816b412 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 e3882a4fc2d..16659304045 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 043f37e52f8..f115865a2b8 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 4c917794ca9..d3e2f7b16aa 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 0cd23e6a11b..be7d8e94193 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 9db0ccb3505..b2f27a8fcca 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 54c6e3b8336..da7890f959b 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 ce2614b9989..bbb1cedad98 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 70cf906841a..5df01fe951b 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 b9dad43c44e..a601eb2b9bf 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 0c0ccf25a12..7e1a15cbde8 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 1ce59e3dbc5..a77d66c02f8 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 8ed84338a1e..f34c07efd06 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 4d764b0dab6..b0afb6ef168 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 3a28194f6e0..64bd20acf94 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 d9a7fd5307e..0f062f65faa 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 2f3a55fc911..81c0de81e70 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 8b9244c5d9f..cc1fe4c17d9 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 cc8be930341..b86ea9b33cb 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 4fa8975523e..6f3d15206eb 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 1fbff59337b..b5875aaf088 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 c1f87cd9a70..0c9d9a8d8e5 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 ef651375e51..683149c6fd8 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 945519c859e..9f87f719b5e 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 20cb32c9c0b..5c8c3cdeb3e 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 423684442e5..b08900034ed 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 14f85bae320..69b8bd6c3b8 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 b260aa21080..ba750323426 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 4a1321bfda1..296dc3f222e 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 a98a23c7f0b..0e652624ef6 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 5891a80dfcd..d15390fdcf0 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 51e4c113946..609cc3747be 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 835f113ba2f..213ae1e4bce 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 5c85ca25948..771f48d1d9b 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 f9ba72d2013..b5b421d2d79 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 60c93f7b429..1307f4cfe7b 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 8bf0b347b9d..8ae4c30e156 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 d39a4d544f5..f2c1675a14c 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 d47b5648538..5efd65b1c79 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 a3540b0e294..cb08944d26b 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 32780cecfbd..5e6560a294a 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 2ebe0e5d3f3..56a0e6d5341 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 c761b08c602..77e2c75540a 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 7296efb6879..765d5803675 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 c2e4899b5d5..338539bf25b 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 5389beaec72..fd5f3f6ef09 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 e4fb004456f..b3d4cc352f5 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 439e9aca790..789c9b84a65 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 5ff26dea498..b047e636eea 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 4a29360e2cb..7ea329dc903 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 d118212e77b..3b56f9ece6b 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 c4aacd2700d..887d3b7236c 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 7e0f58ad78d..10c58c119aa 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 b9cf4cb2eff..1b6611c4cb6 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 8d16fbf7f99..ff17a3ada82 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 6400bfcd7dc..c869d06cab3 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 6da10f785f9..78b71486b71 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 7fa73eb02cd..d4adbe155fe 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 a51a4fb2583..48ebf35a97f 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 893d33225f2..c3bfaa47f32 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 9ebb4c70d85..ce1bba1bb5d 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 556c5d559b1..fedaff526a6 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 357d307bc26..82b25512001 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 4dc334c6bdd..35b3e4c45f5 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 339f86f80a6..ca93393c779 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 d0985024f13..aa14f158300 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 c1067de1d6a..5a996e47547 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 525ebde7c6a..25daba13b87 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 f8f224d2cda..29641464f57 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 688f406a67e..33efd72a6d8 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 d2ae496f350..1f3fb32b8e3 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 b6d7d072e5c..d8c76856480 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 3be1164d19a..d891baee822 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 1c845e1c594..5788b570eba 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 f93f6d3ff44..cf71829bf29 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 9263a8c3ff7..6df1cdf8f01 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 8854ec470d5..3720cf10211 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 54d000ff614..9d544eb0337 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 6828cffbf7c..01364b9c3ce 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 8dcd6526865..6d9e06c5a3d 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 6a917bb17b5..dce368d62d7 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 c5d7905c5ba..e92372f3d86 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 cb69fa9c8d8..c682de447b0 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 c7e3a1fee38..e17bd9ad95e 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 f0b94eef383..5e5a293fc82 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 5555158828a..156f7fb8262 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 a2e3728ea71..e73585c2e0a 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 205088154da..36d627645cd 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 f6b7ba83308..d1635d0bc27 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 00000000000..b608241352a --- /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 00000000000..73db65d91c7 --- /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 00000000000..80ac8acf1fa --- /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 00000000000..fd8ab8bd9b7 --- /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 00000000000..de709024d22 --- /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 00000000000..0fe94354e45 --- /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 00000000000..2f45910186a --- /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 00000000000..de709024d22 --- /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 00000000000..e0b7194b1af --- /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 00000000000..5714f19ac8a --- /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 00000000000..f83cf683d4b --- /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 00000000000..de709024d22 --- /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 00000000000..de709024d22 --- /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 00000000000..3f34ffd9a64 --- /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 00000000000..118e1c11ec0 --- /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 00000000000..6728f877331 --- /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 00000000000..f62abeeb2db --- /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 00000000000..5ebfae8e5a4 --- /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 00000000000..95dceb8a09b --- /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 00000000000..e100747234a --- /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 00000000000..1f2784bb5eb --- /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 00000000000..fd8ab8bd9b7 --- /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 00000000000..fa6cfbafc5a --- /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 00000000000..3efc6529267 --- /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 00000000000..fad79695ef7 --- /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 00000000000..0322b9a9305 --- /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 00000000000..23122478d12 --- /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 00000000000..53c53fca039 --- /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 00000000000..062a7be486b --- /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 00000000000..c2881207f1d --- /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 00000000000..52d78df421f --- /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 00000000000..de709024d22 --- /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 00000000000..5878a8e9d22 --- /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 00000000000..de709024d22 --- /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 00000000000..258be2c2524 --- /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 00000000000..de709024d22 --- /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 00000000000..de709024d22 --- /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 00000000000..cfe2dcec504 --- /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 00000000000..64fb11610be --- /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 00000000000..fb7ea87ecf2 --- /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 00000000000..8620ef5082f --- /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 00000000000..de709024d22 --- /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 00000000000..b36e176b29a --- /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 00000000000..d3f1f5b2cd1 --- /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 00000000000..646aa5fde8a --- /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 00000000000..8d990cfcc2c --- /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 00000000000..746b44763c2 --- /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 00000000000..7aaf05058a6 --- /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 00000000000..8bcf83d8c39 --- /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 00000000000..53c53fca039 --- /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 00000000000..9991aa0b500 --- /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 00000000000..de7bc64f9e8 --- /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 19a853dba97..db6e1055844 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 00000000000..d9e1638a444 --- /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 0f1101eca75..607acd07cf8 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 00000000000..ac76f94ff72 --- /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 00000000000..3f5bd81e833 --- /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 eefa1e8bb6e..0690811d2cd 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 76496da6dc8..e28718a3172 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 00000000000..75fd8d7d5d9 --- /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 3f37de5331e..22b1436a404 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 b42b2ce56fa..2491d701aba 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 c6790619182..7e27a969b12 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 00000000000..96ffc87e9ee --- /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 00000000000..b48601ced7c --- /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 00000000000..15e59d0543b --- /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 adc91477a23..c6c95c1f16e 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 00000000000..9d853c4bd9a --- /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 00000000000..cdeba216a99 --- /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 00000000000..0778d0435ff --- /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 00000000000..d9e1638a444 --- /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 3fba61a4848..cbea232428a 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 00000000000..ea492ee159b --- /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 00000000000..1cf5d2d9a50 --- /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 00000000000..3828c6435a1 --- /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 32f479b8b5c..39d630bbaab 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 00000000000..a41b3d1ad4c --- /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 b923fdb210e..8f80a81e642 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 a7f807e8dcd..3035e883743 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 7668dfa5ac8..b5b1f9df386 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 00000000000..261ac09a485 --- /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 905ad413090..9c1906baa2f 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 00000000000..e773f3454b5 --- /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 930694de8ca..8b65ed602d6 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 00000000000..e027676dce9 --- /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 00000000000..e027676dce9 --- /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 00000000000..b1e3ec7b1b1 --- /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 8ca964606ae..49b7d22ca57 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 00000000000..0b619898896 --- /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 bef4f1583b6..472ca853827 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 ed5367e0013..bb92b37fd52 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 00000000000..f97ed0d09de --- /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 00000000000..4f7a2ab5b97 --- /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 00000000000..0f13bad4a01 --- /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 00000000000..fbac402530e --- /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 00000000000..ed53fcf510f --- /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 00000000000..e5160fb8737 --- /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 00000000000..71a7e0a9208 --- /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 d8bda90de85..42612eaba9e 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 1e3f7b573c3..18080db554a 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 c9b127fecf2..70a2bf7e490 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 f3ffdb997ea..10bdb14870d 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 80b55da4b63..f5e4094839e 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 3caf51812be..828d7feeb5e 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 98a78e17d86..18e87d7c70e 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 6d73cc6fc9a..86b0db95c7c 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 cc5343589a2..8c8844797cb 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 f5fe2bc17a7..3859617fbbd 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 998080b1ca9..4778c51d52c 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 a850db0f732..5dabd3a0d26 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 00000000000..97cf89463c7 --- /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 f7e1a9d2235..f86c4268e06 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 00000000000..3f92fabd3d8 --- /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 00000000000..d7b359e0d6d --- /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 00000000000..80cddceda2d --- /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 00000000000..4bc9bb8858e --- /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 00000000000..11f8a8d2f0b --- /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 00000000000..5eddff89b50 --- /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 00000000000..607a7eaa8cf --- /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 00000000000..e0c4c7043f5 --- /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 00000000000..1c75d04a716 --- /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 00000000000..ada0964a358 --- /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 00000000000..11ee35782b1 --- /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 00000000000..e517d9331aa --- /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 00000000000..5f21851b67e --- /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 00000000000..c91e442617d --- /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 00000000000..576e66ba6b5 --- /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 00000000000..819c35ac3d6 --- /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 00000000000..2c46fb48c7d --- /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 00000000000..5aed0b89255 --- /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 00000000000..721dce2501e --- /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 00000000000..a8de004c3ad --- /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 00000000000..5d798b7cd84 --- /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 00000000000..38c65ccd8f9 --- /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 00000000000..09ddfeaf5c6 --- /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 00000000000..3424269bfba --- /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 00000000000..f9982152d87 --- /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 00000000000..1f10e34d6f9 --- /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 00000000000..e0e6b2fb228 --- /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 00000000000..3da64e71c19 --- /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 00000000000..e0e6b2fb228 --- /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 00000000000..f6fdab9cc89 --- /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 00000000000..eb6f66e8784 --- /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 00000000000..15f9774cb16 --- /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 00000000000..538cdd3cbdc --- /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 00000000000..e9169fedf57 --- /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 00000000000..726f9d917a5 --- /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 00000000000..96c2bfe6601 --- /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 00000000000..9d0ff4c10e2 --- /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 00000000000..ffe94d56469 --- /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 00000000000..1ff23478201 --- /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 00000000000..267fcb83a61 --- /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 00000000000..fb787ad6a0a --- /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 00000000000..8bd2f9f0410 --- /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 00000000000..fc4734b2f31 --- /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 00000000000..4dcac2924a9 --- /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 0acac0df43b..96a39ea4de4 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 4eb4d59e642..d6f28c43cb2 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 68178af768d..fec4e448182 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 6fbabbc13bb..775ef702b84 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 5d2a003e5eb..594084c6571 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 a2ae32f5aa9..04d1a0d9545 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 00000000000..061e511eb52 --- /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 054c4464922..911520065fc 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 96beb3141c5..eef994a608e 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 933ad3cf7da..7a467844c75 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 c85251a0e13..2ceb78b6bd0 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 e58c6993179..7d2ab21d81f 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 601c83d31e0..fb7a76de106 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 3b8cdff3985..36b358192be 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 b760f25a47d..37b1c15f896 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 f5c7efb4cd4..236f682184a 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 823b50fa869..ace432f6a3f 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 414286efdb0..7776c23dbaa 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 5790bc6d7a6..7851f9d64bf 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 3437a73f6a4..f9191fe7866 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 905653b7015..d17637e7c2c 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 854b7fb562c..9eb459e53e6 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 5565fb21111..3ee83236d7e 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 e0066a271dc..a1114965a4b 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 e4f8bf05563..549fa406253 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 71204c88602..2fb298f781c 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 0ee0c4b6ac7..0775e47f694 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 a7692f2a68e..1a8affa7c31 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 a9449ad999f..f28bb62b10a 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 959e1744082..0901d927a2b 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 ad1ae6935d2..35169f70245 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 a6036e47984..da4d71058bc 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 4c458f06bce..c6c2bc115f4 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 67d91759e24..34fdb66c098 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 465d7668981..e0f5f81e5ae 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 9712f1f780d..638557f1035 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 976de89687b..0b9dbbf06a7 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 dc7350982e5..3a77ce669eb 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 4879d5ce9fe..24cb45a5c45 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 9d5e030900e..4d8fde97eaf 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 618ec938208..02bbd32e417 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 e46a184ac44..1593319c8e1 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 eac0ef77433..b961d12e5a8 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 c8a1b1bd240..c06b4fabf99 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 4dd852403d0..dae30a669b3 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 6260a5bcb22..76890e749d7 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 ec2763d01f7..5eebeef1553 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 f302a4fdb90..522b42dd500 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 18759572439..0108f532d6a 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 3830c131650..1ff63331f52 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 fe588e01439..73d18f22911 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 938b86add17..0c4aee8cdbf 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 c43e8079ec0..8d8b837e987 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 800e9a1a18a..6fa63e591a3 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 e37995b0aab..737cc1d0612 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 d711a2edfc3..9da12e7aeaa 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 3793aa76404..62f4031660d 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 079f6eddb6f..6940f8ca33f 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 4bf599b598b..57837479d4c 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 32df2270073..bcced85e29d 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 0dcee9de588..b9bb31d468b 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 aa65b65dc8e..a41438b332a 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 bdc98c5e2ce..c3d783a9034 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 1b819056273..3e6829f6596 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 ebec0df356f..a4b601f7899 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 e9f1b919680..afa73467479 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 8de052d911a..f86289d5a08 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 b38d0fb8f85..bb1c89e1e3c 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 88801597396..618a3a5fd00 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 00000000000..19106050c6d --- /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 6a34670b9db..d3130bd7e80 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 797bf3c55a7..3486d42ae3d 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 361e22534c4..18b45f390b2 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 f4d91ccc352..455b8a7967f 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 1f04e414991..f93f2cc4748 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 00000000000..de29ebd0489 --- /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 8eecf7a087a..b2ccada9e63 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 00000000000..80127b053d6 --- /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 dfc201734e9..0424db3cdc3 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 8ee618ee6ef..288ae9de670 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 3beb6170ca2..41470c2bd6a 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 12b54c61ff3..bc9be34a83e 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 6a81b59c437..fa55b4ff92f 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 d96ea151ce3..bd391ed762c 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 339c0bf6e65..49c7f40d4ad 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 51de23bec32..c349c395733 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 4559384383a..6fa2fd5fd16 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 87e3f720365..b67464cb97c 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 b8a8c59f58c..f947ce87933 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 0d591c0850c..fd46e40d33f 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 c442ad2387b..0d4f83366d9 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 3a40495a18a..740b1684d6e 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 6fdce954a96..0d6ace9da78 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 12b54c61ff3..bc9be34a83e 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 38578dafc89..f2ba2085918 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 40839e8f4cc..33b963e9813 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 ce12d35086a..f86d5d5b2a2 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 12b54c61ff3..27c9fd6fbb1 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 b22057ca71e..5797fb63bd7 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 3f35a246054..9bbf88cae15 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 6ab2cf93a9b..c60162e6e31 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 81f264ce16e..22ff788e9bb 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 d8ff1e97766..08a4779e593 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 68c2b1d11ab..19faba84640 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 52d5b776d5d..2fa93690553 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 2159542b802..e836d84aea7 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 6cf78485ada..b4488c854f8 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 99bfc2f0ef6..1e6b286def2 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 294ffd96bef..b0b65a10c83 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 0fea457b5b1..faf64359f0d 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 ce56480f01b..54e46e8d31d 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 07199c7cffe..4d4282dc4c1 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 156fdcc6c4e..a4d1da866e0 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 61295f3d90b..fd238b09bd9 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 f9ae3236a1a..41a05ac1c6f 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 85527af7d61..5b1ad10c74d 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 b7ad0024d65..2a7afb38268 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 e1d7aa08392..a2979379e18 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 c6cdc90aa4e..016f3bbbeb2 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 8a67cb2db08..ce32171eba5 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 f1f50d84731..7d044949a6e 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 adb7da378db..c469020aef6 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 74abca0ce08..c9732c24fef 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 ee5e2de904e..cee54ccca79 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 f7270ed9444..e4c328c3020 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 bf6bcb094e2..6f68e6a6a73 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 7b38a1ca342..181631047ea 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 b66cfb8d446..f1ee9b9238a 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 6387813915f..9ab753bab37 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 151f7e8fd28..1c66cca87b6 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 4f8c2608853..ebafa93b07f 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 6d704b37d80..f1731579816 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 38a496e40df..bb242ca60f0 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 158524d9325..8be065fe797 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 d10183877aa..0671b162e1c 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 6a1d26cb75b..4fe9b2a7c9c 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 f551eff5243..a7fe2522c70 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 0acf3a310a8..c86016fa0b6 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 951a8419dd1..1d0453704d0 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 e60a9efa5e4..2d02081f6b3 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 ebbe5da4877..aed5dd1032b 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 caa4291b881..379a554e0c3 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 0ba666cee11..b1c853f5f2b 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 f4ea7817990..e4cf0e97879 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 bc5444e7b0c..9641c63dfa0 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 90902691e1f..03077907aab 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 7b3e1fc2de1..47714ea31b3 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 4959b35d897..69d7f7ba3c5 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 f98e4d2ea6e..85c9d4251ed 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 cac431bd450..adbb0e148f4 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 6a04b7a166f..d817129e11a 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 ba0b48429eb..837766ba6ed 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 4b9712967c5..469c9ba6ff6 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 716e4ad239f..4d2b3d6acd8 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 9f9a3e42305..702fda2dcd5 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 b6b4423f629..9626b5bd863 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 f63c0a3ee54..3e5c87b7962 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 b20145b7c4d..7c19cf4bc06 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 fa1582daa73..b82e80a342d 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 a32c2e539d4..e1301cd2df1 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 52685142526..3f6fba583c0 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 413fe69560a..33bd4d3bff4 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 0805a5a7ff7..20b4f8e55a9 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 1e927c081bb..92921d34512 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 b0445528e40..17868c1e39e 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 da77960f288..90ae364c97b 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 da20997d733..84023ea7c9c 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 b05e458f5ce..b8b30ab4159 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 2ef1a75001d..bff7e40f8ce 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 caadb8b4da1..4c5e1ffeee7 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 2d60ef39d88..23dfbb372ed 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 e01a5a40ff6..8a1bf403940 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 a747845c18f..bc48832db9d 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 c6156631284..ed333bb9b51 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 7402843f7aa..d336c5ec105 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 6f45ff67fef..bbdd8f92d7b 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 6fb69db0423..a429a565beb 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 1a9c683614d..1f3359ca184 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 186f6f687dc..8af5df35f1d 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 c376709b628..32177d590f4 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 c6156631284..ed333bb9b51 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 e9e341c8b03..84fe87eda04 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 0025a9a995c..bfa38f9ef8a 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 15590dabc31..127f0241a3f 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 6d975fc2037..4f470da8385 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 3ccf19e22f7..00c8a01e3b9 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 edbd77699fa..f3a60a56c99 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 46685b2b74d..7ee372b14d2 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 5cc940b6d9a..0bf90ce427b 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 e945154a927..591124fda28 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 da50d02bf8d..073aab126c1 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 4c3e69c3d87..0e89342bb0e 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 5c69717cdf9..07860456754 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 cfc522ba8eb..32df9de104d 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 81721c85bda..f2772383104 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 25387878915..943a91fa7ee 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 869520ee956..2144fdd1d48 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 26e66e7d584..92e797917ed 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 80b740b62d9..b50d82bfeb1 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 b42fcbf4e27..63859a000d0 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 c1329c0aee9..8f741409059 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 b0b021be457..0af84ebb172 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 3da622c7f51..98b2575d691 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 7191eba4a5c..8d2f02ade2a 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 f715e1d5711..0b377b5ab24 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 8327206773e..27f0f3d4888 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 34fdd4145de..cdb9377cd99 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 9da6470144e..a0ce124c69a 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 b3863083cf6..47c7bc15be7 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 35ccf1ecfbb..0f769fecb5e 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 c5ffa00dd5c..8cb926fe259 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 527b1a7a374..f99f5ed67e5 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 786bd871ff4..6d8b395f2b0 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 0d7da884aba..c28ca26919c 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 8f2f33868e4..a15d25a283d 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 db7cf1b6ab2..0683f3da594 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 4b83deb174f..289e0a6dacd 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 515e5fbe964..ac50051b6c8 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 87b64e7809d..9776f893e1e 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 71930db04f2..007f06b1c8e 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 6a5f30913ae..49bab5225d9 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 d959589644e..87ebe6dbf9b 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 730f11189f0..020a5807f30 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 b82c0036c7a..f6e9a6c2c4b 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 7e03a1314ab..e55ae8fd493 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 5085372747a..c0913a097d5 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 b02484e1827..bc7466a32db 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 d60b4b5275b..6372ed941db 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 6044aa4fa6f..3c1bfdbd8be 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 8b1c55af089..090aeab1a7c 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 2850f91efb8..de3bc97e2a3 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 6606175b9df..ec5a1869423 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 c1ea81e01d3..a41503b5ea2 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 86855859961..402d8277bc7 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 df4ecc4a05e..c8d48dc5064 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 00000000000..bf9cb9c98f4 --- /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 00000000000..9aecb4b83dc --- /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 00000000000..ce1bddc104f --- /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 00000000000..43859eedc5a --- /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 00000000000..419215d32b6 --- /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 00000000000..9d25158400b --- /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 00000000000..b3ef0dcb85f --- /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 00000000000..bc9b108c3ec --- /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 00000000000..43859eedc5a --- /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 00000000000..b3ae655e025 --- /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 00000000000..43859eedc5a --- /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 00000000000..a822ffbd0a9 --- /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 00000000000..a822ffbd0a9 --- /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 00000000000..8d36316f011 --- /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 00000000000..cec08736bae --- /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 00000000000..d32b1e212c2 --- /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 00000000000..48f9aa81b72 --- /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 00000000000..228912f95a8 --- /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 00000000000..43859eedc5a --- /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 00000000000..de8c2468f90 --- /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 00000000000..21d0438f9cb --- /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 00000000000..52b2c972559 --- /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 00000000000..78c67fb8950 --- /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 00000000000..1ab6aa58946 --- /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 00000000000..e0f7536fd1a --- /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 00000000000..539f0bb4294 --- /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 00000000000..2a34917b909 --- /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 00000000000..14137569e1b --- /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 00000000000..375f8fa7bc6 --- /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 00000000000..15d29e35a06 --- /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 00000000000..e98d60ab4fc --- /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 00000000000..43859eedc5a --- /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 00000000000..7eb98bdd2c1 --- /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 00000000000..21a3703bba9 --- /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 00000000000..7d07ec8da09 --- /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 00000000000..7d07ec8da09 --- /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 00000000000..43859eedc5a --- /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 00000000000..a2ee79efd15 --- /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 00000000000..9d25158400b --- /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 00000000000..ac2a2cab3f8 --- /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 00000000000..78ef7d2df20 --- /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 00000000000..74f9398fbcb --- /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 00000000000..43859eedc5a --- /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 00000000000..d825a885d68 --- /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 00000000000..7034ef0d79e --- /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 00000000000..e98d67fc206 --- /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 00000000000..0e2783d6f21 --- /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 00000000000..154ab2b812b --- /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 00000000000..31188faa135 --- /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 66847b1a6ca..d99458ca4e7 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 7d75b148148..f58069ea907 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 8f5a1a2cfc0..745b136bd5d 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 334641b3059..7f75272b240 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 c195c8a7c7b..6dc104d71df 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 a913ee054c6..a23a0fc7466 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 e8098013fb5..00d43221727 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 eb8695eb8ea..cf07aac4bde 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 91834ec81bb..bfbd2137298 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 da06ae07939..8b46143beda 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 a4caa11a0ee..e44afa53a65 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 99c9cd2366f..06c40aa95a7 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 4ce12cfbe3a..4cf59263fed 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 4304a5e7954..3e9ef97585b 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 522a42ec172..f86eb49e0c4 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 ed6238dd83a..b947ce87ff5 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 9b45ea7965a..3004ab40ee7 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 084ecfa1371..a4370672a96 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 443bb933900..25804bab983 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 f05f025ff82..1dbbc34ab0b 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 406d1e964f3..7c8401569f1 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 358f589dd47..2e8a3ac3b45 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 38fd6134bae..2ff0acc208c 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 c5232db59da..67584ed2f34 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 3a0942e9156..2c367a3e88f 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 490b0c218df..74911d92d04 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 00000000000..7a312d1dcf8 --- /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 00000000000..885c5208606 --- /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 1ab7fce7abe..7c72d55540d 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 b3cdbb2f6c7..5157fecbbe1 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 00000000000..d9d58baff09 --- /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 fac748ca464..4213f532623 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 3fe2d57eb01..62238436eb6 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 00000000000..02ad200a969 --- /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 3feb8eada72..0c47bbbe661 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 00000000000..0b4a5a74c1a --- /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 376058faafa..c7e657e6908 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 00000000000..2bdf5b9033b --- /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 00000000000..fb018340d95 --- /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 00000000000..1d91c657c54 --- /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 00000000000..513ba245c5d --- /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 84d5e17bda1..6df6eed17de 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 00000000000..9465fe55946 --- /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 00000000000..a14c77f6869 --- /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 00000000000..7a312d1dcf8 --- /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 81a39802c55..eecd3a2ba35 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 00000000000..277929cc2eb --- /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 00000000000..ba14508ad00 --- /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 00000000000..1fc83dd075e --- /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 32ecd1e0377..b589d8f5d4a 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 0197329abda..5f9d6ca4620 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 d6776ccd619..478f97f2b69 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 00000000000..f4fee01aef4 --- /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 00000000000..e1edf6878fc --- /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 8ef0588796c..cee2c501b73 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 00000000000..0fb34a86333 --- /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 09eef23ac9a..287b95e51e2 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 00000000000..38a0b869b3f --- /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 15b8ac3fd19..83a9328e4a9 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 00000000000..22b48f1e378 --- /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 c42f0310fae..08067272d71 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 00000000000..554fc68624f --- /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 c594c4f1bdd..4b0806b531a 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 38b7f72ab9b..cf1356a3629 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 00000000000..4ecaec47489 --- /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 00000000000..2cbb7ebf355 --- /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 00000000000..63eb940dec0 --- /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 00000000000..846b3b7f1d9 --- /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 b676cc7be9d..f9ef4339e0b 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 b108a2a6a44..5b51028772d 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 283a24ea226..b22803cfb27 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 3a9be7d213e..4738e236fff 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 6d70f7c3d60..6bb58f5871a 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 48f23aa0cf8..8b0a2ab6c9e 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 b28088efa6a..ab455442891 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 197bff064b0..1bde7176eaf 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 197bff064b0..1bde7176eaf 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 95987d48a30..ab2e8d756e6 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 d1b74e9ec22..bf24ff11336 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 06ca9a058e3..0d8e003472a 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 b902843ae46..5bb18bc5fa4 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 03d97982757..81991bfff0e 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 99a3706cf13..0cc2f475820 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 a412d583fa4..c3f06b312f4 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 ab07c0f6183..e88f6209eee 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 2e1cf68cf26..311919186e9 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 528c6143279..e7a56c52cd6 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 5916b339ddd..48f9ef5919b 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 9749a468b09..ff972c70530 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 c10e24321e6..16230142fba 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 898c533f1e0..18b8c64f52a 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 347fb5ce569..8acd0d0f611 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 56d69efe360..875e32fbb0c 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 4ebd3f804a2..6572570916b 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 c3c769ef7b4..c78ab909b96 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 00000000000..dbc6bca1365 --- /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 6dece462ef0..99095dffdfc 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 00000000000..01e5234bc78 --- /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 521b3fb9eba..0d4b067c5ae 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 95cc2f4406a..612b2028b38 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 96f991c0560..6dbf41d9ef2 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 69f8b745290..2fe09c51860 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 35730944811..3db70384d8b 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 664721c2fd3..c109a81aa2f 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 2ed046a8153..7c6f344104a 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 a11d7b0a12a..9eac2f6155d 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 4382525752f..6db0922e684 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 1d59a36e6a4..42e5b1bb1e4 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 2d6cbb52020..20672e018f7 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 7fb25b58853..a3793c66f8d 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 c47e27f22c7..3624fd2b3f4 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 f97fee03c5a..75cfb04b9db 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 62c28074808..aa5d4dc587f 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 47fb6fc5045..4b18d353aa9 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 02307dd7e50..f766224af1e 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 64f413a78b0..3845e194bf3 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 72b340ec88e..cd7cc7ea91b 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 522a2db1a92..5b8c12bab6c 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 2ff2ad7f97c..0ef9c619c91 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 b36990d9a53..d4b68d04c93 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 1941c399b78..49a94414403 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 f555647e8a9..97f4b8d417e 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 3c6643bf0e0..272711789d8 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 d7d9b1695dc..0368349f75a 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 2ea2434ac85..2f39499260e 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 c5b66f87393..f0b96eb77b7 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 a02cd1362aa..88964aedc9b 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 c7c30ca0fd1..1901be6fd1a 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 840098abd69..36c6e79989b 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 6868f1f7903..4cff9fb6fea 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 1863076baf5..372c9750410 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 84ccb05ece6..c815698099f 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 5e2b3a1f6e5..7192f91ee1a 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 7ad772ae895..f3fec441d4c 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 bdc14bb4f96..665474e2d76 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 fc103b73421..d2f3ed3dd70 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 83e5c363f4e..6de25c240de 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 97cddfb44ba..b5e8a5acc60 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 7e8ab705705..d160356cb07 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 44c732e4948..f6cf42ebe99 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 81e38391a19..043a33734dc 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 e47abb0d57c..37ef8b3740f 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 5b19b4ed66f..3bfc872f0e4 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 48c91c86a1e..16ad1884294 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 6301e8f1862..3cd7c1526ee 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 c16c99a455e..e1789347bf2 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 0f79faa0e1c..16a8c6c392e 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 ebd99d08826..392ae0f47f3 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 5dcf65435a1..62b75b4714a 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 bf38cdb24e0..e64c3b6cc86 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 a435fc1fc60..5c5a25dd129 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 ed40c4105d7..db2f4ca9447 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 0c853a79a3f..19f2121f42a 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 f27fc576dcd..36ce6153796 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 72b322178c3..d2192d85f4b 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 b9c4d698da4..a0d4465796d 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 fa785558c66..ef86613ea79 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 196d1833bab..3010cfed63b 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 5f4664dae9a..c8c45bb1083 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 444d4b93c15..47b7d0e6b74 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 0974a312f9c..a14a47a459b 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 ece4f091b0d..52f4ba34e32 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 cc2cce56d0b..8602a1adcbf 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 86e0418be34..dc40fd0d66b 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 e9bdca8ffe8..afce1415ba7 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 9e6edf3b8ab..1aecf403a4c 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 18161cb7d99..c1c7d9746d5 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 0a6c90a15b1..a4fb8960af9 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 d220fa7fb63..5f5c4380586 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 ccd298e262a..8f754b309be 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 f39ee5e11eb..8476f17077c 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 a7680b67715..b3845e0df57 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 4994ffddbb6..de34abbeed0 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 7c72068b93c..3b2ee2eff9b 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 57ae3d10fc4..bee4c6b9757 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 c214bd3215c..d217640e44b 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 668927f2805..734a23bc5e0 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 3fe3b06bf9e..4fc2dec0ac2 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 b2ec33e67c0..19376d363cb 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 d201fe70ab5..d9941443f1c 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 177662c6f18..ed0cc9cdc1b 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 edc03010a5e..f1d45416988 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 5e4287caa66..f15cfc1a2de 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 ed2c1a7d825..38bd29b96e4 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 286550aafb1..0fe8153cbe4 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 0ec8d9d8546..0922f1b3344 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 1b3c2a17d83..a45141ff50b 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 ddbf61d9e3e..f99071a2615 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 8c204171e5b..0b1ef34bf7c 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 02f627e07b3..c5b6b0fddab 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 b4eca4629be..ac644d26418 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 52a707a050f..8e091a7eace 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 6e5a8c9293d..a9107341e37 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 305684b3f16..ac47147207e 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 bd6feaf1019..739a9befa82 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 421ade35926..697fa1acf52 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 6e5a8c9293d..a9107341e37 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 74d981fa2e9..7c63779d5ac 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 c1bfc9596b1..b5973638373 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 a39efca5fa8..ded950bdf69 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 d179d634143..45f939cb855 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 97cf128fc38..60a896c34d1 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 6e5a8c9293d..a9107341e37 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 cb70263e07c..b811023e88e 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 acd10f5794e..13cfb7bc911 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6258ab61cf1..5b78cbd791b 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 e3edb991fb4..a9107341e37 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 252b87e1e1a..34c645e9802 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 94c4f91abea..8e4d8cec492 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 6e5a8c9293d..a9107341e37 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 996f5823a5d..356c842839e 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 6e5a8c9293d..a9107341e37 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 4fc85c40103..21b5282eb6d 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 6e5a8c9293d..a9107341e37 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 3eaf52e8a86..e0f4b187e54 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 4b2af95ccc5..a348c0d5572 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 6e5a8c9293d..a9107341e37 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 311a6fc2c63..1b3b3f9fb2a 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 b7effeac9a5..cd39935f171 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 28772b25c47..b6e915aa35e 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 7127066c129..f9c36f4e72a 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 6370a98d6fd..b87d9af14f3 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 f16a8cc4057..2f59ea2d38c 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 c62cccaf490..936c64c2a77 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 6b753642e84..1732a5b43bc 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 ebee314c56a..16b3b461ad1 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 06439ef5cf4..d4fad7f0160 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 6d4d31e0134..43af25b9047 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 0e4ef864075..4193ccab890 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 db7dd9852c8..5ddf4f05184 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 6fab5421373..dcdc2becf06 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 af00e027a8c..442420b1c5d 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 00704aad523..4ce9b99b738 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 5ba66970d3a..04071c31cb1 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 f948b11007f..9119d281dd5 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 ad4b78ae563..007704bf406 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 a001deee547..55712fd8590 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 ad738c2131b..22a91d7dfcc 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 3e13c944a33..5346a777cd6 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 47180cf070f..7b4bfaa1c08 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 634e1f3b6d0..ec7bad9997b 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 2b4edb07c29..7102410aed4 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 60f9c60e8b5..43477e1189e 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 d61ab9ce434..c5ef6071dd7 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 803d058e0c2..d8db817507d 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 eb02c27d748..81803aa8cf4 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 32aa48328bd..19767b7662f 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 3e22c7cba55..d3ca58546f1 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 df10e978d72..0f1d3985923 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 70ab49a8017..05d429701f0 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 2ea67ece4a5..ecd936975bf 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 b447c2e44b4..3c84a7e6d5d 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 64a6d760d45..c82271a9ffb 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 d5a8a89ff60..2e607435b7e 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 096164e7291..c36bd66304b 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 fc5b04e1038..164d1b1a730 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 02db7d60823..60d9f681be0 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 4883c764320..42221f7ae83 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 54ed72d674e..acf619e79b7 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 2d6c9c687d8..bfaf0757ea4 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 e9887441c00..84ae9155b37 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 22a0152b73b..72756d78a65 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 6f042345407..6171f68a081 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 77ec3bc45dd..6b9691723ae 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 cb6c71f06ec..dde9a2e9ae9 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 90aad3286bc..4e9044f24cb 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 52ba1fe06f0..bf7641d6bf0 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 c245e010ded..df745a1ab2f 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 bb35af63373..8afa9b632f2 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 5e44c2612d8..474c194c06c 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 bef69802ba9..e9f3dbc9886 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 7f4ba7ac899..a16deae968a 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 e067002ca89..a4d0986bdd3 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 2e73c109e57..22720fa8d7e 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 93d8e43553a..c453d6ea608 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 0747ed4514a..4a9463ff005 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 db03b4af231..12781109ede 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 98d65a2d243..ebd9d44796c 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 bc890e9715c..bbb03d853b6 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 de31220ac5c..9f2252f4f87 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 b069a5f0f83..3a467eee129 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 4b82173125a..1e8aa31b627 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 79f6b986252..cf7d63007ff 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 50b4e4bc70a..96b69da67e6 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 cb718668daa..6b7545c183c 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 9296127a38c..251823db3dd 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 92996894128..ab9995610df 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 c7ef7f65875..29719129e81 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 57e23bee9df..805000b2e92 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 ae50e14d40a..56ab439aee3 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 7cb0ffc5f80..c1e7d6b6f26 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 bdf3bbbbe52..070aafd42db 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 26a5c0095e4..2fe375fb1df 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 d7298b2abeb..c0350353b4c 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 81d77b27a3e..5979caa37db 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 32474881a87..7d1c3d1b1b8 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 7caf60b7edd..a5345f4145e 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 fd278d3df2e..5c29be09d94 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 1c52c557024..a8c79324494 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 5229881fbf4..fb75ba9caef 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 e250da7627f..c80074459e5 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 81877654746..0c90c29f4c7 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 498a9605833..c912e9f7f0d 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 7678712db51..1f6abf10563 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 51f00ad98bb..eac6df85f43 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 b5b10534759..3cb22a22541 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 14e6e6b406f..d888b30a3b9 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 b98522feb4e..99563ca65d4 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 64585538948..0c6887288b9 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 864d131d287..3f4944fafa9 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 c5aa74706a1..3f2eaf698b9 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 a58bcd6fa7a..0a5ba84cdb3 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 2e82ecb4f6f..2777d21cac7 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 0547e35f064..a0b7d865a1b 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 7cd4accf59e..ce58b1780c8 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 92351e40108..789c23f21de 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 ad334f848ba..d78947f3134 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 cfb4637a6c4..84085f8711a 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 91531a9ee38..3c801474235 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 cc777b8ad7f..5ea76472739 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 ad160a1ba8f..cb5d1f4499f 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 6b826d8c29b..34e0231d75a 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 7947ba5ccef..d10dad43d75 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 33ca6265552..634952dcfdc 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 5c6fbf71738..946e40b7e23 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 3c5c70b2bd0..baaf3d44eb2 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 c96e6e549c0..419e4df7552 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 21cd6aaa97a..27b6445a4c1 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 02e3fd7fce9..2f701a2e146 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 78cb21bc88a..5bdf9a07f04 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 b6bab174962..8eb993ab6f7 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 eac6df85f43..379f6c48ace 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 e3d09977c1f..43605de67ad 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 3cb22a22541..0c057ba1a71 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 d9a79d6555c..7fb96fdf7c8 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 17caa1f7478..897367619ed 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 9e1bf043f54..31b26bbd511 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 5d52f13f39e..d2a14101666 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 ce58b1780c8..3cf11736cfc 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 789c23f21de..8f07c7bf6a4 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 c80074459e5..553dc5bac83 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 ab52f2b23ae..b6170225320 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 3cf11736cfc..ccf443d0860 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 be94f8dd27a..a8c30220637 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 00fd30b5278..aec1fd34b15 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 a03bc3ebd00..e90a08f69fe 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 f55e793ad92..1287e82885f 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 | 58 +++++++++++++-- 11 files changed, 145 insertions(+), 64 deletions(-) diff --git a/homeassistant/components/unifi/.translations/en.json b/homeassistant/components/unifi/.translations/en.json index 289e0a6dacd..618c393b7aa 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 e9f534360d7..e3225a2d210 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 781fcdeae82..78389c6a2d1 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 4acf75fbdd9..803a892647f 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 3f4944fafa9..f2fd5760471 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 3f2eaf698b9..5e50a75409f 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 2777d21cac7..0eff1eeea35 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 40f4e1f5008..f436a86c6b3 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 644b0856bb4..a30dc21854d 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 3366ec1641d..09b16440f94 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 84085f8711a..c204c75a122 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], - ) - assert len(hass.states.async_entity_ids("device_tracker")) == 0 + 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"]}, + ) + 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 4479e269e87..67a3bb0a49e 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 4d55ff328b8..118c3bf7f8a 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 ad0330b56a0..34a396758cb 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 9989b9d530a..5f80813d108 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 e5fbcf4d421..5cfd9c36967 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 2cdc8fe027c..a9155c7b628 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 be3bc4c52c6..8c475a114eb 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 e4ec6a004fb..97a5d00a30f 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 ccf443d0860..f25a7b25505 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 8f07c7bf6a4..aa49dc935e7 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 d9cd62313b4..814e59e5571 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 31eb43fc611..5fe796bae20 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 8e6004d362e..d8734ab7316 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 92650715e5d..ea2b3c3252e 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 89a3065bcec..700240bf627 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 d8734ab7316..00000000000 --- 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 5ec14e9ab6a..e491637ea65 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 663d5dd89e3..a52927ed497 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 ab50e6dcc4b..c3600da4051 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 2a67cf5348d..788e6d4981f 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 9a595ab7a94..122f00f7b59 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 d99be94aaf9..c26e42a22d2 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 a58330ad227..f09d4d1a4d1 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 f25a7b25505..5ca56644cef 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 aa49dc935e7..39ce1127659 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 805000b2e92..7d8d127e64f 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 3d9126610a3..ddb753ef1ca 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 ad415481e8e..2cc7dfff689 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 a588f68ea4e..d3d81a6a7af 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 ecb0241c724..9637b0fb371 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 a6b4113e314..052228e7aab 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 ec100733a53..3d21fbae960 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 5ca56644cef..4fb558c1c8d 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 39ce1127659..c4717c45c69 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 3171b8e953b..241cf443244 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 fa33b0315c7..dc6197c8c85 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 4fb558c1c8d..1d047db6c77 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 c4717c45c69..7af67985633 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 2553dbea74e..c8c5fc4d499 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 3500a3a4e3d..363d33b14ea 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 ea20d8c9216..11663672bb2 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 7a3e1e8d52a..738b49f4c54 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 76c2cb9889e..4c30457b62c 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 7a352b4e8d1..77c436d212e 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 b6c59604b74..06bbf10a8ea 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 "