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 043fa62f6e..09f735c72a 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 d268c12aa8..c7595de0ee 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 a75ae33f86..1bfb248d94 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 46404de0c8..0216302c65 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 a7a3967819..3081c1d0d9 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 b50bdf9734..ec7c729d59 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 4b47014af4..e6a7f827f1 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 0af5aaf2c7..924559e3e9 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 cd3e704f62..25de6862bd 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 89f005b746..378f1b8fbc 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 32066c67b7..bc1f4a038b 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 7679b97d62..687fefa94e 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 126a2432cb..cbaf8d43a7 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 45c123fa2f..ba1855247f 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 a73919844c..07a1c8b6e5 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 21f552b416..cefeda0409 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 ce21aa53d2..d5b303a51f 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 7749c419ca..7d0753a9de 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 460c99618b..6b774e9d5c 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 14ab79b2d2..0ddb661cf8 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 bc4f5fc339..45473d6f44 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 f71791e019..1223f3525c 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 c9612a7ded..37617192dd 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 151021a45f..803fd6c3ab 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 ecb38ef577..367b9ceda8 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 d8ca803139..1aaeb154dc 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 13e8029b51..2c439407c7 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 949957ae8e..fbf49ffc67 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 5df084a11a..a4ba1a41fe 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 c12f2ccfd3..7051ec046d 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 b4ad0a556b..2f9944db3e 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 9aa3c62e76..1f8176968d 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 2d5f2412d8..a494e78bdc 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 c34a46a8b8..8b9f335593 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 dde092dd1f..002b032fa9 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 6950929ee8..e54fcff139 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 8a54c74569..a49802ea96 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 8152a76fee..e2bb85c9f8 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 014c46fd73..6684a5b882 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 f22a169a10..e61c4cea6b 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 d7551abebc..d992c28746 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 e2cc0dd31e..300927abef 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 e0c48062df..edac0e6e3e 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 056105f807..c2974678fa 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 6a528a66ba..d16722525f 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 0724f9f9b4..80557caeca 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 fd8ffeeaaf..ae0e55ae51 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 202c588588..65bbd9affe 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 01c010c497..341451522d 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 e063fc49f2..19fad984b2 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 7630169dca..beb1c1cda8 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 fbe9824d06..f698a9d27d 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 05ad0783fa..b4f15a2999 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 9fbe3eff82..3895e17202 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 bc402b46fb..ad0c590b87 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 294fcc2518..e3a9c09b5d 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 4d508ce2d8..7c2a35938b 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 0205bb308b..61bdb9a286 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 a7ddcc0831..09af5ad5c4 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 1d53525ab3..ff5aff6fe5 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 7d23e15a4e..024af9b158 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 edd3388e74..88103ec94c 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 1750e9b0ff..52a82184dc 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 f531635009..fd3958344f 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 0407a1a0fe..c2b6775815 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 56d5bcacc4..4cfb2b0a26 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 16c8deac72..214bdf302e 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 c489dd8e38..e411cd8204 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 6201348f21..3365e5b10c 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 dde71d14a9..b17313925a 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 b13906b44f..4a58f8f43c 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 d0b8d8c116..3c67e2fd55 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 4fd86d078a..dccc4ac076 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 50f897e3a8..f2f79f5ed7 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 e936898d7f..74554f2afc 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 b8ddec2044..afc83458aa 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 1d38764710..f0ec885a8f 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 e0039f29e5..249adf04af 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 aec68af607..12fff2f479 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 c1bd7070f5..ba831c3a1a 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 4c67156c78..40a592f89c 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 d4bb5566e3..ddf7e61a3f 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 f19548c4ae..b0e16e412b 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 4aabcbc75c..78e4c43a0e 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 bfc4407458..16c2aa5346 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 28d20d0db4..8db9cb6fa3 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 5200c6b0c1..7a12f61774 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 580ffd606f..0d07133b39 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 e5b0dc8b6e..822a7988d0 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 f45c81a000..9f8ea5607d 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 4939c0c83e..b00a0d0d9d 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 6c02e430ba..b60cf9457a 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 b25cf977d8..1585de4b46 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 ec28649d70..16bb1ee6de 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 3da77d6d94..c584440874 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 f77244a584..8b7867fdc0 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 0f15b6e937..69acc97130 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 eff11554a3..663635cd06 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 2db20662a7..b447018e79 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 3739f77e69..c82cf14228 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 3c4cd464d4..df5f6af169 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 006929c734..8399719e86 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 30542db5e2..c26c3f5e68 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 e86b3dd42e..d84c408e43 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 a08f7dbedc..b417c12891 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 324565aae5..70fe1ef0b6 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 f78966253b..31f2f88dac 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 33392c51be..c2d938f6ed 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 054028b562..b3635dcb1f 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 4674da420b..9609af42f6 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 b8665fae9e..9ba008a56e 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 148a7db2b6..ab50e6dcc4 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 fa47ac35ee..3340e0ad60 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 d4294788fd..6034c24e31 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 cbe760c06b..5b268266dd 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 9233b3d152..46f4de2784 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 a08f9522c4..bc9ef9f9e7 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 7c1b0ece4b..271db41ac2 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 e708504ff7..103ec694d8 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 232540ee47..83a1af981d 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 aad62aed48..e366f6bb3e 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 2895bde0bf..d249cc5ac9 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 ace47a56d2..eb9c9c90c4 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 c3c9138eb8..004dd36ed4 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 bb1179bb1e..d54e6dd968 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 8c9c9e1a6f..4ace2c6eea 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 50a219bf7a..851823385d 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 45cccef976..937119ff6d 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 8991ce4c65..df918d3dd7 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 14fc699637..3e3232f2b9 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 7948782479..52560ea273 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 f4a6b55dd1..a5caac0012 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 a5a7f320d9..9e95f3cc05 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 1deb564133..6081f1dfca 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 72507b3d14..ee9969c997 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 f084c135e4..dbb650a8b4 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 358056d7ef..0850bec6c9 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 07e96a45fc..43494ec485 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 b46771e574..5efb73c2a0 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 ad82cd9e79..ad1b27f1fe 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 9c83dbce80..16239e0c98 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 e2c92d07f9..14f3549b2a 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 f4d9f97fe4..87f55fd6b2 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 4ae3978733..a74381b8a8 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 db1ba60364..0ca1f95044 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 cec481a2eb..24ed68c792 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 5988019e66..b8c05ead07 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 ad8ea45ffd..4b6d99da20 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 4fcebe7347..07acf6057a 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 fa72ab184e..7a41d23778 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 ae032a8b35..533238ac5e 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 a7e49f681c..2c95198f34 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 befbfc001b..ed71e05bf5 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 29e24b510e..3c06a75fb7 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 1491c10777..57c4fbe619 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 3b94991312..3fb5491ea6 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 6611cbaf9e..ec9c6bb1f3 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 2ff31a8fd4..a6b36a71d1 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 6b9004595b..2ec3467e0d 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 21bb5bcf99..ae999afe30 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 0a0b9f0fe8..a40529b6fe 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 cfbb221c16..b8c2bc277f 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 ca19feba5e..f450fb6283 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 0cbc59f76c..3239eef2b2 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 a5d9daf91d..e4419872e5 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 24b0563890..c4ad22abb2 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 9dd8695b9b..10a7bc38c0 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 afcfd7071e..c00c19be42 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 2f9944db3e..9bc22ae668 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 e9cdb89711..43ccb6b8ad 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 3239eef2b2..2b87df584b 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 e4419872e5..543c0a0068 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 663635cd06..62c0d3dd2c 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 b447018e79..a7e7eedef3 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 c82cf14228..b2f8e27298 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 24150c513d..7f48c7ee22 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 2b87df584b..d3d1f669df 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 543c0a0068..24986a574a 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 f4c36d988b..a70d87673d 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 5ad59da5de..841fbb6817 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 1f1b7088b2..fe6526a16e 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 8fdde34470..0124ca1cc2 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 e0bb1c3bb9..781fcdeae8 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 fd94601db5..4acf75fbdd 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 50b758f01a..03e079c017 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 58728225de..61116adfb6 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 0df019de02..0547e35f06 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 9a280ffe9e..b89dbfeb70 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 bee7364489..e733bbd8ab 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 b57f3fbe14..bbd90442cd 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 eb0236cf3b..293fe4c647 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 5700419106..5625204c76 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 13a7913e19..b34c90bc35 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 196e8d704e..96e5feb532 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 1f9df527c2..333da7dcee 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 002b032fa9..ce2ecb89d8 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 e54fcff139..c00510b563 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 a49802ea96..92e07a0547 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 49a1bced57..5e5597f50d 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 e2bb85c9f8..6f7e379630 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 03e4437b25..10f8d67010 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 e61c4cea6b..2e848168b4 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 c914319aa4..ca76552a4c 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 432b25ac60..b5eac4f9af 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 5c8c0d6a75..cea09e97db 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 b14592d1b7..67dc07f68d 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 595144013b..022878c827 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 876c7a1f05..90ab408775 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 beb1c1cda8..62c57daf19 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 a6eaa21ae3..fe131e4dab 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 ad0c590b87..f109103a99 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 bb25d2d619..0b99224bf7 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 88103ec94c..98d625cbb1 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 52a82184dc..3319ce6bee 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 4cfb2b0a26..db72c87a4a 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 65b7b1f6f6..28b577354d 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 214bdf302e..97ddd95f50 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 bb11565006..cec550d24d 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 e411cd8204..19f3344fb8 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 70a15a0dac..749a3e8321 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 1de1a4bd6c..ae5df38788 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 e86d6f7d83..d9500c7a00 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 f2f79f5ed7..5cd270d500 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 8db9cb6fa3..dd67cc2878 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 822a7988d0..702f3146f8 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 9f8ea5607d..96e0eef68a 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 e5853fce5c..9c1c4b5436 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 8b7867fdc0..8181e54640 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 69acc97130..c719febdb5 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 73a28aa121..b486e907ee 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 f75e3a692f..9244247909 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 ac36cc1eb4..aedfe9018f 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 57b9bdb61f..f5f23f2f11 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 89d2c1c01d..a0f1dc57c9 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 34a2a1a42b..07b0453fca 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 c2d938f6ed..6ad030078b 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 a4ba1a41fe..7be0c64ee1 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 4f9ae7fb73..971b817499 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 5936b5c334..e342b2d341 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 9ba008a56e..b33f2623b9 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 bc736a1ede..9394c568a7 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 21ac9eefdb..b232e2e63c 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 6034c24e31..8a24079458 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 5b268266dd..4a9be339a1 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 ca5d77b2a8..982c0fe2ba 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 34689c4dcc..3149ae5606 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 c1f51ab269..41db6c2693 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 4ace2c6eea..ea32183b51 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 e7f341c90b..db37f4669d 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 9632997ac1..88d6681a80 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 5277a33097..c79ee15db5 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 5bf9b8061a..b3a7e8758a 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 c621a12943..c408080524 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 14f3549b2a..b2b8aaa6f3 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 a74381b8a8..6be07dfb1f 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 07acf6057a..eae8c17edc 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 7a41d23778..14f6308470 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 3c06a75fb7..f5f3e03b76 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 59863464d2..2f69b98bcb 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 ff7b47d601..9d9c9dfb8e 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 024af9b158..5af8d1eb65 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 5f7e46510f..69ed44cb7d 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 18c0825b6a..30421756d2 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 bc59be0d1f..734f67906c 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 428de1a683..df623a2fc2 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 59a4b0306d..9a6b22b51a 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 250a0fe26a..1c40f352ff 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 3a456dec53..d9d513198c 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 8fdcc9b8f8..9790a8a713 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 62c4bc3a06..ab5d562ffc 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 0be5957a29..677487945b 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 4a712ba053..8474849bda 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 0000000000..8bc7c22083 --- /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 d3d1f669df..e5916a146f 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 24986a574a..d1bfa69bbd 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 0000000000..1e598b3589 --- /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 12268d48bb..1193f90ff8 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 9265c57bbf..d9155ece2d 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 0757770d2f..d57d3ad992 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 5885aa01e6..00df728fb3 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 9790a8a713..f39d458bbe 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 4d358bde77..6d19022f95 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 0963d15149..f93d519035 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 dcadd4d436..61648c85ad 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 df623a2fc2..126cb37f14 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 b52641105e..dc1b943686 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 81a41b8fb4..d0cbb4351c 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 e5916a146f..5201014713 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 d1bfa69bbd..b1977b187a 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 0adcdb188d..f57ad20f5d 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 973d09a384..2f2ed8f2fa 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 fa0a91bfab..09cf8e25a1 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 ca95c0754a..4c5b2ceb7d 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 267b5727b8..ade167e1b3 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 0000000000..03ece744d4 --- /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 0000000000..dcf16ede58 --- /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 8bb1ab2dc4..31879c5c11 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 a5b7139803..283b1ee228 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 d6351db17b..a6ae0e96c4 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 84be74cee3..45e24d8193 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 5201014713..66254138e5 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 b1977b187a..73cea897aa 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 56554efaa0..b90e612044 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 97759e96b6..938bc09f59 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 96e361e260..1a1cdc16f4 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 0000000000..cef4081c60 --- /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 b74fcd64da..8e2290a9c4 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 2c439407c7..587cd85a2a 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 fbf49ffc67..7ff47f7a22 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 7be0c64ee1..86b6097ad1 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 c661b1a59a..df3d9e8939 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 c6ce439129..d58f483d44 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 0000000000..40faa097d9 --- /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 1c47be4565..2bc5f5040d 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 ec1848bf1e..d0ed9a9d33 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 beb6679e30..2eae581bdc 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 66254138e5..87228d5207 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 73cea897aa..8e408e1d24 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 bbbc6561a8..eb8d16d0c0 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 87228d5207..95bdb6f7bc 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 8e408e1d24..c7278c57b3 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 7aa185c2c3..29cece92e6 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 95f31b6782..a9b5656a0b 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 f4062458d9..36698db87e 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 ffab0e0846..af9a721f1a 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 29cece92e6..60ca91b005 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 126cb37f14..ad8ec114ea 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 52560ea273..c6d6656f13 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 dccca97a1c..d9adf6015c 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 365f84cf7a..e4bdd140fa 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 ad8ec114ea..6f7910f912 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 26ee7cb8bd..97be043402 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 97be043402..26ee7cb8bd 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 cbaf8d43a7..254d841aeb 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 1be06876ba..5325544bf1 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 851922e4f3..c41d5afe16 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 0000000000..cd8c0d27c3 --- /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 5657e646be..ce59c95913 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 0000000000..2c48b14bb0 --- /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 0000000000..9693d59fc6 --- /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 e7394356c6..1a28c3076e 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 e06eb3a8ef..6868d21ce1 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 0000000000..5539c6f82d --- /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 dd0342a06a..1584d342db 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 95bdb6f7bc..a820ea3423 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 c7278c57b3..9d050e7288 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 0000000000..21252facd7 --- /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 0000000000..21fcb4798d --- /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 3d179c63ad..4d88cdef0f 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 a32a28993c..416918e6f4 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 a820ea3423..e1d63b4b75 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 9d050e7288..e5b86bf59d 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 47c7a98023..d497aec0dc 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 8f1155aa5f..bb01114a5e 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 121262065f..fcdee98a74 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 cd8c0d27c3..ca868b8ebd 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 1907d9d23c..a4ab9123b4 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 bc41d3d2df..6a5074c6e4 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 7e837ca5ff..8b1c413b20 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 6bbe75a801..0aa75438f7 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 0000000000..ab556519e0 --- /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 0c5e213ea0..34dd01d06b 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 0000000000..f9fa46b666 --- /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 655000662e..afdea87956 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 0124ca1cc2..d42a647c82 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 5c45e272e9..d57d80c791 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 2eae581bdc..0cb788eeee 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 e1d63b4b75..6724b83d8b 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 e5b86bf59d..83255df571 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 734568606b..1720c2c58c 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 8834f730bc..888ad87a84 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 795f12266f..43cb993cec 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 885cfacca4..2436ce6298 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 d463ebca36..bb7ae3f75b 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 6724b83d8b..6ebf1213c6 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 83255df571..307113e9b1 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 868bf44a11..e630f201e1 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 f1ddc4abba..034fa23a3a 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 f860c1cec4..7678712db5 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 86b6097ad1..2b9a959deb 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 d5cb3db3ab..44bb25b3fd 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 5325544bf1..aea8ecadaf 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 27c16fac3a..f933b9c992 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 9b2c95dd7c..e4fb72db91 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 5172322a63..e47ac69be5 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 dcf9c36474..dea116b390 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 293fe4c647..9b8a5637de 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 1f8176968d..aa8d19dc40 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 f4efd0de35..b7df82961c 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 c19a0033f8..76fe619cc1 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 5d709ab1e6..afa5013b33 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 7d16f072b9..900b1caaf9 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 6bbf30b000..0fc3e55a58 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 515b7cbc61..3157a00aa9 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 257407bb76..484bd70848 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 09af5ad5c4..9a8d617721 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 f8a10017ca..53ce1c0634 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 ceef8acf7c..a824d5f8ee 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 603aa82612..88fe94eac4 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 94a171d9c2..95e7e2cc40 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 554ae59f39..919a20d0e4 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 3c67e2fd55..5c4aa762b5 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 6eb539c19c..efd1a74f5a 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 a0a0f6ea18..2679170b03 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 e9a0df5c98..ae798bf4c0 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 ba831c3a1a..61ae05fa01 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 40a592f89c..7f1cd547c0 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 b0e16e412b..a2adda95b3 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 5bc0c1bc53..e5bbe88edf 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 1bc9c116cd..16b25e4f85 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 4c9b6343f2..6baa3a63f9 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 42f1f62d10..8814c8968a 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 b33f2623b9..76b225bd93 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 55c2371aab..fb0df36d4c 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 9384c58db8..6efd4c849a 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 40ec4179cd..e5afa272c4 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 27a81b2a66..d11ff84a73 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 ef9d9b1ddc..24bfd77f76 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 ad1b27f1fe..c891c698cf 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 c9b4aa53fe..fe5b1dcf3a 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 c6aaeea7ac..9955a650cd 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 3fb5491ea6..f1b76075ae 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 4cbb7a2349..bf6db55a2d 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 145bb42af5..c724b9e890 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 9136b53ff0..28161cfa18 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 306402cd2b..1c5224d89c 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 4d4c7d3d90..5cbf0d411a 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 1c9d412d97..c98833a7da 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 061d2c5c99..621dc09930 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 60e73d4897..520c3b516d 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 0000000000..cdfdff404e --- /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 0000000000..3d2b30f107 --- /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 0000000000..c4f1d0efa3 --- /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 b90dd8a053..0d0edb841c 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 fee9923568..877fdf51f0 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 23b62bb033..da3c432a6a 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 63102c2968..4f585d964a 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 af5266ed4b..7d09e24889 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 9ac0a36ff9..60ebeeb156 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 0000000000..d8dec2c40c --- /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 ab3c3e6adb..a7ae6d4557 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 1584d342db..e00cd1b593 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 649cf9af6a..5574c93c51 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 b94a40135d..2c15d3e418 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 2c2e2b8638..72651d6eda 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 c27a72865f..9e5fa983ed 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 0000000000..52ba55b509 --- /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 79cb4adedf..62cd47f831 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 9ff6cb4058..a620872645 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 fa63ce6345..fefa07ffa6 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 362bdbeddc..d1b2209294 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 136227ffa7..732a331681 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 9e84815d63..c915c5ead0 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 ba09068e7e..c41afad475 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 3abeab3226..768ef10896 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 ab0409694d..c42901cd6c 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 13fa67a8b6..e6e9110b33 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 6ebf1213c6..1eacae0399 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 307113e9b1..65453aeff2 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 0a7973709c..c7e708e320 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 368d610c22..5741af47a0 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 67fcbebe9a..3e3d63965d 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 1eacae0399..713679395a 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 65453aeff2..d3ad10c676 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 c6430546bf..b73b749cdd 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 713679395a..9a03a72d30 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 b0808d83d6..3171b8e953 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 f450fb6283..3258f0fb2f 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 9a03a72d30..ed8a0dd98e 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 d3ad10c676..bc8276cf45 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 a0eee38c3f..446fe898aa 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 b91b815d58..62e5ed891f 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 e8b4e92327..bf2468b704 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 2fb184848e..d78b5eb264 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 3258f0fb2f..d0253ad723 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 ed8a0dd98e..9fd3e1a303 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 e0daacd98b..89205d4ee8 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 f7140bdb40..540e39f8f4 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 c77e0b3254..02b0e2ea45 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 9fd3e1a303..358d8aa62e 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 bc8276cf45..4a6308c890 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 6dd431aac6..f936279922 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 54dd684f6b..aaeaf19c5f 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 7cb4529650..bd5a0c7204 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 36dcbc950b..4306ce4e71 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 df3d9e8939..b795207722 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 0fc747ffaa..0f48ef6376 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 3081c1d0d9..d5487bbe29 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 689b279c5e..47a7f5a203 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 ec7c729d59..9ce3809bfe 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 687fefa94e..85851bcf69 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 254d841aeb..a59beae1d3 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 ba1855247f..f8c10516f2 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 d5b303a51f..03e22cd72e 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 7d0753a9de..6de462b902 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 8c925bdf31..71e694f680 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 6b774e9d5c..6ef1c0aab8 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 60ca91b005..861b2fa30e 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 0ddb661cf8..9e774bfdf1 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 687d0d3126..9ecd2ffd15 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 eabd4a7f74..5150314269 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 358d8aa62e..0805d384c9 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 4a6308c890..8f62b8427b 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 b63acf4ab4..cdaa30dc04 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 8a540a96b0..b0da48ab71 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 d0253ad723..fdb7f8f18d 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 0805d384c9..cbac7186ed 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 8f62b8427b..7a35896b49 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 ce59c95913..1e8e2e20b2 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 2c48b14bb0..0a55a21f6e 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 9693d59fc6..ac8008f7f9 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 ed1bc1c8f7..a588f68ea4 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 e468c51667..649be55e94 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 113957d140..93b98a7c9c 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 b2b0481661..d9a79d6555 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 c17c79ccbc..17caa1f747 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 6e1c3d9f8f..fc140420d7 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 46b3a9943f..f5519ea903 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 5150314269..c8dace4e87 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 eac1c36401..85ff4a3f5b 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 ddb4954794..8a3f2f3f96 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 02b0e2ea45..0bcd25569a 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 1509402d72..0414dd0e8d 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 80dc959c13..335befa937 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 4c36cc0dd2..c7086bb2e8 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 1859f084bf..e86a187793 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 756fb56acc..d5c7dc6853 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 ca38f26ff1..2eb72f6bd3 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 80c245b8d8..e4cd0e27a3 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 9824b20db2..06ab3ab148 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 93c88655d3..ff1faf3982 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 d47e5dea96..6144ccc687 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 c7220d8e05..dad5fc88e8 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 4bfcff4ce7..abcc46cada 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 8c4bc1b3cc..fd6950a88a 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 99c84da633..c92837d241 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 f5181a7d33..60fe720403 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 5fea6c3f2e..9101e342a2 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 d076d71b24..891b485bd9 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 df0de2079d..db9d8c7d3b 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 0061aecade..f4dd2cb6ae 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 5908523e6d..643f42b420 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 f5795a55f0..1f40047094 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 b498e4476e..0d3639040f 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 ba934b804d..2f22b9f634 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 bc887505cd..2b5c3c87a5 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 f7f704e998..2a8e2a78ca 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 8922249e3f..cd402b3db9 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 cb063c4c04..5508f4b686 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 aded8c1c9a..4266d55926 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 58eaad4648..9ed57d2d98 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 b871fa029c..aa55cdba35 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 d756fa457d..36ec1c79e5 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 ac18b14682..8681c308ba 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 6a3591b001..f02e964fb6 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 2e032dedfe..6afeed701e 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 c7910a1254..fdfcb4de04 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 493940329f..9479f76c7d 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 204327043f..3e7a935961 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 18e5a4b5ed..55d700c649 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 e2b49ccfec..b8c711c1dd 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 48d8c58dfe..1b5fad1b58 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 f6217eeed1..729219d8f1 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 cfdda5a0d8..bd72cb8c06 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 7c9e7bc348..41be3251b1 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 2741ad358f..2ead58c0fe 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 3f9c0043a3..f6e88ce289 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 348f614838..6e8899c79d 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 614fb0d98e..f9d4cf09e0 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 af1d9d889d..9e3f0e956e 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 2448f87778..88443e8672 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 1b4dc73810..ca62e91f09 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 42670d510d..201c01fa70 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 ed7f7270bd..bdace6c35f 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 69adb76d3c..169132515d 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 1c9724b7dd..e8473910ab 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 cbe9568471..be2feb9d20 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 caf1aafcac..e198813dbe 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 63c0494c2f..d403d96ce6 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 d68703eee8..f094109ba8 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 4912f72b90..ef1b91225f 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 75ee7c8ad3..07726bc8cb 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 f61b674aa3..4759a356d9 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 324abf792d..f30f7d041a 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 fdaa649b34..8dda93b16b 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 df6aa5b03d..9ea32a9e5d 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 52d2d40a99..ca4a44c55c 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 b6ae27346f..9ef6fddcb0 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 393d3f4510..2402c41402 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 058bbf341e..be59b2fbaf 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 d7d3752392..dbd7989671 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 6b6311c6b0..6dcfecefc2 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 13537c53d0..854b42f68d 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 a179ca9c06..74ec59195d 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 7f48c7ee22..7dc77d958a 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 dfc1a385c6..0737e50678 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 bb6c5e783f..448e3af1d2 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 4af42fb28d..68f0cf9e46 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 fde6dc6e54..adf3e74c7a 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 0c474584f3..5f677a433c 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 5f604322b1..359cb471ad 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 85dc005a6a..94d786c882 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 abcff158bf..1ae68100c0 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 e3a2400ac8..ed8e10c195 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 be0b64dc0b..e881750767 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 dc26006d71..62216290b8 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 3a61d0636b..45248bf1e7 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 0cdcddb56d..b485cf831b 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 4c83116747..972903e53e 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 c9d6d14c10..d10f964184 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 488997378e..1470832e89 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 dadb28c039..53ae0cbe53 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 a10da6e1cc..520fce157c 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 18f048d1ef..ee72e056b3 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 75b9ec2619..f5d3390d00 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 4ac1f55b2b..5d950ccbe2 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 44beaaa213..d22d526d01 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 22585f7766..5a062996ab 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 5caab7fe89..9b7aa80e2c 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 dfd0547570..8d134792bb 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 2aa7e64587..e3f827f271 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 27698a7b94..e0d2b2bd3b 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 c55b6895e8..966de82f21 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 9d625ebcc7..ffb1a33ed7 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 e0060490cf..97ae62bc3b 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 5d5db4b074..57dfd0d360 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 5607988745..acd0fa8042 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 7e2decb2bf..4f7a8f489b 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 0041895a29..bc0ebd17d4 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 68e7352529..3c106027d8 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 f22c7b252d..ab1a4bf043 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 788d72b707..3da130fd79 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 8407aee07d..053e0ea0ba 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 7e8f44648f..3cd4be6f9d 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 6d64c31303..624d812f5f 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 d9b193e6dc..5f63e7c6a5 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 162091de9a..508483732f 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 a752642335..a289004ffe 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 bbfbd3791b..bbecccf2a9 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 94123ceba8..53f0538881 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 4df780b200..7394c60804 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 d50fd26272..4c716929a8 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 425a44bf04..2889468243 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 e16632718d..247422bee7 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 d340fb00d9..c2a7dc63e0 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 be9cb8dcc9..d324ac862e 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 2d550a0851..3f6efd0a3d 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 cefc645725..53210a17f1 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 a3a647e097..0abe5fb334 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 1c4e8b652f..e1f8f309e6 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 7e06e78156..a26bbdd58a 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 ae7eb4234b..15f5b71d5c 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 7bca10f761..fa382b1b6a 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 291ade0f60..2eadd214bc 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 edeb10dcec..777e8c5181 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 4bd9846f76..6e29d977f6 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 bb0e2b8f24..5e747d9473 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 493351c264..53aed42afa 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 8bf916a802..217803ef19 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 723930666c..9e6bd5b7e5 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 8474849bda..e4be9cc3e2 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 61080b12c2..53dc30d6b3 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 939138bf99..c0de99654a 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 83a6222d35..76e4ff701c 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 672368e0f8..e7bd53560b 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 f6c85a7e9a..a1e47f967c 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 7f5ff6cfd0..be4094cca6 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 8380c3b10f..621821fd21 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 75d747da4e..6aeac70b4f 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 1ac905feac..253174972b 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 cc18e48d3b..0a2a52cb21 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 fde980fa5c..6b447f270c 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 743bad148f..42e6b81dc1 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 0ec70b027b..59096d626e 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 c056c7cbeb..a638314988 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 f4412b6933..a8ed951b1d 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 f6ab4e3a57..bfa692c80f 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 0160d5ec91..2dfafdf045 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 0a9f972c84..52173f001e 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 be21605196..7849b2b334 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 a6ae0e96c4..5c18f0421c 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 f6c0c187c8..6080096384 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 706bca862d..18f2643698 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 dc3f34e9ed..482b691851 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 11820f781d..c51f737cfd 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 d6bc3b1eaa..f25bdca2fe 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 d9ce5253e9..21476d2b7f 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 637ee001ca..aa67be422c 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 7cc210c705..c59cb6a9c7 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 de8b978b9f..20d72b30a6 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 313ac2c262..6eaf933b82 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 b0a313a939..361df9575d 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 99b966c6c5..cb9cfb17ac 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 b0dfc63d92..94953a773c 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 ac7a11eed3..b8be5757df 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 039b125e98..f1a92ec727 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 1cbaa5fa15..6860ff003c 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 17b016fcb8..d1ce5d28c2 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 d5fb1eb251..89b3751685 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 ec50b663c0..c639d19329 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 b9c012d6e7..6ea57cf370 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 34270b6e20..9c3066db21 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 37848e6f30..fdff91630f 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 39b8d40737..78dfa78802 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 a49f2aa019..86b0614897 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 a1d2c4a926..a02661f888 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 68f584c053..bde6c16bdf 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 0d5f3e24f8..db5c68d2a4 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 9b208c452e..bdc38e90c0 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 4cf443f4de..911e7a2fc3 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 1bc9d38e99..e45f8140df 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 4df302ac2d..c03a45a580 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 81d08d76df..909efd5893 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 37620b66e7..cd989b9c69 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 a7d9ee11f6..e15fd8d384 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 c3d87bf836..19d00fbbff 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 914c8f1556..a46d37ccdc 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 106ec6f1f9..b21f7d0e3f 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 dc9176db7b..49956b9f0b 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 7ee6378af0..83cb166296 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 16b27452c7..8bcecca551 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 167f063c0f..6b02dd4dbf 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 dfdda34d39..5d44ccc40c 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 2c911eb04e..d8a8fb457e 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 01afbb12b6..4d8e50d507 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 f0181ba79e..06acb922ee 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 53b7873612..76573e08cb 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 d6fe4a07c5..ca7a720668 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 16c32bdd08..30413d10e4 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 bacfa498fe..aee0b85d05 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 c1ae41e0f2..854bca7f9b 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 ca7043c51a..b2b4148a02 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 b4288afee7..ff6d881009 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 690fc3ed77..9c150d4791 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 b0340eb271..cac7fc98fb 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 4687e07454..6ef52457ea 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 d1933507f4..7b474c2b53 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 8644124fde..4a1a7b8f89 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 4bb0b7ba1b..6dbeae949f 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 142d6ba00e..148d79f45c 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 24170b34ac..f638908a80 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 6bb3eaf9e6..29328cfd1f 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 2264df2db0..71d0992e9f 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 1a28c3076e..f6cc6714a3 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 5195ed06bb..400331f9f5 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 2069913917..378860229e 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 d4026e7689..810a26bc1e 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 47edc4dccc..722b60a952 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 c30985225f..190d3e9837 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 1fdd28e256..395f8e0589 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 4073f1bbb3..e0ca2671b1 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 63d44fc04e..8c7e8e7d77 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 450759a592..39e4f897d5 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 2bba216242..1cdef3d116 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 1bfb4924a7..ae96f7f651 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 ff4f9ec920..58e8e9fdaf 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 5536e8fada..3723bd7885 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 494e70e8bc..128ab93577 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 777105f914..b5fa26c096 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 89bc1e1fda..dde4d63486 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 c7e919c95e..8f94e81650 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 b0da48ab71..d9f114777a 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 d8ca3148ac..4e52eee995 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 6a4599ea94..c8f07a106e 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 b86f4e26b1..21d33405c8 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 ee534354cb..09c916104d 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 e566643a4f..e2dffb1e09 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 45105b21ab..3af46cc806 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 03f2b83cf3..4729fd6b6f 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 12ff420982..17b4b5e9df 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 9d59d5b991..a066333679 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 c601c1297d..011c3f5959 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 ab9349d147..b4a72d8831 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 bb1e8f942a..4cf99155b3 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 80067b2b5b..c5d3a6eba2 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 3390324646..77d38d58ad 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 c48474a292..0fbc304445 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 613af31339..1e61d52604 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 e5153e9675..13e1e9baf3 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 3e3d63965d..527bb7e116 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 c2686346e5..1a9cd620b0 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 ba29f56cfb..5061d35c18 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 35904b3a57..c1c13af792 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 761f77510b..b50601ae83 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 3433b36945..bd2a260fac 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 f0202dbb4f..d07c7c2df7 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 690f2098ca..829df5a1c3 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 5c1be98bb5..1c14609f50 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 0f26680134..eef58106bd 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 bef8a2f08a..12d761786d 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 0d47135be5..3372bb3f97 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 dc93bbe5c9..62791c212f 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 1a59e453c6..c879788f2c 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 dba7020d07..452a5352aa 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 ce7ca9d10a..8f235cf994 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 b46cea0ca4..285152239d 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 16a1bbd51d..2a2bf0ffd3 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 f4fc556961..9afbed0d68 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 4974812825..4fed461907 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 b10c4ad01a..304233438c 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 f0cdd6590d..b007605883 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 d17ed846fd..988c4289b5 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 bd117ac9a6..692267817f 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 7457ef1425..7d8a8a3852 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 81078b1a18..691d26ce00 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 a795958450..c3efd8cdae 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 ff0d0eb27a..50664d862a 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 b08387c7fd..6eb62c3f59 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 060d78fbde..906b8ab266 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 870e3f1504..f3ed232829 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 cd004db4c9..bc215932aa 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 0016bf586c..255124eb13 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 6f1d10a935..d72103f202 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 683b735ec5..3d2ea355e0 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 d8ecb50539..065cfc9f6a 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 02f3d03ae5..a6da3623da 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 fcef464aa8..151211eef7 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 45b2686ada..8722d97e22 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 277617a903..1a08487fa3 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 a101ab6dd9..02535142d1 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 47f74ec4fd..7185a8b63c 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 e51fa20bb6..dad7cfa6a5 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 05f8299919..609e217128 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 96563d5ab3..060a1a0a20 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 7df3238e28..7574076fd4 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 50b771611d..027d1b9376 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 eb8d16d0c0..417ff9db5b 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 009dc28515..07736f61c8 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 20ea0d6acb..9e1bf043f5 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 9ecdb0ad80..ef362300c6 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 e28230662f..9432e80d04 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 aed2894959..52abf20bb2 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 620a90d6c0..0d89adb510 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 c863651699..ea922edd59 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 6f8328b33f..2fd0be87a8 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 2b36c4b66f..18109aa40e 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 262ee118e0..d63387ce9f 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 32e366a5a5..56aafe8c3f 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 a5c801f412..687e0a7330 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 b72efc431c..68fc6118a3 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 a9555beaa7..1d6a2ee85e 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 e4ac9c0897..6d9d0ae4d9 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 5ddb0a1f90..d5d32e28c5 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 ea3b1eef8d..d9d16038d1 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 fd970ce444..2b8bc2fcca 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 a82cfc5026..8eb95f2d08 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 5263d5db8b..98a1f8c4ee 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 3a969e7fa3..ba70cbcddf 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 559ed7c906..91086a4f87 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 e50ea8d25f..3ff3fb3725 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 c861588771..b2064742a9 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 c11d6f49ed..869d465b1b 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 d69c916bda..80b6952c38 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 bd5249a385..94577f5735 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 f697d94c89..7a27d475e6 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 bde5b6e6b9..a394b77b72 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 98376e77d0..93081a7ed4 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 892794c261..614ee18390 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 34fd0681e1..3ca9a0b961 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 64c4b6a67b..8410c6b6ef 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 d7063e12e9..8d70a26ff7 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 005abde47d..a1b9f81981 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 6b204d0e83..af64fda567 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 f1647f5d97..36da85d6fb 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 d55b1ef5c7..f714cee825 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 b49553dabd..456f77a369 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 d98472f823..6820953dc5 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 63c041f28c..3358bbe45e 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 0cb788eeee..268787043c 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 363269bc58..48b246e6fc 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 2861a9dbbb..a6c9554d60 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 b9245bf081..da6318a092 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 d8324e490c..7fd98ebcdd 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 25793bfc0c..0b48528335 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 748bfe0a81..90d69a9a9b 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 d7e9938eec..206f6e0a1d 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 9e982b19cf..1db99b1a0e 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 c4ebb382a4..9f0d55433f 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 07f02e069d..825e559705 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 6f6836a168..79ba6ba9ec 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 ef6bcbf92e..933111ebcc 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 1f845ff889..0b1b72d99a 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 a4f81bcf2b..9d4c9f3571 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 4af0626ace..156b495dcf 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 ca9f705ec4..c6379fac4a 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 12779dc633..5a803f95bb 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 38f629d8b8..04c6598adb 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 ce754fc4c0..a80e279f97 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 16f55b5292..ab26c4b628 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 80bcda0c1d..43b318d158 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 c13aee18ef..2f816345a8 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 28262b1e42..f31d4b9fea 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 8b81fb888f..4edcef1a14 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 e803f2e56d..3c46672776 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 681047a243..85d6c5ea8d 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 b5fc7b3671..d1e4c17ec5 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 58353697d1..74bfe10555 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 87c73b772b..78cccdda3b 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 9f93f4e8f3..42b5e22570 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 016b9e13d6..c7a832f78e 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 327eb1d4ab..3f5ce03e67 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 b2f169a281..038282390c 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 67e510b2ba..4a42f44f48 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 64e21654af..27c504f6b9 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 9fea812d32..ffda0e96c1 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 6dd3101fab..3187b795e8 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 32c6c1822e..e0fafcdce2 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 e93d124dbd..18ee74a78c 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 5f486a44fa..dbc1a6fb8a 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 3bed6ee598..1f242dd791 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 45a659b4ba..16f2445d84 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 eb80539a2a..1e469370b4 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 6fd6c30401..777696f5c7 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 f4773fac86..d7ec128018 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 4e97c32afa..1dd1b1ed85 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 ab37ce2e4e..653b27ce4d 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 cd2fdf27f2..b44a66613b 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 18ab9036c5..088bc84762 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 9d5c78dc34..3980469c9c 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 c546030853..23500d66dd 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 45f5cc934b..2cb0453826 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 c5b9caffa8..48ba49bee2 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 a81034e071..5dbccea27b 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 88b679fb07..cf7343af6a 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 aa0d706976..cc8f6ddab0 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 7fefe89c1d..0e8cfb8760 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 e6e9110b33..e4670680b1 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 391de3cfc5..fb9cf64545 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 9eb4fdeaa4..2dbeb51da5 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 856bf285a1..831f6ef8bf 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 014dde12fc..27523ccb7c 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 ec9fb422d2..7b5ad8df07 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 ccd684e1f3..2edac84c7f 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 5202569d19..7bbdcfa78c 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 29d6cbdf87..813dbf4e57 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 1ae597fecd..8189b167f9 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 108ca8f177..f78dcfd20b 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 74f027fd07..ba4cea8365 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 b73b749cdd..8c29ba1da3 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 f4a92d7e10..90571d239f 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 b3ac6591f7..0aae92c207 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 8bdd897d34..3f7cf97e64 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 5c9a5cde0e..7a8e47adf2 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 31a028db61..218715f81b 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 61fc9e1b73..04b8b2f5a1 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 bd69a1cc0b..af29b0382c 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 2add866355..f0de1aa7c1 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 fb87d06edf..9101884944 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 62aeaf21de..baf2c1b7e3 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 77f8fca984..572fd29b54 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 5fc7e7c137..116bbdcac6 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 9c16b7687a..20120d90b1 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 4e5ab31b1d..29b9bb1ac6 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 7f160a2e9a..ea16ac697f 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 d0947357a5..0e371199a1 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 d4ff56d325..7677cc989b 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 7e784fe988..ea57b2bb13 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 dea16ed5af..866abde367 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 2263397912..fde9715419 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 72f98a1170..c87b376859 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 f5ca1835a6..07eec93bb6 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 db3a896a1c..d4eb655440 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 0811c168f9..6f50b05876 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 35f2c56d3d..ba31bbcb2d 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 c87f4988ad..d35e50a865 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 6de1380899..1e2bb33a24 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 c103b8d392..63bd7405e0 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 d1d2a9db55..a9155c7b62 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 a5d516c15a..21e9c94943 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 3e5518c193..764faf6e79 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 d9497c1c29..c88673b285 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 508cd8f886..8af5f40630 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 89e4b87287..2ff6793151 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 f6230e73a1..de7b8b8f0d 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 228269babe..87eb6bee31 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 7f3e216508..353ca20d5d 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 c3cd7de3a0..814435ea83 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 fdf85d21fa..eb8556d8d9 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 f907cf570b..184e50915a 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 3df5234f96..e676cb0438 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 9338297400..aa7440563d 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 5b9dfad5d3..33fafacaa8 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 afee7d4d77..460b6f50bd 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 b691bbafee..afeeb5d57c 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 2df68f084f..b710cd05c1 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 ff763b951a..2dec0e6ba2 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 beb4a166f1..03742c8fb7 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 f743bfa5f4..9015f2dc84 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 0da755e166..6d953335a3 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 af44874799..d36e3fa503 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 c6025abe0b..10291802fe 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 06ca6931bc..b7ae9237f3 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 3cbed89b18..1977328c33 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 c14f5982da..610e80d9a6 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 fc140420d7..4efefd061d 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 cfddfe9d20..d1394f5526 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 c568541104..1126bbe558 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 43cf6e3448..9f91a3a66c 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 06b8b6bce8..bba814966d 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 06130f605e..5fb38f9b71 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 581d5d6269..0f32505536 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 4db0019920..414d65fc3c 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 859a704cc6..e727c47b1e 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 2a8ec9ab27..f9e3cf8573 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 df4e704200..1eb9464290 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 717eb0d1d6..339b575003 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 2d3aa0437f..4e1d7d9a8f 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 89de2288c5..e9b1d1ecbf 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 d192b71600..8294ba6507 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 9bb9d7b2f1..3e95ff523b 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 62218c5217..515d4eea6b 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 5361947bfd..b32295a10a 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 6afcc74a71..94d123ed17 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 0a76c46ba2..bdc9847c14 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 1c2aa268ca..aa8275ad08 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 ef78870854..7ca81862ca 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 58969bcafe..dddd4a9752 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 77043f3713..a51ff3752a 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 26accb5edb..ddd200dfa0 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 2bb77c2d95..17c4c90626 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 72d9a27077..3246280b63 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 a72ede807e..9aa84942cc 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 0d524094b1..84f5e78fec 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 de85a85842..bbcb2e4bc8 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 98e7c320a6..28e09cc7be 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 8be08a6e0d..4609cf9e2f 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 0a3fbe678a..3eb0d4758a 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 a2629a8fdc..f61555495c 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 203918b981..81e88e99ed 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 13000caa8b..f812454ae5 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 857fc11f15..a1a7659bae 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 00662f31ed..dbb8253ff9 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 c5521b056c..29b9c3a07d 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 0ba1ad6c9e..fd7f2b4064 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 daa5d283b2..c9b11a7569 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 d707ded518..60484aca77 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 87b0e65dcd..1cd5847dd9 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 069cac06f3..242b00175d 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 ed10387bda..8105c01dfc 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 ca783bbc46..780f5f5902 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 99ffd81a04..17479b70de 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 d0cbb4351c..558f4adced 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 2366542167..d1045e3eca 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 4424b53cf0..eafbfbe243 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 8583168010..8cc77da7cf 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 331db0eeae..bb6596c47e 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 19f805f113..fd0945655d 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 6d93d0407c..1be40a72d1 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 0c4a9f2d82..83b5d64489 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 87a81e74bb..dfe71d4b9e 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 2230ea8a47..cfd84eb206 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 03fb171fc6..c7e50c1c91 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 5438ae1a2c..674c720ec6 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 f2d1cfbc23..9ecb5b4b29 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 3aa0f1e3b2..59d20b677e 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 6ccd444db2..7ade98eeb4 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 510d9dbf1a..81802af108 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 33c91b811c..0637c18b64 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 81fa8a9497..ff3ef06d97 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 df54743ce7..bd1dfa6b58 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 e8e347722a..7447382742 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 5d8f855709..1f4b46cc0d 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 43963bb2cd..6f7a80be97 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 1aa0ead9fd..14d25b1dc9 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 b2b2b08f7f..8afafcd68b 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 2ec00271ff..887b48dbaa 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 3aa046f234..524f276441 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 a9b4a3bae8..ca657923aa 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 f0ff20f375..7318b222e4 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 601f017d42..9f14f6c6e6 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 1063d4b439..5c846d41ad 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 c56b947499..41b46ae5cb 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 951ad960e1..2ab2d51994 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 2636e36ab1..5aa4a6ec77 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 9014d9f8dc..eb0b6e1b85 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 73aa818a2a..10bb7f8948 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 4d5f42720e..a93da5f72d 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 c61d296587..2735bab1b0 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 d12fbe2d3d..246eb856bd 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 80c12cc746..cd27a587d7 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 dd3e610063..0c487c4bb2 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 1c1a73ebb3..8775f5f094 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 c0ad8263c6..c4a419bcfd 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 bb19a77f17..1453f9ffe7 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 6bcad44958..ea15e6e47b 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 9bdd1bb53f..222e7a22fd 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 18592124c2..8932de99b5 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 0ca7af3485..93f9b45c62 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 a2f6ec1294..023b22683f 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 98ad640d3f..8a446a032f 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 f16213790c..fad88a19b3 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 f1cd556f5d..c839cb7593 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 fb05d1638c..db98e2f733 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 3c64986c2b..b83d37f0d3 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 cc2cde26aa..f51f715086 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 ca930dc9ca..1c4a7a1392 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 3bef827a01..5a81f1ce37 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 836bc611b8..31e84fccf9 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 2683525e7b..8f752f0350 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 34aebee3e1..6d4567c59d 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 4705ba3029..cf60471410 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 79d197969d..a0edaa8782 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 0649dfded9..b6db35347b 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 2c8a770137..aed0f030c2 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 bd265ef475..5e73fbd442 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 f26da599ce..400cd275dc 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 20e3768705..ed840c7082 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 634f6ad0c6..b04917d450 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 04fabd28bc..d21c46c9e6 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 8576581561..4d155b6ec0 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 f1687d73e0..189ffbbc4b 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 b514011057..cb58d83ff6 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 8f559b758d..30c442b540 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 4c5f63c7de..c69a9c92fd 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 d24a8ed03e..b6d48aded2 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 fd7eea12f7..3ab926a3b1 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 9611eea23c..a4441a7afa 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 0386e0c5bf..e9ddd17e60 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 a3c4d2fcb7..3b5790ad4e 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 38a193e4a9..d730093ed0 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 eae73a2de4..693134dfec 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 a3fa11609e..23798ff5df 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 43ccb6b8ad..e0c7c9f5c4 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 bf048cadc8..c66cd3ecbd 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 62edeafe73..da2b6dc092 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 0099513dea..a4ba931da4 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 dd777790db..5f42be58ff 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 7b0f8e0f28..523d98dfdb 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 46fe96a642..9cb082dc2b 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 de2d70cc3a..f40c34a11a 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 defb18cfa9..0a2cc42b63 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 0dfab28992..1ae8fe58d7 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 67fd57fe17..137a77b129 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 38ca2095cf..2fd9f039d5 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 bb417122f8..6379dd021f 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 372ec51de3..ebc450140f 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 f1c50d5dbe..c4002f252e 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 019fdf9ae5..eefe901d29 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 66f71b5c5d..ea91fee481 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 e9bbd9623c..0a157cd4de 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 1b0361680f..3134a31004 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 1a7cebcf06..46eb2449e3 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 90352bbd10..c7536459a0 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 ce9899f021..32acfcbb93 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 a25dc2f880..88b55bd6b3 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 581a702f51..c46426530a 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 ca4edaf76a..e30c5684d2 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 63a511809d..2309ae6f52 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 c07e1e4f5c..d4ec8ab8a1 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 a56c1c5776..3ce37884cd 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 bcc89e76a6..9d2e3e9e18 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 b57022b963..dc62ae3b03 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 6a7428f7ea..a38a250a87 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 fa536a4c50..d8305d1055 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 9e8f39ced7..b40090ca49 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 720e33b9cd..0ba0fa8c8e 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 eba33e75f7..2bee5379a1 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 c5082b8c05..2cec9dea95 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 e05824a87a..bdef9467d8 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 dc9ec618a7..79189e6b04 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 8600619194..0e8ce3dc96 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 ad060f1675..38829d80f0 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 3d36e7f579..899215ffe7 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 689703302a..b3ad57f372 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 a891d807f5..b4e8088448 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 3efa1c33e8..f1db6a8af3 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 b6d8005431..70c4f1b458 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 917722a61b..3cf528adec 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 6a30f6a00c..72514c80f9 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 d69362901e..c1968cff44 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 c545adda28..fdd5961d33 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 4d2b3733a0..b358fa76fb 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 03ff593bb4..2ce19afc6c 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 8e3ec66356..9e0a0be890 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 8678586817..ad45abbe3c 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 e6b0fe5c34..44e519f57d 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 74dc562203..d5567b0d34 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 a56fe7ab15..9cadec377a 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 f3ed9c6e62..e2c24bf6d7 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 dc3a285765..141928d2d9 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 1e56cf84e4..b55f3f11c3 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 af8c64ac06..2e21f62a59 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 c58139993b..8b65ac77e5 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 974eb68476..334687a804 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 e64d062b32..31eb0491eb 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 8aeb5bbb18..c704164c17 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 a01bee29b3..1dfdc36a0c 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 1cc3a76c3b..db89dfc219 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 540febe7f2..d73e768694 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 f3c10e98dc..59b8cba744 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 02fe4dad39..8f8b80c2c6 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 b626da456a..f24f9b9473 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 6c0e9c3b01..296c1b73ba 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 a724a3d448..3c96ef2efd 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 03b69f070d..c259f827d5 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 ae32083da3..26a5c0095e 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 a82ffc41e2..583f0dff6e 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 a015e7a509..ee035fb59c 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 b92d7bd204..3e86eae6b8 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 25c4f7d1d1..6477983d94 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 10580321c2..598ea05ace 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 99e6bc4801..63fb359371 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 c3c76101ce..1ba5f418fc 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 c61b418684..8fa108f24f 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 a6972e8881..337458b4c3 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 6fa2b10544..fd0184f1b2 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 9d6e7f7b62..306e65e047 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 b5297db96c..bbd32e9eef 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 77e212a083..a2683346b6 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 a7bdd241b5..d0cba02978 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 82ac665031..cb0ecc63d6 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 a8aafee91a..68ac1aeb65 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 8df384dd0b..bf0de54aa8 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 22478ee0fc..c2e5f0bc33 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 d45aea5138..99015e54a4 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 73e59c2edd..dc12512920 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 52d6fb724f..d1c01cb66b 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 c25221f5ba..a3529dcd0b 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 90b6f2ebc7..fface9b495 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 f0fb80923b..c406a339a5 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 eaf1e66cff..82f4027d35 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 742e6a07c4..a4ab0e7271 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 b1efa4ce63..6d34ff477c 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 88d7bfe510..b293e5c2e1 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 2ef1e8fa69..ae7601ebc8 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 caf18c8da3..f9f023e8e3 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 37cdf77172..6f0113d1b9 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 b076b254b9..2bbca5ae50 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 1035b86d6c..30dc08d1dc 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 ac9f6f8b2c..a891a00f41 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 c541a4903c..a29dccc2a7 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 bfc888b99d..e11e791148 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 47c8c46fee..d92759e5ee 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 586fe75c69..1173d2de69 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 d3964b747a..07a74b6636 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 c75054232b..4109855d46 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 77cfbd6205..f717af2ad8 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 de8228f09a..5753dbbf68 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 ce4679a23e..f0aa605f16 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 f01d6740b5..12f1eb7d0a 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 68d487ce5c..dafe90193f 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 1b22e62d5e..ee0c573b3c 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 bfdb1adda7..7d78491ad1 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 338943a3e6..c821fb4985 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 fea16a087c..b05a3ff58f 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 820ee348b3..d328d42b01 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 9de98dcffb..e114efdce9 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 55700521cd..6f661ba574 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 fda4710914..5514936942 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 189a4e12c4..4a5a3dd15c 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 afba0e3830..d4f0705199 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 4879ecddc1..e88cd1fb04 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 8dfe3441ed..4ad03db22b 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 024dc2b7bd..2a5e39c797 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 1bba843631..b6c7f4658e 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 d0b36598ce..1e86e6a021 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 a11d3ac98a..e69b1d4087 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 d121996cb4..ffd2291e15 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 9e6403e6ea..e22dfeb916 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 c82859893b..4515f7f4ed 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 ac07a2f77a..cca5b05854 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 939c1095c2..6cf871ee8a 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 48ff76a2b3..e7bca5ac45 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 2f6cec846f..4b64d38521 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 b3f032e95e..553c1e5082 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 9acac2fa4b..e3f5c6d3cf 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 6aa33f743c..1974833222 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 bb76b3193f..e35c266b69 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 8a3b3bc854..d5f62562f8 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 d9f14172ff..eac7f761c5 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 5f6584ce25..54dd37a63d 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 78c0c6cf57..230b7986fb 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 14b41ed82d..5350ae95f2 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 4675ef0ffa..bd60e1331f 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 95415e70fa..cbfb7d8583 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 8b55ad7da7..62c9fcf508 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 249fb4db1f..a2602527b3 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 6b3368382c..d59d13102e 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 7948b96d7e..9052a22808 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 1458b717fc..8e5cc6cb3d 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 3224df25c3..a34dcdca87 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 117dd3cc24..d0861baafb 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 34baf54c9f..452bad9be8 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 3dba3733f7..c5f05fb6da 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 2026816c09..76b3ae629e 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 e249fb3f89..cd6cb33302 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 9444e33700..940c751c3c 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 626a8fea89..2d66c46399 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 35d549c526..946b519614 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 639624c352..2fc29fc9be 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 514f976df3..844ed65c5c 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 446bc2c62d..0603ffe875 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 d48e55d5e2..af7fb50b6c 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 7ddb8d6928..365bb9b822 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 a992471537..b7200a3599 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 01aa245f60..e0f07d8d7c 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 3de376a831..206cf39f14 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 a031b8b2ec..ebbc825578 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 43acbadb45..ab11e1e0b0 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 904b48fbdd..6236021f3c 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 14ad035936..f5ff1b2dd1 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 377ca24cd3..faf3bc2cc0 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 47ad465eb3..2ca4bc129e 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 4d42d2e5bc..e3d30345dc 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 c835dd425f..88cbc8ad57 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 4a1b26d4e7..aabcf34468 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 5e4dbba3fe..4e30ac470d 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 b71bb32477..ff3ce025f0 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 7c29edd51c..b44cdd274b 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 a6f7ddb2bd..a497bab138 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 7a08220074..97e3955792 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 9d339d64dd..59e655c94f 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 fe3aee9a4c..ca3ae2b0df 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 7ecc2ac6de..d67e29af69 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 e723e16d41..d9de9b9d55 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 4f585d964a..90f208ba91 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 3e0073c177..13c2936497 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 75614336c3..bd409b5977 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 8d79234375..ed3158040d 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 1563ee0ce2..7ac8e89fb6 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 4825441707..b4eb145f31 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 a03c927c2a..6fc0dfdd11 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 cedb485fab..4dba1a5687 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 3b4a4211f3..5d1b8cedd7 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 2436ce6298..22b4911d8c 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 f9fbfeabb0..6a79e542be 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 fdc974878e..f6e4aa0452 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 aef8626742..ff9d194a27 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 dd361de5f9..0e28675ce8 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 a97c9d637e..7fed881160 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 bc629eafaa..c16ad0e485 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 f9e9d8d289..596e37c354 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 5fe6cb7011..c93d25dcf4 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 526be2a33f..c66f87ae26 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 6d37030d1d..947d0089f4 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 7b9adbda1f..32221d46a7 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 05a38f5789..6ccd2382db 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 d12c40e4de..f735b4007e 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 c1d708a20f..78d5613e16 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 b34c4f8819..907013ac36 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 4e6290a8c6..c77e8408c8 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 ff31698fef..17c0a2c7db 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 2751f8343b..76e2742b99 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 017d43f7ab..0ad4574ecb 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 6e383ec146..4330604f9b 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 9320b9a9e7..d3059a4949 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 d501edbd63..0e5bb990ba 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 21b84d87cb..f6fade69ac 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 9008fbc485..4f13e8fba9 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 56aa445bc0..b4c3d9509d 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 479470f5a3..a8a722ff93 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 73e6c2fe6a..386b14a3a6 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 b429aad3a7..85f3be4602 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 0502d8efd3..414a5eb7d3 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 343b8b8a8c..19406ac4b7 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 b994e50a7a..ce51fcac0c 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 4bf8e3faf6..f00f49c158 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 f5fd27b506..9fb6cb8b59 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 861a05da4c..999b77dfb5 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 4c5b2c19dd..407406228a 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 fade5e1a51..e604b225fc 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 4d88cdef0f..1db0132128 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 13843c88ec..3c901ca753 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 26d2362a19..8f35f813d9 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 480da6df35..e997953f7a 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 a937e5e5d5..b465125508 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 d7aa9dbfae..e2f2ed9878 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 8734f87096..4c3a35c15d 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 6ba0886d2d..da9d920a26 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 99f074fa75..2769b5fc17 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 c539603081..ad3022d5d5 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 6c1a44e8cb..4c21e8e6f2 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 0dc6f213bc..5200408d1d 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 10b274b8dd..f21248c963 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 9d9c76f67e..f9317d0bcd 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 5cf4adf580..08dfb98d5f 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 ff131767b3..c2c03145f6 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 1890088f29..fc76517086 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 c9443bc1ad..9df1c3f7b9 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 09dcf71d02..c7a898e74a 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 13a65ad164..f2caf26925 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 d6c0d76f3c..6940aaef7d 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 84a384e516..ccc5e260ea 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 d45399c3f3..019049a3b7 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 2f6fe831eb..b3a87510e5 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 72d61b278d..5fda2eac7c 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 243490499c..289cb61917 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 37d705c29c..c82fa67056 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 fe6526a16e..eb4ec52c0f 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 fcddf58daa..be7e0f3e97 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 eb267e793b..8dcc8ded10 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 0ef813dffe..987a15f8a2 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 14d12967a3..77aa6093df 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 41c29adf91..07742d4f0e 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 d968b43af8..05b4ba9342 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 f933b9c992..87524cd7dd 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 93ab919cc0..4e2aa0414d 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 d0b94ed6c5..ba29b19df8 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 d8b6330b87..bb8b291f86 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 b187abc5cc..c0c638851a 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 0386fd8c46..bc229d190a 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 0000000000..df104c5405 --- /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 0000000000..f2be7cf7ca --- /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 0000000000..50f31707a6 --- /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 fdf08c0a5f..21567b8f09 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 ac83609ff0..2b5b168817 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 cfd05320e3..64069d4e75 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 a7f807e8dc..8ffa33a6a3 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 416d5c49ae..7e9ec8ddd9 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 b6713bb09b..31c7e6c0bc 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 13bb40dd25..527c2f11a2 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 ca920abd49..e91bfca407 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 0000000000..0578daa4c0 --- /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 0000000000..672bcc9056 --- /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 0000000000..440c576596 --- /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 0000000000..6fb71a57ab --- /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 79dfa120db..b37f7fda4a 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 b72ef3d078..14139a2040 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 a580b639d9..00b5c35e05 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 e471bfae54..bb41e5335d 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 44bb25b3fd..126c6eb313 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 196968cc09..f2a4908e11 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 0000000000..adc6f4e029 --- /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 d839ccc674..bd5d45c024 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 387ce6cac0..1aef7878df 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 646a6ded32..242c0fe550 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 395a5f0db5..e95267e780 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 6bf162725e..1c52c55702 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 5a2744eac5..0682929b7b 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 7d3d0692e2..2ec11a1e93 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 da1193b1a0..ecf8ca6e1e 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 b4b01c66d8..f6bd064345 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 521a7b67a4..6de14a024d 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 d287ba6014..053c5ebaca 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 c49ae6a12d..0009677cf1 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 5b315c87e9..d140953b94 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 d54e6dd968..d76af1dc70 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 4945614ed7..8d432740a4 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 f936279922..d428e2deea 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 cbac7186ed..284f78aa2d 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 7a35896b49..6c156f0dba 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 86ed017ae8..4aa033ee07 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 6f7910f912..f0a47b3e64 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 04b8b2f5a1..4747059345 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 284f78aa2d..4eb1520cbb 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 6c156f0dba..e5bff579f9 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 b795207722..e2d1fdd984 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 91a23e17f1..18eb2a6c1c 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 da151f67db..055b5627bb 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 ad3d1ff18a..716ed5040a 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 940c751c3c..da4dc07426 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 4eb1520cbb..5ef68692f0 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 e5bff579f9..e9d2b17756 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 1ccbe7a58a..7dd19e755f 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 396ca093ee..5637cabbfd 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 d5aab8b35b..caac12c1b2 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 73305d5c62..f03c74ae78 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 8a1e0f9c74..96e363951c 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 f762a722f2..bbbaa3d340 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 3149ae5606..626e30849d 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 ca766810a3..5bfd1e45b8 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 a6d4e0c7bc..5e7fab5bd5 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 8da81a44a6..80d0fa3f97 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 6abddd2123..142bf32bab 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 5d939d4b34..ef345de22c 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 734f67906c..5bfc2e0509 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 d3c6ee819b..b0ba58158e 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 47a7f5a203..812bb183e1 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 26cf0fed5e..3638cbafb9 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 57c4fbe619..4e3f2e9af5 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 b570e31c12..6d7dc012e8 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 f1b76075ae..a9a4bf22b8 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 cdaa30dc04..169f3c7719 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 d9155ece2d..54f1c1cd36 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 05f49cd9f5..2b92887eac 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 8a4b4bc2b7..27ab35dbb3 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 45ff06f16d..818010c341 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 5cd15fefd9..8c7b103f83 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 b2e1fa74fb..f8b9ba55aa 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 2bc821c849..69de797074 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 c7ef1e9378..c5224f8f95 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 f90ab5f793..99227d81b6 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 594d897ee4..0622b8c3d4 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 125062c8cf..bb51444447 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 9d9c9dfb8e..8d43b2d69c 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 9b8a5637de..3f00c8c310 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 afa5013b33..235390d001 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 eaed84fe24..b792fcccec 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 dd7d9bf858..5e99b42b11 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 42c5f0b456..9b130f91b7 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 53384397cf..a4ef91dee8 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 225caee0a9..064c78917e 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 e9c45c6281..d608199f6f 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 64ba0d8384..13d8cf75e7 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 df7b235a22..b2e90ad559 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 4a1b830a32..8e300c7746 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 008b46d96f..df4ff9735c 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 82873861fb..402f651417 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 018f074a6d..71bb67f075 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 971b817499..cc42bdc54b 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 92c14d0e0c..03dc49d747 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 409ad0c998..40802af2bf 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 371ba00dfd..287ce29a3c 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 264de1d678..fd36e23cb0 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 321b668f8a..385d8a4f95 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 84edaf67c2..260b417074 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 ba923f0fdd..e26cce46ee 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 315b5c39fe..4515ec7441 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 000019abb5..53b16944cb 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 776281e151..f0df663eba 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 7d266b7d3f..24b63b6271 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 e5a6975ddb..03ea74a234 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 1e04619234..20fa646ce4 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 79065f7ba5..7ca3068f00 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 d4624e82bb..61423312b2 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 3638cbafb9..b003fef56c 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 8bc4fb11cd..6cfe6121cc 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 ffbe5239cc..c2ce599f5c 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 9cba055bac..3a9d1d5275 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 cc85f17146..2b249c7b7c 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 eae1cd32c0..1e0fe841ca 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 6e49d28718..658cc3a23e 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 9955a650cd..2061c061dd 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 b56ecbbaa8..965b5950c9 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 9ecd2ffd15..9f4c1dc5fd 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 e733bbd8ab..b7d5f1dbe4 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 c7a898e74a..9a53a29fe5 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 5ef68692f0..8bdf437820 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 e9d2b17756..121dd891ac 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 302a8d5617..d9d4a4f2ea 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 bf34bc3dde..104ad61e93 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 9421eb16f5..2e5cb9b560 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 1f3fda6cc7..05e7a49b62 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 ef345de22c..618a168be6 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 373fcae8d0..cd2783e6cb 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 b922c966ff..78b30557fc 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 19d6fbd308..ba5a3267a2 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 54f165889a..6991c83959 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 3e363e060c..0f8a82fa89 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 7c079c432d..c19e7d4b30 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 55e121e2fc..a3667f4c4f 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 08550ed80b..e4e00c7c2e 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 d1982e289a..df1f5062fc 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 7510ff22f1..675fe3ae5e 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 abec8eff09..6a57f0f24d 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 1f382b86c0..1613e8ea55 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 374866a685..82f1cfaec9 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 402f651417..9874cadb56 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 b834a8e682..66e57d156e 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 6edbecf055..a314aba0ec 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 0c5886e177..6ec94aa8e5 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 2c04896497..8853680af3 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 62bf99ab38..8a7f2af3a9 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 111155b27b..39a752855a 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 d76af1dc70..33ca626555 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 b8407653d1..f9a218d2f5 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 ce4f347eaf..c8b4b53785 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 1d081b711a..e85422d740 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 945bd3865c..905baff895 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 0beeb4da4e..d876748e8d 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 d57d3ad992..57da696007 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 cb98ec90b5..e17869f6cf 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 f4799828c6..e5e1f9061e 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 a2dcd62db8..e9a65f7bed 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 7540740a73..6fc68b2833 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 919a20d0e4..e6da946c81 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 1f2d3cb5cd..9470c8bb2c 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 e5185ff03b..8df6f7cead 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 5909804ebd..2b5da2a97f 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 dfa43c3595..c6dd7b963f 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 893fadfe17..a2912ef0db 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 b4b1f612fa..0c247c9612 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 bb0348eb6a..3c4337c1db 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 1af8a5e4ab..57c32da97e 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 9bd02aec7c..d976e6e940 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 5a5f1b1985..35db067177 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 01f7416519..1f99d5410e 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 f71f41dc29..5cd13aa3b0 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 61b03a3160..76b8c663c9 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 6373471fe7..5b21a2a62f 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 683681b50a..50156b2b4b 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 21e3608a51..b32b91e562 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 2b4d9d010a..3399fcb43c 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 32735bf06c..757e299792 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 48c96b7591..fd9b42398f 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 084888c188..8efad848e8 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 ba4d1e7757..3727a156b9 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 bb51444447..1b08c40793 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 c9f8d857b6..37fef6f2d7 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 2bc5f5040d..ab04589623 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 10cbcf6b5c..1bc4ae298c 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 33b0efa5d6..3565fb303d 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 cfbd112100..0a653ea0e9 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 83d495e1bf..5a6f0798c5 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 a32e07f4aa..28701f2b01 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 7e1b7eae72..377115f7ae 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 89205d4ee8..f53af0ee1f 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 8b7d4ba91a..f57b2d9b0c 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 53edf48ae8..6a03d899a0 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 b4cd7bd161..5e9a9835bf 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 490ebbe75b..56a3cc0655 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 0506486184..3a911fbcf9 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 9b519f969e..aef1dd7819 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 2817871cd7..bb591b7988 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 cb4ac83090..7f589401e3 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 1d5d39416a..5b26d9b1c6 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 4a3ff75b86..93c510e2fa 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 b003fef56c..f4eb5342c4 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 9e95f3cc05..054fad3246 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 dffd66265a..2a1085a53e 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 ceeb8b4cbc..53bac129db 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 5637cabbfd..7296179a12 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 0622b8c3d4..124449d446 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 2b9a959deb..764f87e924 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 7051ec046d..e31b32e941 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 6d7dc012e8..cff197b7e9 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 19a0cc7c6a..be6a76e3b6 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 714b5dfec3..769286a567 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 eafa42ba22..a1a7fc8808 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 0ee336de67..c10fb3b826 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 88b8c91420..1acd58d8e4 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 fe0393720d..4079145850 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 8696dde72c..ea238269e5 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 104ad61e93..00dabd59d8 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 5af8d1eb65..45a8f879c0 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 48852f2791..1b3093447e 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 2e5cb9b560..c474bbe8c6 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 e723853f62..333baab1ab 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 023bdc74a7..90150f448e 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 5bfc2e0509..5a4dd701d3 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 b486e907ee..54c385c1f2 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 3a911fbcf9..5cb9c481c3 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 50ee1b248b..02d56c890f 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 2732f2d6bd..62e78f6f88 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 cd6875cdcd..431785f7c6 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 adc05893fd..b0500806b8 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 16a7d2f000..7e9f6e60ed 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 83a7dbbaba..832758e26f 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 07b6a8d48f..d80f977544 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 3c106027d8..5248cf3822 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 988c4289b5..1e31b1b7aa 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 e1b021c8ce..f5f21dcfe4 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 a1b9f81981..a0d5d0fca2 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 562b988ee3..33fc1266d8 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 1dd1b1ed85..62c862e33c 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 9655b91b13..29e104b13e 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 2ab2d51994..9a302fbcad 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 ebc450140f..6da29c9479 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 c46426530a..273a517d11 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 a38a250a87..12c808b6d7 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 81f5d2085c..9974b885d9 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 f9ec68c874..f78d88ab3e 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 b380656c54..19cfb7cd31 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 595e36ef07..3b7afbe25e 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 b9461fae7d..cfd1cf2a19 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 b8d23b3e37..95ed220a16 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 6b234a9df7..1c37d0215a 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 6e47cb4596..224ce83c21 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 72c905497c..c060c5f881 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 dccc4ac076..5f53de899e 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 1bdea073aa..2983c6b7d5 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 892895b9e0..e77f17c914 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 a3f2c50003..b69fa65198 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 4b08d0b975..612e1b6ead 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 c26c3f5e68..3e35559bb6 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 ec70c9d432..d31d83d3e9 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 b39ab88484..43ef01a497 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 e0025a050c..2e6246d06d 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 f100d663d8..11ad02975e 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 8c83de202a..1f5b5b4b1b 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 90e62c0d95..5778df8c36 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 bddee72496..22059706dc 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 5109607d79..c8caf28ddf 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 53ce1c0634..fd44a80cf3 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 62e78f6f88..5d457f2df7 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 5e7fab5bd5..6dd5edb81b 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 b792fcccec..7e045934f7 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 224ce83c21..5a7e673ca0 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 96ae885ca7..3f6d69325f 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 f3321416b1..ec5afde0ba 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 41f41a6e93..da8b1ed359 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 d31d83d3e9..52199b2b9c 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 169f3c7719..0ac86c4eb4 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 c09f9f0933..b1c9100135 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 50fb3fd7dc..e3e12e4a9f 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 882c3c9d79..66b21dbcac 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 06cfb90d2b..d3cfb8b9db 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 8877107b98..c9870b4cd3 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 b7df82961c..9a64b56b57 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 52e02cfaf7..aae4165fe5 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 300927abef..86e62adc61 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 cd9d6e8feb..9f210add0a 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 0425accd06..19510337d6 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 327cbf5e9a..ccefb681d6 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 b6cd67c262..5403a483ff 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 846b7eeb99..7e9da01eb9 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 77af10928d..7eb410caca 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 8c2b950648..59abe2fd6d 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 adff293301..7a9cd1d9e4 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 da8b1ed359..90d943dd75 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 66e57d156e..6e90227117 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 8a083dbe2c..d612957711 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 3f74ff1869..759268140f 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 172951ed1e..6ef1a6f955 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 b6e829750e..dc2b60dec1 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 53bac129db..54d3b2efde 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 de1e48c9c1..22aefa5be4 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 9e4446f296..8c4d68208b 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 7ab7d5b3a4..5aa0299200 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 716ed5040a..e0d9cfa0a3 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 c5224f8f95..23d90796c8 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 0a653ea0e9..0fdb8eafb0 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 91a54f87f9..6ea37f26d1 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 0dc71ea72b..e05917c17d 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 2f0966ae73..2542037a2b 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 864b7da5e5..19c25a2fd4 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 a4062905ea..71aaee1c40 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 e510cc976a..4fd1a061cf 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 95ed220a16..457d924d2f 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 5a7e673ca0..2f206dca73 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 3f193993c2..9eec508bbd 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 e12ab9b4a4..1a655e242f 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 5f53de899e..33e7c014e4 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 73bf925553..c04a1af316 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 199ba968dd..11e07ed5e7 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 967bce6007..8456ae9338 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 b9278fab27..8396537a2a 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 3c2df69331..404823abe9 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 2f69b98bcb..ab49e46938 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 63be7df2ea..5e1932ceb6 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 fce05c8dc8..e5eca399b9 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 b3885588b0..6b903665c1 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 4cb75c65bc..f879b66268 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 d2580f3bfe..5c02eca4fb 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 649be55e94..8a3a5c84c0 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 998e3cdea5..c4a2a2fc09 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 ead9e08d00..9f3b45d40e 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 f0a47b3e64..dc93f9a635 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 9f4c1dc5fd..84d1d34bd7 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 04f90476c5..a3bc548ee2 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 6d452f7a6a..7a9daa26c2 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 d4e3c993cd..1bdad193f5 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 1cd76581bd..fc359d49b2 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 8bdc4ba0a0..cd93711586 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 497fb0c252..acdb5b23b1 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 ccd41eeb3a..d944ebb6eb 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 eff06e3bf7..2163a809b5 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 fdaec26204..71b2af33fd 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 79f9d36116..2bd39bf7cb 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 1a21ad4a7a..8ecc341d4d 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 aaec1ee67c..70a75e68c6 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 18a00005dd..166325ee24 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 64b438a29f..b2687b2bd5 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 39cbb8d583..95a6d65a9f 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 2bb9faad8e..958bcc9d97 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 009a3d469c..63ef2e9f5f 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 cc07d6cf40..2045aeb1a5 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 27ce29ecd1..78259cd114 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 e8a9e62403..b3155e563f 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 291bed809c..f28ee6f02d 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 56a659aa15..3bd75c40be 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 f61f000472..d122fef0bd 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 8a56ba3d97..6b826d8c29 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 638a37b193..b46e57a38b 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 8211ff1085..fd09d378b4 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 dbaa5e6e11..e4a4d4ca23 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 50c3c6bfb5..f046b5087f 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 bb65dcf631..82b0d9b455 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 67fe19da45..6626be41a6 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 9e34eb8f4a..07ab1d19f5 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 97512dfc9b..d30a05ddbf 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 5a2dabcf6c..a13a3d25a6 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 76f1a224c1..280ae56ea3 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 ea00227515..889f6437b0 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 5789dde64c..a5af24eb86 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 3617690eb3..408bfd325c 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 ab5aa7ea1a..d10df2492d 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 cb5e4dc8f3..7ed67dcc0d 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 3e2cdf0d53..803ca00696 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 384e0ba130..3f38c07cb4 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 d1054cf8dc..58a752c188 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 1e8441290b..c007191303 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 71e694f680..1b2f76d6c5 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 babdd0cf1c..11a3d469a5 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 ae9fb65c61..bdd1199008 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 028c1643ff..453202b6c6 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 54c0c8f7bd..70539871aa 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 3ca52f849b..7050376dbf 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 ab5d562ffc..a52deebbca 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 196d0e9999..4c4d499a6d 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 249b833bdc..6c5f2b1d37 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 54f1c1cd36..7e85e7616a 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 5e6bb09082..deeb808396 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 d9d4a4f2ea..e3fdeaf35f 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 3f00c8c310..a615c5e403 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 9f69396638..7ed38206a1 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 6684a5b882..7be5c4bfb9 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 26ba590888..0d6814fca1 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 9f210add0a..11c31107ef 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 5de0b62a4a..e75775bf75 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 966ec407ce..2b7d2296a0 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 71aaee1c40..2f422007ff 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 26ee7cb8bd..8fede95425 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 fd44a80cf3..e4966a1a4c 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 53bca79965..88146dbeb0 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 fa5d58fb38..fc96f672af 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 1b3093447e..922a0197cf 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 3bb7da52e2..76f8d0dfaa 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 e6da946c81..e7e489dba7 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 50117c210a..8338cbf7f1 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 5b9b923cc5..e86de00b59 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 f43f1c8839..a9cdc67693 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 812bb183e1..ce8207fc28 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 0ec4d05a62..2b8bd65dfe 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 a029fcfe7d..34dc7b06ad 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 064c78917e..082b5b19b5 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 750772ce8f..dcd8f26416 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 5c9634390c..61d4b45eb3 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 488481f961..ba6f734120 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 3709adaa69..2992d066d4 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 fcdee98a74..fff92c3218 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 bca45c773b..1c034d6d68 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 0000000000..dddf7dc2c8 --- /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 0000000000..0ac8302389 --- /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 0000000000..c155a7f611 --- /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 0000000000..8e8b050ba7 --- /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 471ce2181f..53c248fe17 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 3425cb82d0..fa2f2e5574 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 5708c8e638..39893c5d2f 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 75a879832a..f3b7f4d6d2 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 0000000000..7bc48ec2e3 --- /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 3a6e147e86..7eefb77b3d 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 b73c6b9c2f..6cd09a947e 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 0000000000..27ead21ddc --- /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 0000000000..91f61c9c2b --- /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 0000000000..cecde6b918 --- /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 0000000000..de374358e8 --- /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 a0d4046037..87e3a94beb 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 280ae56ea3..7ecad01830 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 e8878b7cf4..9cc75ff39a 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 6ac68d222e..c122caf376 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 aa6d3efc82..ababe8395f 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 e58fd74065..5996ca467f 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 2612019f6f..b0f1a44a3d 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 f27635d120..5da6b21a3f 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 deeb808396..a28c8571f3 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 8f732b8e3d..77ca4ed8bd 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 1223f3525c..824085ea83 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 b46e57a38b..4cb7c851bd 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 034fa23a3a..e3d09977c1 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 b95d940bda..2ca7fdf46e 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 dd60f03cd5..696d642cf8 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 395c0a3ac2..b96feb2183 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 19f3344fb8..b453cad2e0 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 1618518a0e..6aba40d6df 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 2039919536..e3f2644ac5 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 eec7874c7f..c88d31d2f9 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 339189d356..2676893629 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 29bd6a7fb1..b2552f58c6 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 fc7de1f59c..1c465c6a86 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 db8bad3ba0..0702e64b4f 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 760c5f3043..19113eddf8 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 ec13fc7953..e6e145fefb 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 1ca2eca664..87d4dc2b88 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 567bac65f5..c2b89406f2 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 447665a367..81d77b27a3 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 5cbf0d411a..0ece14799a 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 0000000000..57ed4d1d8a --- /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 0000000000..19bb17ea39 --- /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 0000000000..6e72058b60 --- /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 8bdf437820..4832276075 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 121dd891ac..5db1635e39 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 0000000000..9de62e5f72 --- /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 0000000000..24a0f0610a --- /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 f2a4908e11..80e7c92640 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 1aef7878df..cd1ea8725b 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 242c0fe550..3b70f30189 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 1720c2c58c..e38af1a04e 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 888ad87a84..3ee2e61cc7 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 bb0fc55b5c..1fa70e42b3 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 3657d4ee3a..e2a226eb4c 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 e5eca399b9..0943d1a4e5 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 a2d015c279..cd8e797876 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 e82f6c9e4e..b39f8a6ef2 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 8e0b883b72..799fe6acc7 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 e63054d23b..cb2812f319 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 d46ea26d48..8b5724e014 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 e3e2e6a0f2..1bda31fc6b 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 e22c0b0499..b7131c29bd 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 76bd16a636..a395a5da47 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 89529046f8..dcbffe2a56 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 722dc2dc65..7c966a6fa4 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 d9a39ce572..2ce710ea41 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 ddcc795d26..3d014d13c5 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 5d618c1fdb..272efa5d72 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 8a3a5c84c0..fa9dfe7615 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 47a302e2f2..0b24541688 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 7d91ca012b..464ff98994 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 917dedd5c5..30b26ea5d2 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 8526f6658c..2275c5eba4 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 7dc05368dc..af5ada7d2c 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 ce8207fc28..1f2b716255 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 9874cadb56..aa6e58d603 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 aea8ecadaf..00d1b6084a 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 b1e93aec8c..0e3aa5d446 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 bb591b7988..d2e4826ba2 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 6ec94aa8e5..36963dc2f2 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 01004a3b45..18650d2038 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 943f8a6aae..83c335f0f0 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 e26cce46ee..99cda9cb41 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 548282d6b2..999747c9a2 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 8f12341ee4..35a374688b 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 bf12951e2a..04c00171b4 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 574b8d8576..0c5450b5dd 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 d23cc9ec5d..9bfe903e72 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 8d0214d1b5..3ee716ec85 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 ef1cd52f75..09541a120f 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 230f89b053..6e31cd595b 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 c4921e3855..3087c4cdf0 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 11411e1d6e..472c430da1 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 20c5fba7f9..05a3c16621 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 87571baa2c..0a5643fc1e 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 e16f9983d0..8797e8e61e 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 2d08b48e0a..d2b5f09102 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 7cf52919ef..e6ef780ec8 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 9ce9991c37..fac9cf4ffc 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 a5e88bb3d2..157c357e18 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 3cd2de600e..f66a1b5f22 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 e322cfb77c..38d893e734 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 c0b7ea0455..5d4ca93105 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 3a9d1d5275..ac7bc149cd 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 33c778c0d3..19d5ae1e90 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 fbc6b50e8d..863602134a 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 9ed1bbfca1..044d32890d 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 a5255e7f75..8478c2b9c4 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 2b6c06ba12..826c99fbd3 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 f2afadbd65..05406b6939 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 1df7cf117e..c867fdc621 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 3c00e186eb..bd90b907d3 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 25f6c05d73..9721bee901 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 af0248c971..25f3ebf968 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 db7488e9a7..083e0f5584 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 822ae8dd91..914c113311 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 8653366283..4226aad3f0 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 2d098d60bf..0ba7ff09f3 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 c3cd88b0d6..8a9dc2691f 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 5e2e8bf4a0..4544780b4f 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 d8a5949be4..8b37107b90 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 9a48efe8a9..86994a5544 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 4e8d21f438..71e419e410 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 4e3f2e9af5..9beef00a92 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 b732e3569e..b551e43635 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 0ac86c4eb4..068dbd47fa 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 4a115762be..0d419ae66c 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 1a46a34c1a..abadb61316 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 183c6c171d..cae957740e 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 1b08c40793..38c9beb28e 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 952e82c01b..3485a108d5 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 93666bc6ee..7ce0cc6561 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 4211438379..20337d8363 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 0000000000..c2f877a2b7 --- /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 8fb014f80a..225c88b7b0 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 1455c20749..964e2427fb 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 5818cdc004..f694afc029 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 773bee4430..a35fec8fb7 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 ce54220aff..867dc8e89c 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 fc042b0d59..37595837c1 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 6c85c77e96..0ca12c9e2a 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 b48c48a896..01b31eee63 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 a1b980d8e0..032edba8db 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 a8a96b21c1..aed23eed95 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 d16b2788c7..6e16e00432 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 1b59217f6a..73f7bc7587 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 0f64533f7f..eee9896da1 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 9f489165c2..b531764c29 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 1fbd9089ed..1fb88a36d2 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 fe6cb1ac12..f0afb49dbe 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 05c9c4fb18..15afa82ed0 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 3d15a9583f..0fcc077c7d 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 048e886dc4..702b834767 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 98b0cef69c..cec4f187ca 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 a063b1577f..20794b4c47 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 26a7193493..ff11762235 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 1b9ae225c7..f20f0494a5 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 63aee66806..256b26c00c 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 8274240368..0fe0518323 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 6513d76ca8..f09baea765 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 750528eddf..20447e496f 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 6b5003a04b..d5f8d26e2b 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 0a78c45d7b..ad41539162 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 4c5c998d0a..26b2d088ae 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 9cd1b913cc..76526b73e9 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 9c8d323711..3d232569e9 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 c333d7c74c..a3f645f508 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 80c636577f..89fe884fa9 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 ebf2032a9a..0ea0cb7a69 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 08c463feed..fb1736d778 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 03c441a39e..f8b0c53bda 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 c5588c3413..17abffee89 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 e9e59b5017..5223bf9c89 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 74a5ff0f18..a93429550c 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 b40edabd77..2c5b2bd318 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 27f8ba383d..eb35c48b9f 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 725b215da5..23a9498746 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 ba537544a3..d98659caa8 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 5f4f2defe3..6c7f5ced48 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 be9a7ba522..ea353e8489 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 e3cc8624e3..9bb31b1723 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 cc6866fee6..0f305d1fa8 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 288161968d..e66bd2a1d1 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 74a2c3a4d4..448b35a3a0 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 a1500e1360..bcc9b2f7ff 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 20dbfa77f7..3ca109fcb3 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 6d01dfd8e4..e52af4f266 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 cca39062ce..f06b94b9ea 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 db813affe7..299d457350 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 c3b25e0634..a8652335bf 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 fa2a04c958..63ab2be975 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 b299aaa818..cd810c21de 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 42522f8187..d33229f4e5 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 ea92e0ca2d..65757b7036 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 ea31b951a1..490c746fa7 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 2174c974e1..dec19740ae 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 1dfb3a6f1d..70aa94b6ea 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 500f1fd3f2..ac050fd008 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 4306ce4e71..a5308b08d6 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 c92522008b..f96d3ea58e 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 e6346d2f38..a6fb85b641 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 d908941fb9..b4a5db5898 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 b0deb01b3d..9061a4598d 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 289cb61917..ce22b66eb3 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 0000000000..7f5b06b71e --- /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 a52deebbca..803d3d6f1d 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 20337d8363..23827ae870 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 225c88b7b0..eedeefad07 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 3aa30965c9..cea9a22b64 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 9061a4598d..f6575ac840 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 0fdb8eafb0..2bec560f29 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 5a6f0798c5..1f14beafd7 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 c82fa67056..0a17b5aab9 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 28701f2b01..71e94997b0 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 377115f7ae..48a5873133 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 b8c3b3f019..57b381fa41 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 756b20456f..9533c30017 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 e07e9cb474..ec15438352 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 366617ee98..1fcc3dde40 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 c9870b4cd3..58fada7a19 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 9a64b56b57..40317ef172 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 d428e2deea..31cc98f7e4 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 b4f15a2999..3f3711b2e4 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 e35f265328..8e63bffe56 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 7a9cd1d9e4..391fcecf37 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 8e300c7746..c2cd62237d 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 6e90227117..899a06dc27 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 7e5f643675..0182f6bc07 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 587cd85a2a..2e73bf9b11 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 d612957711..98bcb4d0aa 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 52199b2b9c..9de33c6715 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 942ab8a14a..2ec77e3507 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 61f12fd5f5..183e700885 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 11330c7c9a..dae6acf91b 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 7e9f6e60ed..373df9e638 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 f3b6e2eebd..433f9dd7ff 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 e0d9cfa0a3..56e8d3ddcb 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 ce22b66eb3..40fb1ad8b4 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 6ea37f26d1..cd72f55a85 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 23827ae870..a39b265991 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 0000000000..cf62937816 --- /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 eedeefad07..2e9ec2b4e3 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 bf7e768f6e..5c1385c6ec 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 d33ba2b397..fb17a8ea47 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 81751e768f..1e7b664b67 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 157156c325..5ad30d25d8 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 b31cb718b3..fa5c573a7f 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 4e14a8c2a3..928c8d2a2e 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 06ab3ab148..48c5cb824a 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 1193f90ff8..bcf5a92771 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 1cdd1f02e7..9953020054 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 78386077af..f38836c041 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 820f965c53..10865586b6 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 96d70ef499..9de4f928b3 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 01e26a5630..af1e052fa3 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 b0006dbb5a..85413da8f8 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 f1085b8155..c2c383468f 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 1695d33cd6..da8c491845 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 57f5ed659b..d386bb7a48 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 e01af8d183..f2b32f4530 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 d541e21049..a783dff241 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 2281cb1cc4..f1b39976af 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 d8a0575bce..8e2958f737 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 6196322e23..14f9497698 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 4d4982a19a..e47613e17c 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 cbb1dd201a..f06b2bfd90 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 815df57f34..9996408127 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 449ae6841f..960424df0c 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 64534e4097..604955aa19 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 4badc8b72d..6c48024efc 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 2889468243..5ff4a303b0 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 bd5c2eb6a0..d8bf3e4d99 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 52cd90e54a..c4ceffd537 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 889adc3af0..c9831a68aa 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 51865034b0..63435d0ac9 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 253174972b..2e7c9efc7c 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 e0aef80ab6..6c1c75ff32 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 e4fb72db91..6bfda8c31d 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 8c353a0b3c..e0ba27390d 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 5c18f0421c..39f72f57b0 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 ee62df8dda..ed1827dd9c 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 2155d3cf7d..88137bd953 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 9e7e9fed39..a6eaa488c6 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 6eaf933b82..3e469e4460 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 49a3c67d60..05354bccc6 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 d1ce5d28c2..5a88792208 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 fbcbf7edc6..beb4427d14 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 a5246a004c..36272a3de8 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 376252966a..987e490791 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 2a5f91791d..e9229ad838 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 6e9724c95f..a463cd3551 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 3b662441e1..00d1ab1828 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 ebc859ed9e..04f7a3ac2a 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 6b02dd4dbf..651fd77619 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 c6b686efb8..caa2e7df2c 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 64e68dd5bc..33ba82482f 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 867a497d02..9f402a7d1e 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 d9f114777a..3059a0fa71 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 dc1fb40be4..489164ce7b 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 3af46cc806..630ed0a4a0 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 d7522ac299..50cd8d7d01 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 e67af592c1..7951df50e5 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 1bd7275dae..3ec324f9cd 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 d5641ef5db..add0ad31cb 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 bedd85e750..ee4df700f7 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 8c155784eb..7bd67a7a2c 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 f3ed232829..154fd211aa 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 256b26c00c..aa85ffb021 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 9a00ac6a4b..28b404acdb 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 8037071718..40295c74e0 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 044bcfa46a..5d52f13f39 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 5fd068a64d..f3df434159 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 c5f2b4a2a0..a23c2a9184 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 0f70c49ff2..9f23f05689 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 ce239df756..3013b04943 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 6cea7dc117..abf47e5744 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 693c654f25..80bf72e529 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 91086a4f87..6403d800a1 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 1f1fa347dc..69e455344b 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 e391c15d3a..5ab5e7a9b8 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 2cce496d0b..f4aa44f3de 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 e9b709b0c0..0f74cd8940 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 ea8b9edcc8..184b7e3894 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 01dde6a249..11287217fa 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 3a74e2165d..48f61ece4c 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 dc4c0bb965..6d53e4f12a 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 b8c615f333..9430c02c0e 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 b2a538a0fa..4e7bd5729f 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 fea02bb025..d1456f1e68 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 2ba15087c4..96d24139c2 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 cb7ab8c767..5d7ddc8b55 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 ba4cea8365..5152e838fb 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 19ef1cb14c..99fdb30b5c 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 0c52e62441..cadfd03e9d 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 8bb02f28bd..91950f6236 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 386f7083f9..4b273286d8 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 c87b376859..41223f97a8 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 590563993d..0d6fc42d1a 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 3a2408694a..39dc17e66d 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 8c11209570..ba3113db5e 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 420270e10a..a271d70476 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 32332c7369..7842f858fd 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 460b6f50bd..940c59c997 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 69cdb48a56..9e6a0cb270 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 5a70e3fd48..1e6700267f 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 4efefd061d..ff92fd9355 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 8cd4f51aee..5ba3fff7fe 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 5fb38f9b71..80f66c51f9 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 d3fabfb0b4..8bdb3ea90b 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 414d65fc3c..73ec2a138b 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 ef60dfb4a6..096f4f5b8b 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 23b1c968c4..e80c7c8567 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 7ca81862ca..d479f570d6 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 4bfbb8ef62..3effdbc60d 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 1300b48e0d..9e3be794cb 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 ddd200dfa0..226250b9a5 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 e37a019af7..8e5f5ee2fc 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 fd7f2b4064..95b0431a32 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 19bb17ea39..7f56e2b8c5 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 29ad2ecdbe..227c6d423b 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 1c246432fb..7bc25726f2 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 8cc77da7cf..129ca0108a 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 cc6141fdd9..9faa8908ef 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 ee99da0c8b..2fde2782f4 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 43dc47bec1..83466327da 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 246eb856bd..a704e5ffa6 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 b7d1e8df96..e1af6543a6 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 f51f715086..615fa1f755 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 9b293ee5df..b8c141f52a 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 391320289d..1f05a1c7a5 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 cdac7171a2..ed1ec8b62d 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 b6db35347b..bae9cbe4cc 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 1d712a8f28..fc9d170726 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 9269326ece..3a44d04f75 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 c66cd3ecbd..942ebd0842 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 eefe901d29..cad9b6d366 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 ea91fee481..efcb906420 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 2e36062669..71de076478 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 736b0ec71c..1347f760b5 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 d4ec8ab8a1..d0bed82673 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 d2e5e39c7d..f981ef7fd3 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 2bee5379a1..1eb60e9154 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 1d667e43fa..04457e2abe 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 9e56dd7eaa..537bed16a7 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 b4e8088448..3efe31d5a8 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 3578bcd513..99173c830a 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 dbf1172b7d..2db9e0f94e 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 3e5dadbf5c..1517f12f52 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 3265e3bb1b..650ae3edd4 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 67f1f6b7d4..74a72fdd97 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 8cf1a66427..e08ae2098f 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 480eeeeba9..37effe7d6a 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 fd848b76b2..79fd1d4166 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 0c81c369e7..b176894925 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 bf83f652c3..673fc6f54b 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 352ffb6fee..74dda2ddf4 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 5408a20499..3969175244 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 f0aa605f16..741612b6b4 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 ee0c573b3c..d9a63037a8 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 e3d303a2c5..8e42b25c0c 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 bb62889085..53a32812f6 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 b6c7f4658e..d977e24bfe 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 3c8017a7d7..61cf5a2fcb 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 e35c266b69..fb4270f641 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 3382e27693..186b15a18a 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 20d6ba3d72..a12fce67ff 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 45c16be36e..a239de65b6 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 823eef632f..7d1bf95572 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 811ecdbfa6..3ef76a5d20 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 e0f07d8d7c..54b474e95c 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 61116adfb6..881e97bc9c 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 6c5b2fb2bb..628c0ea5a0 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 7db70c5cd5..3287eafe7f 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 90f208ba91..22a5da19d8 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 405f0c5d57..885b859754 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 2d808e85be..4e656d3556 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 b6f6f53cf7..1ddcadb439 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 e20dd64396..915dd2bce9 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 7a26e5bc0d..8aee796b9c 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 c2415265c6..c47d666f5c 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 a3b097c5d3..1b824e4384 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 0c5b89dc2c..9d8c87e586 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 52106a4206..5e7f2419f1 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 3e38d6982f..971321fbfd 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 0ac55e4679..ddb03a135b 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 40fb1ad8b4..b6f357d4cd 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 a31fb13ebf..1d40bfc33a 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 cea9a22b64..242a90088b 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 6dd5edb81b..728ee3c598 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 a615c5e403..9e0d8939da 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 cd2783e6cb..280bd98796 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 6a03d899a0..e930a0de59 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 a8a45f5b94..1c7c8bb4a9 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 88b42d296e..0be5171af4 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 7be53d1fb6..271d58fcc8 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 8d1527b193..86b3532e00 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 a13dfef11d..973c3d3915 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 b8ede42a50..e7e6725e45 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 9b130f91b7..c49ee45271 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 a4ef91dee8..0fcf9c01c8 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 93f0fae918..7752efe82e 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 90651cb5a4..6ec111720f 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 54c385c1f2..f92f646615 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 9e33ed74fd..f5b29f49b1 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 54d3b2efde..2d20183cb3 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 14f6308470..2a84524902 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 1bc806d9e3..79242394f7 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 7e58beb441..61e4dab851 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 22aefa5be4..6d843c222d 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 2b249c7b7c..45466be2cc 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 533238ac5e..450a6e4c86 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 61462bcdbc..c4ea831cee 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 63229b851d..c66f9b745f 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 658cc3a23e..4273b5294e 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 a5eb90df21..664ce0a38b 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 4681857853..c1a0ab62cc 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 56e8d3ddcb..287ad0dd52 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 0ba7ff09f3..dd12924f4b 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 9beef00a92..279cd5b8eb 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 382d2c4dbf..0bbcf9815c 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 068dbd47fa..297680279d 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 0d419ae66c..20763dd39a 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 b8e5415592..36a9bccf39 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 f8b9ba55aa..913262d35c 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 23d90796c8..25b25f41a2 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 71d3ab2cc4..8635de00fe 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 b6f357d4cd..5c7385822f 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 2bec560f29..76d62bda60 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 758279cabf..eeaf6f0126 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 08cde60f5b..1e05ef63ef 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 48a5873133..89e0eb7fba 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 e171cb3d66..5a8837b815 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 80a72f1d6f..4783457112 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 5db1635e39..b064ca1b41 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 0000000000..4e7cfffa83 --- /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 0000000000..c2ce8e947d --- /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 0000000000..951134133e --- /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 a39b265991..62f634ebc5 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 2e9ec2b4e3..d04f8525fb 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 5c7385822f..fdd0c564ef 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 4e2393bd23..a95f77ab36 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 d04f8525fb..200cbe7488 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 38c9beb28e..a8118d2391 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 57b381fa41..98905e045c 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 9533c30017..a6ab2fa7cf 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 5cd13aa3b0..3895dafe1f 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 5b21a2a62f..c9948aa2ff 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 516fa42cb5..0a410401b5 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 d62dede5ab..43bae9dc3b 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 b07bca948b..812bbc9194 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 76b8c663c9..c890e8a8b1 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 c586347551..935aa01a9a 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 5b5b161a24..9ea7a8b7a4 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 b32b91e562..71a439fe6f 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 9d034c146e..f9ef2e1273 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 a04dfdc7e7..8caa824d5f 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 b2043d3a4c..d5c85a5a84 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 1f99d5410e..967b5855a5 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 de4e1f1720..e07f97c928 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 e39696cc37..85bbe5c950 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 dc93f9a635..6fa1f01756 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 6d19022f95..71f7ea17f7 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 6fa1f01756..65ace96917 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 0000000000..2230cc2ea3 --- /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 ff90bb2653..ca47f83137 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 082cb899ec..4f12f59005 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 95987404e4..d6e10e1dc7 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 9bd3b16d12..8879bd6965 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 de6aaf0f11..7367f4ae56 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 e10cdc2014..392008e838 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 df96b0e87a..135f6322e2 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 87696191ac..f3ea5e3037 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 bcade409d3..d696e8933b 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 fd8bfdca44..f61172c3b9 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 286b28b61f..ae717bc183 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 3399fcb43c..9227b87208 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 8396537a2a..2e50285960 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 0000000000..64f508167e --- /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 404823abe9..b4c3054268 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 8879bd6965..a5c9f5ab0a 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 2e73bf9b11..3508e24eb4 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 b8c141f52a..c289d75400 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 e31b32e941..a5960b8b28 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 c41d5afe16..ca9a6422f1 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 0ece14799a..3983ae7364 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 0000000000..fea5ee3f46 --- /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 0000000000..e2ada59ec1 --- /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 0000000000..fd23931f13 --- /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 0000000000..7323413636 --- /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 0000000000..a6d171f652 --- /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 0000000000..aeefbc4989 --- /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 0000000000..b9ccf8d101 --- /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 137a3975b9..0000000000 --- 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 1173d2de69..0000000000 --- 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 84921b3b8d..0000000000 --- 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 e00cd1b593..4d4509d744 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 4832276075..b755c16d90 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 b064ca1b41..0e3be2edc4 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 0000000000..c4710e59df --- /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 0000000000..7829a3cc99 --- /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 0000000000..664ffda7f8 --- /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 0000000000..043236c503 --- /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 1c4094387a..6207a36393 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 43494ec485..c5aa74706a 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 0000000000..171aedc801 --- /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 d460c53109..5e91736a26 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 ba6f734120..d26da82ad1 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 264e635d7f..53ca9a3901 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 39893c5d2f..a5b8b104b3 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 7d7e158f3c..5192a8c7df 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 9341bdbe4d..1443e41ddb 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 26361b0e36..e45c287f44 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 33d2268be5..01a21920cf 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 fea5ee3f46..327745343b 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 27ead21ddc..d15d12ce6c 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 650d5133db..7cbbe5fdf1 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 ddca969898..e4605392ab 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 7367f4ae56..d984eef5fd 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 eb7429aa47..188a4ec99e 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 9bcca3cc45..8d51d5a718 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 3ee2e61cc7..ecfa2edbe5 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 13f7c8db74..7899af3699 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 1fcc3dde40..7248b73afc 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 bf77d27cbf..690cd8f318 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 79d807b77c..b6bab17496 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 aee61ccf2e..1a24c883c0 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 a6ab2fa7cf..e974b6d481 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 8898f988f9..48764d1ca0 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 49a5f53361..20e76bf86b 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 f3f2397d21..66a22d4436 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 6868d21ce1..22c56c1003 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 1f487dd345..cd75e88bb4 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 d608199f6f..b06ba76876 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 df4ff9735c..ee8e5f0b8e 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 03dc49d747..e1054f296d 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 40802af2bf..e5fdc8d6b4 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 287ce29a3c..4d48b0cd04 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 fd36e23cb0..b93f607f85 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 65807602f0..4e5a02588b 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 b7881d2dda..c549e57a06 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 65ace96917..6471024213 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 6cfab66c3f..e4262a7c54 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 09f735c72a..ad39eecdcc 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 f8c10516f2..254449cc12 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 200cbe7488..38b7a3c321 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 297680279d..b9fdcb085e 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 905baff895..d4f76d9bb3 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 cd93711586..0cb7e9293e 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 e51c018746..b923be8188 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 43bb165b1a..0eda8eb71a 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 48409d6cc3..47b5c92fd4 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 70a75e68c6..5c2a71ad88 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 7ecad01830..c47940e98c 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 5d66edea9c..d9935cc006 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 37609e151b..6703852528 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 696d642cf8..88be372393 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 f21fbf5d51..c5b0c2bb56 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 304f7e0949..cc226dc1d8 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 2045aeb1a5..2a6c08a668 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 45413a10cd..0eb86f0198 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 38b725226e..891f99ac67 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 3778f2af04..55aac836bc 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 861b2fa30e..d9686719a8 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 48af17188e..7cff7bd2af 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 24823e9046..a02a4fbe3a 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 2a2342a90d..d9b4f4859b 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 ec457af757..6b75cc92fc 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 4f61291c4a..6a5c382a2d 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 182c629d79..279ed1fbd0 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 3586c992c0..5275ca7950 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 28161cfa18..4d11717932 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 0182d830e4..7a5d606bcc 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 afa428805e..4e8e59aad7 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 ff269d2b8c..1d08246284 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 cc4098a613..0f575a7fc5 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 c2b89406f2..8a08c06054 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 f226c72f7a..d0d9148f2d 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 a28c8571f3..8b4a2ae9f8 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 69ed44cb7d..412aa2c694 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 49d168e279..d00e0317e9 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 2ec3467e0d..8e0862eb0c 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 6471024213..f4720db25e 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 a73111793a..ff36f4f5c3 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 00d1b6084a..fd61dfce26 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 80e7c92640..a7b66c3a3b 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 50156b2b4b..6f560aa9ed 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 871caadd95..1f5cbc6bb9 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 14fb601f91..4ce8f67665 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 d4de97f3b4..96c36a87ed 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 a3bc548ee2..d9c1a5a40c 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 87e3a94beb..f94091a674 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 2d1b7a85ff..efdab74304 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 47b5c92fd4..5d0fee65ae 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 279bd35d12..67e3cd6409 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 2bd39bf7cb..e64e7d178c 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 97efd48be4..b8474e978c 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 725cfc7354..8976f85f3d 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 04fd345577..ece283f4ba 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 0c12d8eb54..93e7deb37e 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 0e3aa5d446..65c2fab361 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 9eff7c9933..64e78a24f4 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 5a4dd701d3..ff99cf59c0 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 ec4ff1676b..b51ee619a1 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 cfdecd3383..3a4add5729 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 d9686719a8..637cefcf74 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 c890e8a8b1..e87a625522 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 935aa01a9a..9178e99e0f 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 9ea7a8b7a4..7ce4de69f4 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 c9948aa2ff..ba10c5c741 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 9227b87208..3fc065264c 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 2e50285960..3ba39a3876 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 62f634ebc5..1c153ca825 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 38b7a3c321..84740a32c6 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 c6dd7b963f..23b8bbea46 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 3059a0fa71..3c6e8478c0 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 fdb7f8f18d..f0415aead6 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 b755c16d90..f85d2826c0 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 0e3be2edc4..a89c444460 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 84740a32c6..dac3a361a7 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 04c00171b4..53a844ccb9 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 417ff9db5b..b0c49a58a6 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 f85d2826c0..a9e808e93a 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 a89c444460..07197414bf 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 803d3d6f1d..c6b847c313 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 fd6950a88a..e73190bb58 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 a9e808e93a..554e2138ee 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 07197414bf..45d155cc6b 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 3cf528adec..cd0cda6812 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 554e2138ee..65a7af01b2 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 45d155cc6b..0cbb2005dc 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 65c2fab361..21e8e1a8a5 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 0000000000..52a416ed8a --- /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 0000000000..5085cdbce9 --- /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 0000000000..925443a844 --- /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 0000000000..60fcd9866c --- /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 0000000000..c76fa9ee97 --- /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 dac3a361a7..0b5c8678f1 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 f04f815886..c3c5f5609c 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 ca9a6422f1..acf72eb254 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 3983ae7364..26b8e8b158 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 0000000000..516cfc3257 --- /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 0000000000..89f293d1e0 --- /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 0000000000..749c5d095a --- /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 0000000000..5a889cfc31 --- /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 65a7af01b2..13f994e575 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 d3cfb8b9db..7c774ad8f8 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 869d9f7ac6..4bbcf185f2 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 51dfb7c579..9989b9d530 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 182dfeef2d..e5fbcf4d42 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 59abe2fd6d..be3bc4c52c 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 d7d6f12187..e4ec6a004f 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 043236c503..d2fff820cd 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 80f66c51f9..e69ea352c8 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 13f994e575..68e6552613 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 0cbb2005dc..3a4a8cd717 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 fd9b42398f..2fa8291538 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 8b37107b90..d32554e574 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 86994a5544..54f6044c3d 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 648b3bd5a2..0c709a6d1a 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 71e419e410..e29d2c045d 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 964e2427fb..7a9eea730d 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 26b8e8b158..e8fadc9ed4 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 e881750767..f054c7c8e4 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 c5063dc14a..3707062747 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 2f1cc75e4a..b0176d1c00 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 be4094cca6..81a89c8e39 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 68e6552613..0a01f7d693 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 e95267e780..fe0808414a 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 268787043c..9e491a5489 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 afd82d1f45..a80a7f2e0b 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 0a01f7d693..af84a37231 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 3a4a8cd717..5bdb3034f9 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 0682929b7b..7e16a9fc6e 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 de7057ae9c..aabc71ca9d 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 539d9ad165..d2aa939043 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 6dc194c09d..dd734bb0dc 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 313710d03b..f6e375acf0 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 0f575a7fc5..04d0ec64b8 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 8a08c06054..26043c3709 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 34704ddfb7..72f26ae33a 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 d0d9148f2d..1d96b3d062 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 17494b6b11..86eb3919f0 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 f90a726975..daa9c6e840 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 e0e1ded32c..e23ba5cb9f 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 d5f8eb4a2c..c2c9d4803f 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 93df75db8b..2f21a1c0f3 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 1d11bba9e1..86865209de 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 ae80316676..05ea832a81 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 eabaa57d3a..3644ca462c 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 297bf917db..692231d4ca 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 f4720db25e..ee256acbbc 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 a70e7ea4b5..26d0d2165e 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 5be9a29282..7b1c9cb45a 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 f046b5087f..a5e8cb1d94 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 012ca6e670..164b4090e5 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 135f6322e2..5946adc90a 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 ee256acbbc..72da24d38d 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 b51ee619a1..796453ec9e 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 b4793a49dc..c1de08d5be 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 0d1b892611..3e95e5a1af 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 637cefcf74..de8444446d 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 b8c2bc277f..e499c93c3a 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 f0415aead6..c3cca9662f 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 af84a37231..4f4784f061 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 5bdb3034f9..a47bdbd0f8 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 7e07f7931f..14d6b362dc 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 b6ca69f4cc..59d993477d 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 d30a05ddbf..85bf078186 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 f8d6bf1d8d..c1d591c03e 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 1bb6c3825e..bd44dcb171 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 21e8e1a8a5..f4d5d24049 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 a7b66c3a3b..4134ad4e32 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 327745343b..77bd125003 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 e2ada59ec1..874afb1858 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 fd23931f13..f34e01d55b 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 7323413636..dc58302fa3 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 a6d171f652..e2f730ddc8 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 aeefbc4989..6e5a486ab8 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 b9ccf8d101..77bd125003 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 c9832ea2d8..4aa8eabe9d 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 664ffda7f8..27ae28aa50 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 1e598b3589..f93d839b78 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 80d0fa3f97..d8c28409b2 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 84d1d34bd7..85e05e89cc 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 b28d67562d..bc97a844a5 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 5e1932ceb6..7451d15eb1 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 be6a76e3b6..36306f1811 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 86e62adc61..a0f1d38ba7 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 b685bdb5c7..78c8f82d1f 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 235390d001..ddaeec9422 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 32e8babde9..bd54f42fc2 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 7c6dc5fed7..0bcec2a6e4 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 0d6814fca1..1517f47a2d 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 bd2728d03d..a6bdb9c527 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 78852fa269..d397738425 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 457d924d2f..a7fe8d8a0f 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 806c0b4128..8b6115970b 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 1c37d0215a..da6e7acab4 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 06a5796089..ecb0241c72 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 fb03135969..68e13abf8d 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 5a43c3c728..a1f324be1f 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 ec5afde0ba..93afb43cf5 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 b460020546..471a2dd0f4 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 98905e045c..ebb8ae3883 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 679968d1b8..6970ebbedb 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 ba0f42432c..3879d15cda 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 50a3e74f78..e0d9a60860 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 4f7ba5c8b0..d9f4db6257 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 8df6f7cead..75cc3126c2 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 dd67cc2878..492c347959 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 8af1be20b1..a3a747d012 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 01d4d8fddd..952a399157 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 cba7a736df..acbd6fe7e5 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 fb544d3ebc..e6fd3d7bb5 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 ffd3772005..56f5b53326 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 76b225bd93..542c63f3b7 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 18650d2038..348fff0da9 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 52899c7da8..f19941ed04 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 0fb08a0fec..226d278633 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 ceb660d9e1..673935d828 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 612561707b..b078dab898 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 dbb650a8b4..fd7eddbb48 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 0926f35af3..b6576fc689 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 279cd5b8eb..f8149782db 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 25b25f41a2..627f5b9d97 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 62e5ed891f..3954808aa3 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 b6b0a87c9f..fb02e4f322 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 3c6e8478c0..efd9f99b18 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 c3cca9662f..2e14525a10 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 4f4784f061..64d4727312 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 a47bdbd0f8..0adf422516 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 36306f1811..cc6011d9b6 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 40317ef172..434692ce6f 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 967b5855a5..1f024bf588 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 e07f97c928..000e738052 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 3cd43ee36a..59b2a7aa9f 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 ce2ecb89d8..74a70f0b11 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 c00510b563..d949175bc6 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 3895dafe1f..d538359086 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 9178e99e0f..8da656d217 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 7ce4de69f4..ea6f36ac7f 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 3bd0a85c6f..d84b79f1d4 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 1bb34a1169..b118422ef8 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 d3a5139162..298ac106de 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 40d75d557b..3cc0ec607a 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 5e5597f50d..7440db0495 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 10f8d67010..9942ce687f 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 1ecba9f4c8..ca51126730 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 6963d83668..e2f07276c6 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 4208750b7f..2d0857de13 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 78b30557fc..724cb756f6 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 f56c92d657..e4d2cf00e7 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 5e99b42b11..098c6d2d59 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 b8fa2ad93f..8f7a0909f3 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 082b5b19b5..f7e727e0e2 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 1ee450df87..786d495cc9 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 e15d595d65..d95d3e4ed3 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 d41e80f17a..0a8c177b08 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 23b8bbea46..bdf4658434 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 12d0fb08ad..9efaac7956 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 b06ba76876..a1c54d9629 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 a611c8d426..f6e809d528 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 dba7e656af..9e8f1dff6c 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 83b247c39c..9c488564ea 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 0c6a3bffa1..d623f1d879 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 13d8cf75e7..41a631937d 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 b2e90ad559..c7c96b0587 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 c2cd62237d..f35d063de5 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 26a69fa11a..0bb9d7a7c5 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 0729943a77..c0c71405ab 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 ee8e5f0b8e..e6a302975a 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 aa6e58d603..821c9624c5 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 d80f977544..ee423a33b5 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 651a17ac80..62249e0fb1 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 710b16d1b4..c001f41798 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 c47940e98c..e9925132b0 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 9cc75ff39a..467bd1ede9 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 c5b0c2bb56..1b6150fbc3 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 958bcc9d97..bdfd41eae8 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 304487ca50..e08bd5c27a 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 48f5559799..c2297af6d3 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 1244d8d9a2..2f897045c9 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 9567391e27..1ac6bca91c 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 280ad9a0ef..5250fb0fa7 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 826a73bece..d3b6f9274e 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 a4904f5bc9..f60b1c3584 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 300e2ac4b4..b007fff7ca 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 f61172c3b9..6d2b73d787 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 7f5b06b71e..3580880fed 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 5f74a837cf..a2f681f8e9 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 76788d0c3e..5d65aee761 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 f1eec4da94..94f9c846d6 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 bc93ef54a4..ed699c8ede 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 79ed4a4f4d..b4e78a883a 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 28f607165a..9dd8e3c4f2 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 5a81f1ce37..d6365afd21 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 64d4727312..7f62e9e304 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 c91190d985..e09d9c0d62 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 4c5a7a6bd5..00ef4c7180 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 52bf903d5a..b33e9b18da 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 ef2b2d64a4..727b67e324 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 cae6854d23..ef485ec610 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 7492449386..41f7e29b40 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 6fd18eb747..b364a45c34 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 f2fdbbd975..b11493e337 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 30898c61ab..ae3990c31c 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 c52e77881c..0453d397bc 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 b64a16635a..75b9bcfc1c 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 8c2f5c615f..75c77d9481 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 a9c6865ad9..2e9c97c823 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 79dfcd7307..492e147135 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 5274a4383b..85918d7c71 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 5094d3f4d1..7846d8173c 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 f8ca4e5b6d..d779799791 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 5b81b4625a..7c7d10f47d 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 5bc0a52f39..66934d7a98 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 66cd796d75..070eeee8b5 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 fc603318ab..02f2590042 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 982ed8e13e..30d501f1af 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 a1054c7909..752593ce29 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 9f32bbf5d9..6ee4377db9 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 7d309fdb22..762c99ec4d 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 bb01114a5e..4e1511b2d2 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 8dcc8ded10..a7f20253ef 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 82533db387..2a2a1fcd07 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 ebcbc12e40..99c74c3e5c 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 61d4b45eb3..e8682a0188 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 97ed91592d..6511c7b6da 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 5c347e3b25..e40926d4a0 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 2099038f00..df9fe8866a 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 280a90354b..0991c74b0a 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 6428508687..5028a84eb3 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 451a2e70e6..9213007e93 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 8b8e71d531..c3e2a40ab1 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 268a6ba001..4cca42afbf 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 d575db2ba7..ae8b829d56 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 00f4e3d02f..34490332c1 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 222b512c39..6febc6ec20 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 6bfaaac8f0..e5c27bd393 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 3379411678..2aa3868895 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 891051bae0..1c6f9224c5 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 a070128eef..bc8f90057e 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 2b915aafce..b69081286e 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 5da886f05c..45d98e64db 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 61f5cea5e2..533d46ca8b 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 92746b29f3..61d8bf3ae1 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 07f3907eea..e1f01d1567 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 d5cf039b9f..4f9389e7e4 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 c429d43950..2f68fe4332 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 866c06316f..dc6f2d51ee 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 6de1579f6f..fdc7b87aa6 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 58f5c0e4ad..b391af0e60 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 355dbad83d..21f33d120f 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 a92c948a2a..f238b00e84 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 1f00800422..b56cb0c5b7 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 885e8f6891..3f7db674fd 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 07cfbd4650..608e12d020 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 4f05087cad..b6347e2174 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 9e2eecf574..3f303140c6 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 3f1aa97f26..648bd3cfd7 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 589932cd68..24ee0e2412 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 b512690e2a..10fc8c02d6 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 010472d2cc..1ad7a446cf 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 9f7bb55147..dd1a63039e 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 ceb6325af6..453c8fa364 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 b0da189d20..d9e3a40d30 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 44a701ed11..9d66831b91 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 59761c7202..76ceaf7cbd 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 ac552afe58..41ecfdb80b 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 373866ecd8..3006b8cadb 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 8bbd19a0d4..3a3485a3be 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 19229c16cb..ffa68b094b 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 e246198864..55a079ca42 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 93b6189398..213d947236 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 e727e18775..18b5e06081 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 9720fb974f..02fbc46525 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 65abfbcd0b..f5b2e2bfd9 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 7ec9b5268e..d53e869e07 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 74d295f305..db897b68da 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 7fa745a9a9..733d3a8de8 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 c65ae94396..7120b1bb28 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 508a06b38a..04d40ecf9b 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 4194102948..b82dd8b053 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 bc474e3d51..ef174e7233 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 aa16576d2c..caea4c6c97 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 4c9cfb99a1..fe1323c674 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 2004caeb34..234146e2e6 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 5df2ce17c9..ec5d57daa7 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 aeb24e5056..9ad8e67e6b 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 712c0fbd7c..7b48833dd7 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 a4a36cb04d..cf89911071 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 4786e258ff..dce3519f09 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 26ee436860..cf5f42338c 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 edf116203c..119d172690 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 1c1b9a882e..5aca41f7f7 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 e350faffcb..4e0b1ffca5 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 628f2b22e2..7cc44d7038 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 245b899fad..18398a2b04 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 e7a2801423..e88afa7cae 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 060bf6e26b..962f9ebe42 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 77aa6093df..55ac013f96 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 0544c8c02c..7c9fbe6756 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 e5faab7499..a798ead27b 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 a4806ff13a..510b75658a 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 06534314e0..0c0e272e23 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 04a4170450..39c78acc4c 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 284b0b960b..605eb0b818 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 bdccf51b2c..2655bb40f0 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 833e2370dd..f08e3e277e 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 07742d4f0e..4cbbf34887 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 fb75fc81f5..3bcbb59230 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 e690d597dc..ee386bece5 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 954d1c8eb6..544ab0ff2e 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 d1af7e1f4b..91dd0ea9a5 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 c3ad3cd24c..1b2daecbc4 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 756636ad90..2c9562359f 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 448b654c86..ea65ffbab3 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 047be1c793..517170fe22 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 2213dcf2d4..0c2ecf9edb 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 89a2d69950..da7878e94a 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 2f2eb6df21..1700ec050b 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 c5bf971812..31148c80e3 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 7d0b3163a4..72aaa84e70 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 f6223cec6c..e12668f082 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 1b72545bc0..00b9c1f437 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 42fd840524..61479cb78e 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 585c09c533..611d38ba95 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 46933ced42..986795e11c 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 e7c5893b4f..a10ae01e25 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 d12e633bf2..ace1f4182a 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 8d54c47084..6d800bb026 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 f24d7692a5..f0ea9e57ca 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 054c85f595..4d89f5ff8e 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 d8d98c103c..15927059d3 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 3d74d6cb94..11a8aac485 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 00f1d9be57..75d8969495 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 ce51a54ac7..ada3149461 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 073ebd784c..07b7c6e997 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 a88e1feb2e..4bdc104e7d 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 b6074c732f..98a9e81f66 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 f5105477c4..774ce1f203 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 ef9edd6dd7..f23f83481e 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 6ba9237a3a..d7262f50ea 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 4fe98fc602..777b66d5c9 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 46ad9b15e4..5099b26408 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 4a0c1267d2..4e2a09c6be 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 b010b1aac0..be2500b38b 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 c02e69601c..d9de1368ec 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 7fc53b8b8e..08e18b89bf 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 ce3d6fac9e..ab20a6ec42 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 38b89b729a..b7a1bb41f5 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 f2be7cf7ca..03c8d0bce0 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 48d6eacda9..c907a6bafd 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 7a88d3d2c7..c422c1768a 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 0d0e927bc4..15847cdadc 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 4f5a5cde75..a9d3c8dca7 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 ed83ab4943..41fafa5763 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 f50823186c..daab68f111 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 39aee7a669..0a6fb79362 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 7b65c27f16..2b2cac0273 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 04adb36e5d..30c534b18e 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 ea9d1682ed..a4cbecc581 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 d6af28240e..4495dee078 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 df69f6a391..82160a4295 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 5de41e72ef..b9763b61fc 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 7e3ee3b24d..1dcf264b3f 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 e8bf8499be..0b3d23bfa3 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 1176c08f45..03f265f271 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 13058ad3ad..3e27c34080 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 3d312978bb..f46e74a35b 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 75fded469a..f4e7775293 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 84187ef1d5..70a5c8707c 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 697d557237..00054dbc51 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 f8e8bd9ea7..300b2e4cb8 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 e927254b9e..60848bea45 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 36d06ef565..4b88151f3d 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 6106ce8a89..392c06390a 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 64536a0140..6cd2ab7d7b 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 6c989f8068..4dd86965bf 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 a9f611d0f3..e5ace2e0d1 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 cdeb809da1..b89296616b 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 7cdbad1a70..9e523c6729 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 d427acc3a9..e494a6b34d 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 56d383edba..d99c31d2d6 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 a5b8b104b3..f193878d95 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 df84cbefa2..c3fc9be6d4 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 d5fbb60ae7..80e7208391 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 984e3b79f5..6ad0425461 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 9abb68ca85..60cc984360 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 86856ac2d1..e205090d0c 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 bf930f2f27..e536234ffd 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 0042630823..31f0fe2c0f 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 d0f7a5d630..fa04208cac 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 14831ef45e..a4509ba68d 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 bf87c6f3d7..c52021806d 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 1443e41ddb..4cf4a7a72f 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 5861eebcc9..a17ed15a54 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 66b281cc5d..ee3ee24db7 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 f95dd06200..2315720246 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 7de2aaadfc..a46db9e75e 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 75e19bc255..4f42a16362 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 c49c76865e..cd627cbe4b 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 f9c4a51556..e277579ea2 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 916b342ee4..a07b84077a 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 cf8a8af54e..d1ed6a36c3 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 acf941878d..e95938f159 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 595c168698..fb76f697cd 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 c451ad7106..fbcde2a6be 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 33ce361958..1c78180e2a 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 09f598ef5d..b6e73a5e20 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 784d106b94..6b139fa6e6 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 e11a16458c..1ccd8c86bd 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 2476293a21..b729b368c3 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 1f4968f24e..ad2f19b066 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 08d02bd749..7293e8f229 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 4477c69299..ae24ba7041 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 b20317a236..93ab9a4bf5 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 79878858dd..285e6c7b48 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 18ad0987aa..e33b50f193 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 52c7b6339c..c848684ab5 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 bc9fa9633b..b5d2eabd50 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 c26fb50e07..f45ea87f97 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 16105e680c..302ef3f2b3 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 07facb21e9..fb9ffaad9c 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 4e81ac0366..5f790c02a4 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 6e64ebbe7a..41627cc6ab 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 c5577f52a2..5abe616403 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 958cc48af2..8964818024 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 81d9372795..0e61657f61 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 c426dfa326..2767c504b7 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 0000000000..ee9a67b243 --- /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 cd109579f6..fe9a611f11 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 0756714906..4d39dec366 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 743adb715f..bbdec393ab 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 c29be320d2..92217c51c0 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 a7e143505a..5ba5d232bf 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 bb8a8b20f3..9acfbb4bf6 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 edde63d62b..7508612580 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 8a0780581f..1a00570d32 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 73c3a8db97..c1392fdd07 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 f370427625..a51efdb197 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 505815dcb4..3a057ec4e3 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 dbed3326b4..331307d3bc 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 d05a8efe16..6b30b85931 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 88791781e3..9d945eac27 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 0719857a7d..6ad69e23c2 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 bba6421ed3..8eabe6839b 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 89ce4d7567..61562b9562 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 0d2842ce76..6c6db94815 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 adfdd98eba..53d15e1205 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 d562d62b60..46b7759a04 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 e033cd5c51..dc84548da7 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 9b80373727..7bfdda60b3 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 ea8f4b60de..c86ffb97d3 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 4567171af7..b9ca9b355e 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 2fc98a70ea..0546fcd7ad 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 24127a7332..3de562db21 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 4c1af21aaf..354a5eaecf 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 4712fb37b5..c59e31a3b9 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 e5ff4e01dc..bb48d95bc5 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 3292fab0a8..5cb49836f4 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 6ed9d372fc..c8b910b6dc 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 23cda3fce4..39d4b3d709 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 515ee8798c..79ae6506d8 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 29d43cb827..be76411d8a 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 6531b55200..8b21562a87 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 be97c7fdcb..0248fc9485 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 2da10b1e8c..851a2f16ae 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 40ba84b9f4..20ad2ca0a0 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 25152e9dc8..42afc3eeaa 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 436333b0a7..6d46b8bc15 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 b186a764cd..3c07ea850c 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 727c4e79d7..3f9897784f 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 d3c02cc137..3954d9d549 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 a92570c701..30c53e1d89 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 a472d079ef..ffa850f6eb 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 ff24f46e92..a76f68f2f6 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 3756791370..c530504c6e 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 75045d1486..d7cad509da 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 789dac2eed..da6136334c 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 cabc68de3f..df56aa5d35 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 db3ef261f0..b92aab58df 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 b1825654c9..0db5f9718a 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 f47067b339..0745151cb0 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 2d6a606ef7..529fcb604c 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 7ca5879a5c..a742cc546b 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 379fd5d8b6..7a6b5540c5 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 e5e8611362..24afa67038 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 2d3856fbaf..37dc84d3e3 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 4466b329a2..91581de59a 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 e381660a3e..8e722a7add 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 c7a046428b..6ed1d80673 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 3d2d4dd8e1..692f91efea 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 0226fd52dc..20b4496b42 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 b3a94a1a2a..39ec28d699 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 09c0bba05a..3dcb9e59d7 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 55a03edc72..6e02251f27 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 200d8d2cf9..02231169b6 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 14f772c5e1..016979eb33 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 95286476ed..bbf39de340 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 f75e823850..423bf61a75 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 3cf1f135e1..e23969be8a 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 80cfa32a6b..d12d47551c 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 01a4e89c9f..f999e3c16f 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 4f15cc674b..0ec8fd3c6b 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 1f772071b5..f2d9db5797 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 f4a47c5c34..2160dc226d 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 ccd8297952..39324fe5f5 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 8c615a80c3..08d5b31d20 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 c9d92c9e44..60c3784ee9 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 709d045c34..bf4127fbd8 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 dfd87be272..fe159cf9fa 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 0f5049ecce..e204fa96f1 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 80f684cff7..71581e845f 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 17d50bc150..53e67cd550 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 81f4c82fcc..a7e56f817d 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 c84593c0b2..bad1c40814 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 83a3f8cbaf..436fba8fd0 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 75a38230e8..b673d28a7c 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 819cb1d95e..2f1fe9ca10 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 4792916197..809c8fc29a 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 b7e281a2bc..33f284e93c 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 070ac3f342..1e06319672 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 fde16021d6..15131fb119 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 4666a9ea18..28ae99c1dc 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 4dee0ed5f4..c7938df009 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 4c57baea77..2981ee7163 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 981fa5b59c..bbe44a4fde 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 64a3ea94e1..19a853dba9 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 dbf5e15265..0f1101eca7 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 2514a56a01..eefa1e8bb6 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 5396facadd..76496da6dc 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 391a071cb8..3f37de5331 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 f960785203..b42b2ce56f 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 24dbc2cdc1..c679061918 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 807b85c5fb..adc91477a2 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 c3ea319069..3fba61a484 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 ec742e4113..32f479b8b5 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 d3b9b1dd16..b923fdb210 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 8e974a0a8d..a7f807e8dc 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 784a9a37af..7668dfa5ac 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 5e2aa6747a..905ad41309 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 3469079f23..785e9ca291 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 3d352aa2b5..930694de8c 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 74503eea60..8ca964606a 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 f1b851b05b..bef4f1583b 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 3ec36265e5..ed5367e001 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 3eaac84049..d8bda90de8 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 52a416ed8a..39b99ac930 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 5085cdbce9..f95e08df3c 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 77bd125003..3bac6d1628 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 925443a844..fafedb50a0 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 0000000000..92026cbe2d --- /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 0000000000..1927227b65 --- /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 98160b8992..3278f7a3a4 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 f621574683..7630b50cdc 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 e84ec938ee..feabb36434 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 736a6d7265..c3d912e5e7 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 aa8b99a491..3605f21e14 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 06ea19e72b..a1d0f36476 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 3c267b36a0..c7a7820179 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 14bf5c28bd..cbd2f44c34 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 a7c4c67585..8a1f01783c 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 507d4e8478..4d3537818b 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 a012bcd8cd..0533574efb 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 ccb9c56956..5abf25e286 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 c46a6d782e..d18a854d6e 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 5aac538766..f3e8c01f3d 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 de854e1273..2c162e66ce 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 9f876dde50..ad43d3ee60 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 37ce27e19f..765fb284c3 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 b2a00771e8..289c9f985e 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 304babc991..6ae573211c 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 527c2f11a2..a3d7d685ed 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 aef0c14703..e9cd91209a 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 c8cfa56377..6b9a3a8913 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 9bfd586402..5317c1c2ad 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 a3b6952694..2197d27de7 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 ec82f41c07..f4b03e1eb8 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 68e855fa5a..eb35fbb0b5 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 bf672e9dfb..0c0ff56af6 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 7cbbe5fdf1..c8b74f33e3 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 eef86bf78c..4a26a40ad5 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 33edb72733..df2fb243f8 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 b37f7fda4a..3146c8756a 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 bbc95d73bb..797836e014 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 6391ac20aa..65e96945e4 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 91ed0b2dd5..2537279d99 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 9162b2b0fe..e1e6ac73b9 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 8163846aec..ed325acd86 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 072b441a07..bafd7d1bd2 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 4d826a287f..eb396428e6 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 4064b21ca6..30e384e0bc 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 edb95a946a..6363ddf198 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 72d851ad87..09e73e4ea8 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 ae8ab67959..6295d91884 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 c39ac530ae..eefa54b949 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 485150d292..f0490e5724 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 c239d7d8db..f3e2c36ae7 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 a9a0db5500..d178ef6c88 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 503013e402..b13cf9ec52 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 4a6f5e6796..6deeff0748 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 4ff2a80434..8cdd851191 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 4f3fb27e7b..1984ef6f58 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 3f7cf20fdb..7d8b268367 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 0b01fc8c16..d534acc5c0 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 1c4a8c0fb7..fac2fa3a8f 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 afe35bd06c..c20f7a9ba5 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 407bcf48c1..eba1629045 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 faa76ac933..1de0a0d6ce 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 dc8954af2c..dfaa09d52f 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 06870c4020..61ae1fd8e0 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 c083218c44..f252518fca 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 736689c34d..f7fe15f27e 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 e9de2acbdc..6050207304 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 5d4f4c40b5..df10f39657 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 c02da263f8..487f2294dc 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 a12a5079f9..48896cc868 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 d185410a4e..6b2e5d23ff 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 ee37767318..22eb2c1e70 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 ad16a7e3a8..d19114286a 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 09ca1a0273..3dec14ffa1 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 35cbb8b9bc..1733cfdf17 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 bc4a483a07..a71ebe3ea0 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 00b5c35e05..9632cb372b 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 8cf0e80806..542c53f0c0 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 ca9822d273..fab8810ba5 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 a202c61108..22d84209b7 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 30b39a4431..296588f66a 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 b0e39a5189..b67d70e057 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 396180249e..11fc4f00db 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 4aa525f7a2..3180c54345 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 d719802ad7..e53d33512e 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 b75c07a081..fac13ffe77 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 fa9dfe7615..4d81108c5e 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 c4a2a2fc09..fede00cfd7 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 bc97a844a5..9afc996352 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 adaaaa08b7..15d58eb462 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 fd6d77873b..9e2f7b0cc4 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 b9626b9e96..384bd2e83a 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 3bdcbfc95f..134acae3f9 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 3590b6af88..64c797ff30 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 351703c5cb..eaa2dfc85f 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 5e143fcca8..c70bcdcc45 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 aa8d19dc40..f3b15a7af5 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 7d871c286e..0d0aec4791 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 bcb4a24e95..ef3fe4e3cc 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 d21c46c9e6..0d662c572b 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 306e65e047..9bfc5b3528 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 2e14525a10..c71c49e127 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 7f62e9e304..c23f06f0dd 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 0adf422516..434a5cb7ac 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 0e8ce3dc96..264ae3655f 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 c23f06f0dd..546bf169d3 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 2619976303..68b5586207 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 dde2f6dee1..1a046c4a05 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 0000000000..769f927ea7 --- /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 17c4c90626..b4b6e40294 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 a0ce144947..0c409bef3c 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 0000000000..0f28dec1d2 --- /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 2a9bf060b7..26490e512f 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 0000000000..015e4ad81c --- /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 f2b390a223..d0e097326c 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 ba29b19df8..bbe77a36af 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 ca7bce4450..e12789dcb4 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 cdaff703be..935693f87c 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 f193878d95..284907b275 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 bdda2cf1c1..459eaacac4 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 902289b2e8..b6bdbc8b2c 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 fe79b4b88c..97d3056f60 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 80e7208391..1c7b4e69ec 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 6ad0425461..f411c06a3e 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 92ad3ef0ca..611428432e 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 01a21920cf..0c81dfb3ec 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 39ec28d699..6fc78c96fd 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 39b99ac930..ce408778b5 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 92026cbe2d..553a296343 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 c76fa9ee97..0f79ca2a02 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 0000000000..76144afa4c --- /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 a3d7d685ed..26872a9f9a 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 1984ef6f58..14e6be4091 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 831f6ef8bf..90c9d4fc9c 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 546bf169d3..4a51786010 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 66ea276eca..6519d914df 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 a990cdf94b..793dd5f2f3 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 04889bb3f3..53bfe7554e 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 ea164e70b9..d7138ef865 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 f6e809d528..15c0900176 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 8e5f5ee2fc..6519d914df 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 362f6c0b2b..38953ebd23 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 9e0d8939da..83ab52499d 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 94789c3330..3b7984f56d 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 e11bc5e61f..8d0cd44070 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 d84b79f1d4..1b914f80aa 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 b118422ef8..638c0e2557 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 298ac106de..875211f5f0 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 888ef98a58..6733361f5c 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 ba10c5c741..929f821814 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 a0f1d38ba7..eb1ce5f30d 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 900b1caaf9..4c69678d21 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 d59a553a4f..f1a27be83b 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 42136e9a09..1856226043 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 400e72a7d0..0847f3fb90 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 ef73d4356d..a17f536db7 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 1074aaa68b..8420a1bea7 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 c532a2063a..09dae3efc2 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 a6bdb9c527..27f6895fc4 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 bbbaa3d340..b70b0a3061 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 9054943ca5..0c87f04e3a 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 826f9cf5ac..c0725219a9 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 e75775bf75..41c7df7889 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 c075440584..dca9c87002 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 fd38da1cac..85b48c5575 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 34d5b14cf2..0ce2fbfc66 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 107c837970..7bdd1b33c5 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 07d177ebf3..bae0336a63 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 e35a229ab9..36543e0515 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 b3dfdecac2..56045f0eb1 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 f8474e0fd2..b95690641c 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 bb41e5335d..91b3692554 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 00a39aae8f..51b0691714 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 12b03acbcc..a49e3cc6d2 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 bb7c5816c7..40ca43ff69 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 c060c5f881..cb1bb9f64c 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 08e044a46e..7b0fca67bd 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 a2a8e31713..1f31ddc03a 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 5a3d4e0df3..f093edbbc6 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 8ff8f43035..7d34bb0247 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 7eb410caca..c7104ac19a 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 757dd00897..86b5d75814 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 400ff31be8..7c7ceb3a82 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 00f4577ad9..f3c7910311 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 280733affd..db2b22650e 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 f5f23f2f11..a1e6d74b4f 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 41a631937d..8f04b0838f 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 cc6da709df..9846e30529 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 d5167ebfdc..ada7fbb5f3 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 436191ab86..12735764b4 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 64e78a24f4..2f5835ad61 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 7ff47f7a22..f7357a1b2d 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 6cfdd53653..30051d929d 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 4f3de14b73..b973984113 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 fe409a46be..71df1852e7 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 2b5b8dcd23..efb2288f4d 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 a84475ab8a..cda4ba9dc8 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 69bc947426..b979e4d526 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 da07290f42..6df6e1d0c8 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 c7dc1092b7..2537196f21 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 c0781b3760..ac9b81be7a 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 0610d4d9cf..57305a3b4c 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 b6d90b9930..19c80a82e9 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 3e1aeb4ce1..c8f665cb40 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 ea797754da..5d87bfe8e3 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 0d2d290fed..96331cb534 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 35db067177..873da5a786 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 7e94ab0a35..0348229213 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 d9d513198c..726490b203 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 768e1ee731..62e8fc17df 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 1f5b5b4b1b..4cefefc2f9 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 7792943628..e7c01479a9 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 783581a075..5de968f5ea 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 9f87dabf94..52a3f9f1b1 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 5778df8c36..6d46b6015e 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 217baf42f3..84ebdaddad 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 6ee55aa387..786fd07f62 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 df16b13b93..530140b524 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 b06df4b7a4..32b77e08df 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 2061c061dd..e477f4a3c8 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 69911986f5..d43929dd77 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 bcb751faa6..f13db03ca4 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 38eda8e9b3..7fffd19c46 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 528e804a01..1670e0c248 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 8d9d19b6a1..28be5cc45c 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 0000000000..d801ce0a30 --- /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 9974b885d9..bc60827689 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 4a51786010..4c5e1e21c2 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 434a5cb7ac..8fe4681c19 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 95b3fc9fdb..33685b2bc1 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 317fffe84b..505704f63c 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 ebb8ae3883..d1bcb600d8 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 e974b6d481..7fe2f41b73 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 781420b347..172a17d291 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 61e4dab851..4061e3207c 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 ae717bc183..f6f36ba8ef 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 505704f63c..d8d852b696 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 9c488564ea..c7b81df2ef 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 14d6b362dc..9ba47c5250 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 e13870b8ee..f6f27a888c 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 9e491a5489..4be57f13fb 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 4c5e1e21c2..a9287834fa 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 8fe4681c19..d4f9369fbb 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 d8d852b696..0b4560c8ac 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 2a22721200..14e6e6b406 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 17496f3d36..bc1ace5369 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 56f5b53326..ad160a1ba8 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 280bd98796..1b25564b8a 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 018837a81d..3276f8b073 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 8c52d80c33..bf87a2888a 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 4bbcf185f2..6bb6c7fb1a 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 03e079c017..864d131d28 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 54b474e95c..a02a52d151 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 a9287834fa..4ae2a070ef 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 d4f9369fbb..c51f9ada7a 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 b89dbfeb70..3366ec1641 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 d3ff905e7b..ad334f848b 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 a6b33c2aa3..cc777b8ad7 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 09dae3efc2..8a30c4d949 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 91031c141d..dd17eca679 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 8b5273f39d..c28b56271b 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 4c16e230e9..7b75a36f8b 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 37089e54b0..977a6717f1 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 2275c5eba4..c3a24fe9b0 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 86b5d75814..81f0fa010b 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 5c317794c2..fd0b708576 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 5844cb8da2..01d4dc406c 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 ca47f83137..6b49a3b975 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 4f12f59005..cf2f339830 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 b973984113..60b000eae1 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 5e32c92324..d9762296e7 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 0a3c67d97d..96c5d2ec67 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 8bfa6185e9..8cb4a0b963 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 cd0f72307d..d34ab0266a 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 f8cf38395f..10cc3eb47b 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 7f49d1b897..9b0466dda9 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 189273c580..621efa1cb9 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 a9fd998f00..4a62eb76c2 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 ea52f98f70..f35c763bf7 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 d8a96b2db5..70a29fe11e 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 90c766f083..4cd64afa05 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 d6e10e1dc7..338509f09d 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 d1e4ac0551..bba6ac3dc8 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 05ea832a81..4093f3753f 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 94f9c846d6..992185bf10 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 e8fadc9ed4..edc15f0089 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 0000000000..ed557133a9 --- /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 ab626e1f15..2c18864194 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 0000000000..3232245a4a --- /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 0000000000..17bbb60edb --- /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 71d0992e9f..b0bf08cd8f 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 2694842134..ff320f41dd 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 0000000000..ed557133a9 --- /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 4d4509d744..bbc6c7d2cf 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 4ae2a070ef..5325986cc7 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 c51f9ada7a..f5a436a116 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 0000000000..9e1bf64c74 --- /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 0000000000..6ce3391c2c --- /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 45d31d6088..1205fd5809 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 6f8d275101..229cbb0c9d 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 682e23dd14..12a3adbd70 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 c69a3ed573..f80d63d437 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 51b0691714..0f5a9b5ebf 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 81f0fa010b..a8c87effb1 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 3ba58a688f..35a16d30f3 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 726490b203..6eeab8d6b1 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 2b92887eac..951b6d4c74 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 d459ee2cc3..14dbe7336f 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 f242a421ea..46db47dc2c 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 4417f3d4f9..e73b65661c 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 4f08c4c37d..1070730ba9 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 059cdb1f1e..3624554843 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 0c0ca78502..63476a9b71 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 e9925132b0..a6b4113e31 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 36243972fb..2d07fb3331 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 9b0466dda9..e519e0f941 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 2a9c3f8cd4..2807129126 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 f35c763bf7..a2b2583bdb 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 fe06c6d8c1..e0637b709e 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 82b0d9b455..b893011466 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 f299727b94..0d533910b5 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 23cc892900..f3c6af51df 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 888f56efb2..3de50d3309 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 1e69fa2494..9658ab9214 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 e3e7eae36a..049a1ddc60 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 00e7ba78cc..8698fddbea 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 c6b847c313..8b516e4bf9 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 1c034d6d68..589de2b683 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 11e04ad816..d33fb66f12 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 ed557133a9..e9fa25b30f 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 9a2ff139dd..e7ba18d393 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 0c81dfb3ec..ddca023d72 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 6519d914df..939fa7c9cb 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 7bc48ec2e3..706a98936f 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 0a7af79fab..db996c75c3 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 619f5d4bb0..cb97cdac9d 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 8b516e4bf9..61bb78a082 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 793dd5f2f3..de1bcca5b3 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 53bfe7554e..505fd2a5e4 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 d7138ef865..ae960cc432 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 15c0900176..07abe27b42 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 38953ebd23..c110df0576 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 aa712a63ed..52f9411634 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 f911787c1c..8b49f87bd0 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 9a53a29fe5..008e758c96 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 5325986cc7..82e1601e90 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 f5a436a116..51c3e1a83b 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 ff320f41dd..21a19a3a56 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 ba3ac5107b..51f00ad98b 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 a8a760d8ca..b5b1053475 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 3ef13c117a..b1245aeabd 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 eb75c6f374..cc776c21f9 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 259066d456..13c8f5bb03 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 924bfcd550..df8e87f751 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 a488fa1e2f..c748b2f72f 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 c58873473d..0b8e2682f3 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 197213f747..4eab2fc3d1 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 0fedc2b794..d9ef2ac6a7 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 acf8695795..feb9d582cf 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 0a410401b5..140d7e638a 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 812bbc9194..2b4563dab8 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 d833f60c84..af49266bef 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 28e22c10f2..893ddbf54e 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 ba5a3267a2..2d274c077a 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 31cc98f7e4..5e0c9f0405 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 feb066a6f3..7b2c3e585e 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 d623f1d879..299c9026b0 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 ccf4465577..2fd3df1acb 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 de3d2e560c..9748e5e0f8 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 a567a9bf61..f50226b9f0 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 b39f8a6ef2..0f0dc5f635 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 f054c7c8e4..0a7ce38311 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 82e1601e90..80390c66f6 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 51c3e1a83b..e091ca2554 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 2f21a1c0f3..3a40e9065d 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 6bb6c7fb1a..3c488bd324 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 869bb5a23d..69cbaa457d 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 c93b7a5a81..f787c02876 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 58a666a68f..7d563cae7c 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 0000000000..e18246a973 --- /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 274a11faec..d159b641fa 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 43a88be332..f8e907b46d 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 f355e5c75b..f6b3ebf6c8 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 fb43f06eea..3f5c4395f2 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 39eb16ec26..12c17e6081 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 d85c219691..9073ab224f 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 55aac836bc..0006364b94 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 efd9f99b18..3a4919daca 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 c71c49e127..bf5b924bdb 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 80390c66f6..c9c5814a5b 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 e091ca2554..c577567635 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 6733361f5c..4c540cab84 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 c28b56271b..a2bee1f003 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 6bda8cc3c2..ed6fc31c41 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 fa859861fb..32a71ce14e 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 a1ea4f98c8..97a7d32a9c 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 54c9f81500..249635f9b2 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 b0176d1c00..42b944e9fb 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 1f14e96ed3..83e7d5d210 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 10cc3eb47b..37a0310d16 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 28be5cc45c..ddf08de42b 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 4cd64afa05..c936807484 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 c7c9782e9a..91ed8d7ae5 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 0d533910b5..cd43659fcc 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 4093f3753f..78142ae3fc 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 279ed1fbd0..b1bf1bc8ab 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 299c9026b0..87c96e38c3 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 19c25a2fd4..e4558b103b 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 88225d3282..ffb5d64f6d 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 d978e51292..744ba2e13b 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 724cb756f6..d3994c3c42 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 5c2c5e7b84..18146551a5 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 4c540cab84..5b1ca46c41 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 229cbb0c9d..c5d824ce61 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 e930a0de59..6f7427a023 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 86b3532e00..dc1f5c11b5 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 8a30c4d949..03fd8400df 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 12a3adbd70..d7a257b1d9 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 7e045934f7..b8331d8192 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 a2bee1f003..a4351bfe67 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 cb509cb19a..d8616a8257 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 91b3692554..d929f2d3e8 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 7fffd19c46..8b8d2bc567 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 51b3b5617e..84bdb4e1c1 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 bc585153b6..527353eebf 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 7c7ceb3a82..b2cb3d22e4 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 fd0b708576..9a595ab7a9 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 01d4dc406c..d99be94aaf 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 6b49a3b975..4c7455be3c 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 cf2f339830..bdbdfe22ea 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 60b000eae1..9860334afb 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 71df1852e7..84d503bb09 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 bb2ede6d55..dc7337c756 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 6eeab8d6b1..1946207337 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 28d4269865..0aba4a8bd1 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 3c488bd324..1e889043fa 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 d2fff820cd..d9cd62313b 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 0791cbcaab..e448f45565 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 0000000000..49c4b9b4b0 --- /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 0000000000..f2f8b0a389 --- /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 0000000000..39daf02c20 --- /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 86944ec9f9..1bb8d80f55 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 0000000000..bc8f21c23b --- /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 0000000000..806a84457a --- /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 2fa16604af..0000000000 --- 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 9ba47c5250..c9d61784d0 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 f6f27a888c..09c23c6f0e 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 92da3a0308..1b79108846 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 422ca55b39..5644aa891e 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 67e3cd6409..68d5a884cf 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 ec477cba78..0000000000 --- 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 803fd6c3ab..a6e0110215 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 4134ad4e32..d9e2d2bd9c 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 adc6f4e029..0000000000 --- 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 bd5d45c024..d839ccc674 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 cd1ea8725b..ef2199b11c 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 3b70f30189..6eff97ae7d 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 22b4911d8c..02904bedbd 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 c9c5814a5b..255dd1c953 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 c577567635..2fcc32d1c2 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 6a3631a8c0..a6b01560c5 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 917afc5357..0bf6e7846a 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 c9d61784d0..7e41d5af9e 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 09c23c6f0e..27d0002470 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 1ce162500c..fd278d3df2 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 e448f45565..9f4db8d200 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 f2f8b0a389..c08aefc0be 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 39daf02c20..f70cc72811 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 1bb8d80f55..aed94b9266 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 0000000000..0b5fb23712 --- /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 806a84457a..d3026f94cb 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 fec8a3387c..0000000000 --- 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 86de1f1842..0000000000 --- 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 c08aefc0be..2d153360a2 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 d801ce0a30..51afbae1ca 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 0000000000..67bd1bc560 --- /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 9dad912886..5eadc39ebe 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 e38af1a04e..62f374c888 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 0ae91ad559..0c5a5c3873 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 c46bd75431..4fdad670f0 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 a02a52d151..a58bcd6fa7 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 5efb73c2a0..644b0856bb 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 255dd1c953..35b5c571b7 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 2fcc32d1c2..9d85fa8367 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 edac0e6e3e..e687dc715d 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 3a40e9065d..9809710f37 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 87c96e38c3..51ea3fab0c 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 329b26221b..3b73caecac 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 2e9c3739c4..d05e42f6bf 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 cf49b36a57..72dbd38a41 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 7f092683b7..5d21a11d4b 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 1517f47a2d..5157ab6ed7 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 dcee52db59..f5aa2cb1dc 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 e8b9747754..c0a269bd58 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 9d564c6536..b8073f16d9 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 febfb93cf1..b203375769 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 a1c54d9629..5e8450ffde 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 4d48b0cd04..6f87c34d60 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 38d893e734..8810f945ba 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 664ce0a38b..0ead849b59 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 bfe20be0b8..b4ce78faed 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 6cc33ddf61..1d559dbb7b 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 eda215ebd0..58aa331177 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 b036e3bbbd..7625b3c2a9 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 b535b35e18..e2b3ec7dde 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 1b6150fbc3..cbaed220f1 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 7fe2f41b73..d463231ba5 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 0eb86f0198..598144f5a2 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 891f99ac67..10860d0fbe 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 de8444446d..e70a53caf9 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 6e258d0ad5..518993cf24 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 f60b1c3584..77f911f0ed 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 78c7991d9b..891adac91a 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 df79d0750b..61a0abb626 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 50b85f5720..dbd2e8f7c3 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 b0c49a58a6..d80fd3c533 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 35b5c571b7..158976ccd2 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 9d85fa8367..f0d86a3e19 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 0f0dc5f635..bd8ce68c5f 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 e687dc715d..5fcbbaf1ca 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 9809710f37..b05be45e79 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 4be57f13fb..0cb7c108b6 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 158976ccd2..34e7533f0b 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 f0d86a3e19..a2a162ab13 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 31a06c9412..d7f78f9c36 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 bd583be37f..64eb2d9ea8 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 31488650dc..b072c613d4 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 2816b86be8..b7cea620a6 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 31bfd005ac..9dee01c2fb 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 199e20d3e2..25b4531cee 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 9f3b45d40e..67c6d3bc58 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 b598d7ddbc..ded0ab6bfa 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 a8bc9fe982..66ee4d60bf 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 a2cfefb120..681b3675aa 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 719ea9445c..f6c1e6c8ea 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 19742d74f2..6118d74d0d 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 d7503eb10f..817a43d4f5 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 66a22d4436..12465dfd98 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 5157ab6ed7..c2f6ee8339 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 f5aa2cb1dc..ff6dff85ac 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 7625b3c2a9..6dd2974115 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 e69ea352c8..a6ea270fb5 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 34e7533f0b..a9ad1f1320 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 a2a162ab13..2f0a75d796 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 db504e3d19..220228b657 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 19fad984b2..0a14799ce2 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 85dec4abd9..f8a341481a 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 b39722c39f..6a04988beb 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 140f6908dc..4d2a879bc7 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 24c9e37a3b..4dfc27650c 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 9d0eaa8434..64ab1174b8 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 ccefb681d6..e96c40b13b 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 b3d3e0ea28..08ed841e7e 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 9e8f1dff6c..c345dd6cce 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 0bb9d7a7c5..e34f98c87d 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 ff36f4f5c3..6dabc5ad59 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 579919821a..249fb85bac 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 475e02aba8..dc148d4f51 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 30051d929d..a15f8b4fe4 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 b36abbedb4..64265f7190 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 e5afa272c4..ce61d4ff17 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 ac9b81be7a..d7298b2abe 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 5b26d9b1c6..bbff510db1 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 b800bf6af1..3c61559bcf 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 effecd7244..7de6427b5d 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 b6576fc689..644d35da72 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 3007c98148..cd62cef74e 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 647c2b8ac0..4646e9f01f 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 3afed0ca8d..d039fc04c8 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 2af35e8fb9..9e59b63adb 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 055b5627bb..b181b848f0 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 287ad0dd52..5782ce2308 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 90ec0e6e25..4540c9158d 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 e032de4d94..e97e2185dc 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 dd12924f4b..fe213f7920 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 9bdd4966a4..f297bfa5bf 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 a6ea270fb5..2102a2a822 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 a9ad1f1320..c42eea70c7 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 2f0a75d796..b4d38b5d51 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 d3b6891410..5a6645109f 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 2d153360a2..3b64b4168c 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 f0976f3d67..27f3a88433 --- 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 aed94b9266..2191a8195a 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 0b5fb23712..cf14ffa3cf 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 d3026f94cb..ca74767813 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 d9c2a8d0ba..93e8e3fe8d 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 e23ba5cb9f..55bfd79143 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 fe0808414a..b7239c8bf4 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 621821fd21..ac7a4b22e5 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 ce97c7944c..4d599be88b 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 1b7540ee49..80b5b718bb 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 474170050c..73ae06d994 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 2ca4bc129e..e3b30cec9a 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 88d6681a80..5c356b53c8 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 4aa8eabe9d..c8ab737f66 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 c42eea70c7..d868a86306 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 b4d38b5d51..3a9b42f563 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 4aa033ee07..a2df00aba2 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 8fede95425..59afe1351f 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 de1bcca5b3..82fc306369 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 ae960cc432..98b6d22a83 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 07abe27b42..32daaaa258 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 ab3a0b9127..c3161cae6a 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 89a35b28f1..6b94dbc53e 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 0000000000..9cb58b1adb --- /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 0000000000..b5d5c15850 --- /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 0000000000..c0e8750d94 --- /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 0000000000..7f1cd8c35e --- /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 0000000000..88b8319080 --- /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 0000000000..fd2882c607 --- /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 0000000000..dddcdd64d7 --- /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 300b2e4cb8..8d10e63c60 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 0c7a1bfb60..ba6ee67624 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 6e86f70290..5f1f2fb60f 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 0000000000..5d4ce687cf --- /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 0000000000..ad1788e0bd --- /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 fecdd35b80..ccbc849ab5 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 1b6242b37f..ef9c7a40b6 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 b2b7ee89c1..cc2154ad9d 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 69cbaa457d..20fcd202ed 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 a18c809de8..a798de0530 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 0d3c61c385..9d4b84e9ec 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 2cf8791e50..b013fb3bd8 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 ec50980b6e..d5ea8d0bc4 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 16242dadeb..d4cdcf3d25 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 34944816c8..ddc02187c5 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 0000000000..b83083fd6e --- /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 0000000000..131303354e --- /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 760a66ba1a..2c5717e72f 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 fafedb50a0..9317331dae 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 0000000000..3caf51812b --- /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 9b6e34f6c3..1a1199eeac 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 36e21728f1..fe31651173 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 0000000000..d24bf97393 --- /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 85bbe5c950..6989f58d3b 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 64eb2d9ea8..87e6d6ff87 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 79987d806a..0c7a454990 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 ce1f154f91..81420cf389 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 ff5aff6fe5..18d564765d 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 b7cea620a6..6742b39e8b 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 c0a269bd58..d36b05fd12 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 9e2f3e9095..a21b484ec9 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 6ddb827981..93eec19d41 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 0a46190fbf..7a881ab9d8 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 997728ed49..16c8d37f44 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 98b6d22a83..50217e4b59 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 90d943dd75..d38c115c9d 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 8f1e034dca..5948f7e422 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 630fbaadd3..da581bb969 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 ecf9dfde8b..8d1b7262fc 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 26176e97e4..b8512531f3 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 8e17caad86..09642e6647 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 2e6246d06d..3982c7f0d0 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 7296179a12..335b24b855 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 42b944e9fb..d69f037072 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 3caf889c52..2556a0d2e7 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 5ecd9c1009..8386409d3e 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 ddaeec9422..de7dd04a48 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 c2f6ee8339..d372811edd 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 6fc8e9c2e8..76dea52e84 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 3435fcc50c..2fd8466cc1 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 22f02a4218..5a11136fd4 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 21e8e1c741..6ed3af285a 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 a21b484ec9..47b9fc1d63 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 d04f7c5f58..0682c45879 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 f0d8c90138..c8eda3690e 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 0182f6bc07..3509b1ba8e 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 8ae80ca902..8efb1a3270 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 37934db305..af9e82adf4 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 b7b11a7b46..5d5f2fc810 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 255a2c5094..3b49fe2af7 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 8bfbed52a1..e10125f84a 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 0624422772..0264baa8e8 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 0f0191f3b8..c2bd357ecc 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 1915706ca1..6834c557bd 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 ad9bdd7c53..afcd2f1180 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 646878c97b..4823d2eb2d 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 8478c2b9c4..995d109941 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 c867fdc621..b295a567b3 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 4226aad3f0..58a394e7c8 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 d7cd5cf2ad..b217988f8d 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 bad6d7fbcf..21cd6aaa97 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 9721bee901..2b80a1092b 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 c6ec5c2ccf..b05e4b7bee 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 5996ca467f..8b1ce502a7 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 f297bfa5bf..03c29283c2 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 008e758c96..82023eb9e1 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 d868a86306..0b5cc1c4ab 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 3a9b42f563..cfab765e20 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 02904bedbd..9c1f1960d7 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 0b5cc1c4ab..5dcb3425bc 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 cfab765e20..5238d0efca 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 1ddcadb439..6f9c844d5c 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 844ed65c5c..8104875888 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 5dcb3425bc..57a230d866 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 d63387ce9f..e1e91c08e9 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 156b495dcf..bb68d37707 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 6f50b05876..03710520b9 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 4e1d7d9a8f..1b049b54a0 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 57a230d866..3bbccd4671 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 5238d0efca..e687b3d494 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 2309ae6f52..52717c5512 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 3bbccd4671..8ec27d8425 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 817ca00a81..a53357b1a2 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 8ec27d8425..8d4234fe11 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 e687b3d494..be6de1b757 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 c0de99654a..7f03e52ca6 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 8d4234fe11..7a9008f7ba 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 faf3bc2cc0..76a6d8f64f 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 bf5b924bdb..af2198a556 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 7a9008f7ba..2c57c76345 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 be6de1b757..fa3520bd5c 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 c7536459a0..7a76512f01 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 2c57c76345..c8235ce474 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 48b246e6fc..154cdd43c6 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 95b0431a32..ed54c7d05e 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 2a5e39c797..b9ec8e8473 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 76b3ae629e..edd0bea977 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 c8235ce474..288008fa07 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 fa3520bd5c..f2d0d6a518 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 55bfd79143..23112de555 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 edc15f0089..cc17807932 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 1eb60e9154..32cfcd415c 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 2b5c3c87a5..c2f4fe52fa 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 288008fa07..bc447e3ca0 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 f2d0d6a518..427ac0d68f 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 12465dfd98..7343c2d21e 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 74a70f0b11..a53a8c1d34 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 94b9960c85..139c61a3b0 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 6742b39e8b..f51e38bd9d 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 a45591ecc3..e45e73b8c0 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 47b9fc1d63..a52dcdbe09 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 b8512531f3..d89b175962 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 054fad3246..36f1a65222 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 b2b8aaa6f3..9378694f5f 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 d69f037072..0b8c330335 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 dc160b283a..466f07a9de 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 c55a468221..61de66d916 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 ded0ab6bfa..3afa5c14c2 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 dbd2e8f7c3..d560fe2cbb 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 c88aeb8e5a..f73d3bccaa 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 642b774f1e..d399f5b67a 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 7343c2d21e..0f35cca5f0 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 7be5c4bfb9..334c086f8d 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 de7dd04a48..8ace9070f8 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 d372811edd..e4471b7e55 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 d36b05fd12..13e49bcf50 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 a52dcdbe09..d3a889902f 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 7a881ab9d8..817b6821db 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 16c8d37f44..ac16198ee6 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 ac85eff679..b5b9aa25e4 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 5948f7e422..d82e63a261 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 fd7eddbb48..7b7f7d7ec1 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 f2e7387aa6..6c678ab732 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 2d0313ec21..1d2339702a 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 6d843c222d..b9532daa99 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 e477f4a3c8..e648e059fa 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 0ead849b59..6580ab0917 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 0b8c330335..99274d59ff 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 66ee4d60bf..699df2c350 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 398acd7d55..b500a03c42 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 2e7c9efc7c..3fa20f2eea 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 a704e5ffa6..89d25ca23b 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 615fa1f755..3b9df1a4e6 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 32cfcd415c..ef155676d1 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 3efe31d5a8..78f38f5316 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 b9ec8e8473..2ea292e8ff 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 bc447e3ca0..608809177e 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 427ac0d68f..0e7a36f0d7 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 cc17807932..cdb61c5910 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 0000000000..69e4c0c576 --- /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 0000000000..5f59144727 --- /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 c0e5f68483..2b4582610e 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 0000000000..4ed3ab0241 --- /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 0000000000..3668984a41 --- /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 0000000000..06684e63bd --- /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 942ebd0842..6ef71bb952 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 0000000000..2f3a6c5355 --- /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 0000000000..403d1980b9 --- /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 172a494b60..80dbbc312e 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 bbc6c7d2cf..0e78ddecc4 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 608809177e..b104ae232a 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 0e7a36f0d7..86e9c9a001 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 0000000000..a255e21c70 --- /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 0000000000..c9a0d8fde1 --- /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 995d109941..83accc5b86 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 bd90b907d3..3c58ff946b 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 914c113311..b2b6f74c0d 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 5782ce2308..b4947d121e 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 8a9dc2691f..c7a13a4f34 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 c110df0576..360d97d13c 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 0000000000..2e46105050 --- /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 0000000000..5bd29042ea --- /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 0000000000..6488a5498b --- /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 0000000000..5f66883172 --- /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 0000000000..22742366d1 --- /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 23112de555..9b2a4380ca 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 8c05295b5d..93e2596e34 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 23c04fe347..cb4201e295 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 286a1c8ca2..530cfef4cb 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 72da24d38d..77451fc1f6 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 ebf56b27a7..ae1c2f1caa 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 b4ce78faed..944c1bbeb8 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 bf87a2888a..f7e4629753 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 518993cf24..a0fa387cd4 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 2e46105050..a04f570d36 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 5d21a11d4b..3ab7e051a1 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 45413d4a15..2db46b02db 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 0000000000..bc70e90882 --- /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 7e72fb2403..454ad3ac09 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 c7a993bdef..7e1df67811 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 611db3acfd..67b5a23f65 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 706a98936f..807406d0d0 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 0000000000..0f6e767f34 --- /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 69e4c0c576..b8828c9c1c 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 0000000000..a74d2c0450 --- /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 0000000000..066de6d548 --- /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 0000000000..fcf31df392 --- /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 0f79ca2a02..5fae9bd32e 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 2197d27de7..e2d391da0c 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 f4b03e1eb8..a4918978ba 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 e1e6ac73b9..ff729735d7 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 939fa7c9cb..206a1ec299 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 82fc306369..45c5474f27 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 505fd2a5e4..f1066fe289 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 50217e4b59..b62a413e82 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 6519d914df..206a1ec299 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 360d97d13c..5833d06c8a 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 139c61a3b0..94b9960c85 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 e45e73b8c0..a45591ecc3 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 af2198a556..399cbaf518 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 b104ae232a..2b314ee48b 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 f53af0ee1f..bb86f4ed49 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 399cbaf518..b18608587e 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 2b314ee48b..14e6dea022 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 bb86f4ed49..0c56e89b67 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 124449d446..0166d41ce0 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 14e6dea022..2e74cea5c4 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 86e9c9a001..2de28d73bf 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 45a8f879c0..11e7af7625 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 0fc3e55a58..2862805a33 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 f639dae975..ce211a4759 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 cb4201e295..e8ab05abb9 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 530cfef4cb..d46d1fdc62 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 95a6d65a9f..399523dd77 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 a3a747d012..fafa267c91 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 2102a2a822..a58330ad22 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 2e74cea5c4..bef5132c78 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 2de28d73bf..8314c61178 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 7f3ed900d3..fe47ceeffe 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 1b6667f2e8..2e82ecb4f6 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 4fdad670f0..c2ba5a4652 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 c0f0abe817..ccce082044 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 d984eef5fd..124366ba24 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 142bf32bab..d35f237f42 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 5cb9c481c3..ed79604a3f 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 8814c8968a..4d5995c558 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 fb06d06cfb..989841d131 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 0dd57f7581..b365c7e008 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 d2e4826ba2..2d6f39feb1 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 ada7fbb5f3..5d2efe7660 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 3509b1ba8e..c82818bca1 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 a2912ef0db..7aa83d30ae 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 05e3422fe7..d2c6e9859d 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 3aa65734d3..3acaf75d69 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 771ba55586..ff18e86aad 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 249fb85bac..abcf1193ce 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 dc148d4f51..aefbe760d6 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 71bb67f075..82f6a35ac8 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 6ad030078b..ffe8779735 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 a15f8b4fe4..2736527101 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 cc42bdc54b..17faea4495 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 e1054f296d..2e32d0ed43 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 7e85e7616a..8ad8c24bd5 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 913262d35c..3e82adeb2e 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 273bac8ef0..b8f60dafdb 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 6dcfecefc2..4521af8d36 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 0000000000..9cf2bca2df --- /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 bef5132c78..9695f6cd75 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 3e10191e48..ed12cd49c5 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 c1fb5f1d21..f7ae21ab70 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 433f9dd7ff..232a566630 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 cbad07c028..79926cf1fc 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 ae1c2f1caa..3b8d99c486 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 d3a889902f..c8c427a5bf 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 da581bb969..b25b89ac9c 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 1e889043fa..ad0330b56a 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 a9155c7b62..2cdc8fe027 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 9695f6cd75..b025253cf7 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 8314c61178..e93f9ea8b4 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 0000000000..9336d14092 --- /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 1dba5f5f29..0f4e7e1c41 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 2c6e49f327..8b2da9e632 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 0000000000..c14b4284cf --- /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 ab965de035..67f71b9743 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 0000000000..97a3e3bdc3 --- /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 741612b6b4..f739459402 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 fea81dcb58..1d409a8a4e 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 0000000000..697dadb4c7 --- /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 51ff2ede57..ac9005738c 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 0e78ddecc4..a7dbd48608 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 f5519ea903..d6e4965c23 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 0000000000..fb9156d96d --- /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 1b7e1ad888..5c060e76ee 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 1b2daecbc4..d463a64efb 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 2c9562359f..4a93d96fdb 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 0c2ecf9edb..a6eefbcc54 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 654bcfd43d..a146552f14 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 c4ceffd537..735a9bf58e 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 0682c45879..678d02d9d8 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 0d4a8b73a0..162fac50c6 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 39cbde08c0..b37ad8c15a 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 472c430da1..693616ab78 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 b8073f16d9..61db00fa14 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 ac16198ee6..e528d7c4ba 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 3e35559bb6..f63df3995e 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 99274d59ff..74647864fa 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 5250fb0fa7..0f8cac370e 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 8386409d3e..59ee802718 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 e4471b7e55..ab639b2e6a 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 3b8d99c486..3c30340fc6 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 c8c427a5bf..bc213d805c 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 e528d7c4ba..3e9d39fa64 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 c82818bca1..4b6ff47705 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 6580ab0917..a9f43f0fb2 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 8ad8c24bd5..b3f4a68e37 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 8c7b103f83..b6c59604b7 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 6989f58d3b..1e73f04055 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 53598e24c7..4d984ed682 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 f51e38bd9d..d2b92e8efb 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 13e49bcf50..d52a4a2a19 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 bc213d805c..2e694e5d23 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 3e9d39fa64..ea621228cc 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 b62a413e82..13ffa318a4 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 8d1b7262fc..d9e7a45def 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 74647864fa..e2fc11cf22 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 5644aa891e..420707e54d 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 77451fc1f6..3b569ebaed 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 6991c83959..9f90b074c3 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 bd8ce68c5f..5a99d30f08 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 5fcbbaf1ca..dadd528c64 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 b05be45e79..f241b79f26 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 ccce082044..1c748af857 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 9794095217..624f23d042 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 188a4ec99e..b26379d576 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 1a046c4a05..66e791e627 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 0c409bef3c..8e4e7e560c 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 015e4ad81c..e6fe5707a0 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 d0e097326c..4ebc4580ff 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 1c748af857..3d64aaf3be 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 624f23d042..8e55bc2a4b 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 b26379d576..c97703f381 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 45c5474f27..b98522feb4 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 a04f570d36..430720785c 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 5bd29042ea..788076a7c9 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 0000000000..1acd0ef044 --- /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 0000000000..8f12ae96df --- /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 cdb61c5910..e13573aa77 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 d80fd3c533..1e4c39f3ed 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 62f374c888..8458c8351d 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 3a7211ab2a..0d2a19ef08 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 d1bcb600d8..8691dc51c0 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 ecfa2edbe5..5b5dcf8f3a 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 d463231ba5..93b781170b 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 1bda31fc6b..d0d8e4b0fd 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 41f7e29b40..b559fe5029 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 0000000000..0a01ec0b2c --- /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 0000000000..861d9c1327 --- /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 0000000000..7b7f7aea9c --- /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 0000000000..0732c1c5e4 --- /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 18b5e06081..f6f3a378eb 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 49b77b829b..ba5b9f294d 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 d463a64efb..1b2daecbc4 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 4a93d96fdb..b82d99f87e 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 a6eefbcc54..0c2ecf9edb 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 ddca023d72..f6ef9e703a 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 206a1ec299..a80fc19406 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 807406d0d0..63997b7960 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 2c5717e72f..f23ba9df90 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 0000000000..df142bdb31 --- /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 0000000000..a776c8876d --- /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 9336d14092..00890a786d 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 0000000000..5aca06df51 --- /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 e6cfbbc629..fce67f71b2 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 2ab06e2f6b..2a32ae89b4 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 28bd58cfff..48d9a96a48 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 0000000000..03ddd0a432 --- /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 bd60e1331f..fc19c889d8 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 0000000000..893aba7736 --- /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 a7dbd48608..569457d291 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 e93f9ea8b4..5c9c69c3ef 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 0000000000..180a00188c --- /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 0000000000..b77198fa9b --- /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 4a27d4a7f4..73002908ff 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 0000000000..8e842624b1 --- /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 ffda0e96c1..a80136b3fe 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 0000000000..f018a0c17c --- /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 b025253cf7..e992c3164f 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 36da85d6fb..ab52f2b23a 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 e992c3164f..39b9d1efc5 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 0000000000..7bea7ed88a --- /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 fd0945655d..904ff29cb1 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 ac7e53826b..e6747fee2d 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 e86de00b59..4a960a6c88 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 62d4650045..7a3e1e8d52 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 5d0fee65ae..f48bc28c77 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 9cc794380f..1b51d93ae6 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 13824dff9c..c0befe8e69 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 1f1466981b..94d78d6287 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 cd77bce101..72fd0c1782 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 af7a3ea5f6..55f455ad7c 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 d92759e5ee..798d7e7ef8 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 39b9d1efc5..25d76e07c6 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 4a960a6c88..7005fce63c 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 5c534cc415..d499bc0c2a 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 922a4957af..fc089e64b3 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 6cddfc1574..116aff4ee7 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 e13573aa77..dd33491e2b 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 d5c7a53418..57ae6f0e26 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 3b73caecac..f088a25757 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 7e1b3eb3fb..403075989e 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 c09a1aca61..9e09ed06c4 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 9a302fbcad..de9da698c7 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 72dbd38a41..3b3d3b9cd3 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 25d76e07c6..c05a5c178e 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 5c9c69c3ef..bf7ffbc4d9 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 aba6ecfeb2..afe9e13037 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 621304793a..e2af4cf05e 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 f27d7e1f41..a6752d838f 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 3ab7e051a1..ce0c929ab9 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 9de4f928b3..f5efe23327 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 99cda9cb41..71e3ad8680 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 fe6f7ab0d2..8cfffc1722 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 ba4342ecfc..350c35fffa 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 b32daf71f5..745400e5c4 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 10efed24bf..fc62ef880f 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 183897d306..5c6fbf7173 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 cad3ecac42..c96e6e549c 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 c6946ab612..710aa43501 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 58d94bb0cb..31d8b986d2 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 3f7db674fd..7894e74b1c 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 1b2daecbc4..7cd82ed793 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 517170fe22..d2304a7aa6 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 4d89f5ff8e..3d2f835842 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 07b7c6e997..030b54a1a6 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 4e2aa0414d..120daaa8a5 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 b5d5c15850..2e63c8663c 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 989d86dbc3..53c1d3e0b8 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 1b6b033519..5f69c1236b 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 9e523c6729..70be518057 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 c2092c2016..25ad45ddda 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 02f07e5d49..d81fdc804a 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 9c3e818e69..e51a099ba2 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 2b185cb1b6..68cf7ff847 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 788934a7e0..6a777265c7 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 c0052c356b..532c08a968 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 61bce851f4..d149fe9d77 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 a4509ba68d..58328d973f 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 81230eee72..6f084a9d48 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 a705a88549..07de20e7a1 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 7293e8f229..8d0594629f 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 3a37b65b9d..f0ce00ca7e 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 67b5a23f65..68651936a6 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 ddc02187c5..4024d1d0ce 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 f23ba9df90..4163b39308 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 6c6db94815..6fa1f260c8 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 a786b0c74d..56a2070647 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 0eabf0ed57..86338633f7 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 6f5aaf434b..8ba71cab49 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 1d91157645..af124ca3ea 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 19ec431d2c..e44d7a3f9d 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 9317331dae..3bf4555641 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 0000000000..303e2c099e --- /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 0000000000..908d0f7b17 --- /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 0000000000..7690efe94f --- /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 0000000000..97e1c1f282 --- /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 ad456dd28b..3f9e9c4e9d 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 db5745ca09..10b0532a53 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 0156b58c9a..f3c9cf9588 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 0000000000..c8daeda3f4 --- /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 5aca06df51..44111d74be 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 0000000000..a456027be0 --- /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 0000000000..cd7f633f32 --- /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 0000000000..aa8fb858fe --- /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 250a5509c4..17cdebd3f8 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 a1d0f36476..e64a23873a 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 170faa197d..a9d8b8c899 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 eb396428e6..d5b6986e9d 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 80e75bce40..f295b0d926 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 e3e12e4a9f..384bc3d074 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 66b21dbcac..8527a5d553 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 7c774ad8f8..8ccb2ad12f 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 f80d63d437..584255764a 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 d944ebb6eb..e56580bceb 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 b3f4a68e37..d35e7f48cc 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 bf6db55a2d..e4d52aaa3a 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 27ab35dbb3..266cb150e0 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 57da696007..c75d9c840e 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 6746192b84..8c8961a153 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 183e700885..121ea7496d 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 3921413fd2..80ec35f5f7 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 65b9232821..93538f2b00 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 0000000000..33a019b2e7 --- /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 d32f55516a..041c0e7653 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 f93d519035..89a3065bce 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 8527a5d553..07dacc288b 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 80ec35f5f7..b22eff150b 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 94dc816e03..c5da910fae 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 33a019b2e7..9082337ccc 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 ed699c8ede..258f266ff7 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 8722d97e22..e6dec7b8e8 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 c05a5c178e..2a502a55db 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 8c8961a153..89f464452f 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 63476a9b71..4e88d7083c 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 f6fade69ac..393a251bb7 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 2a502a55db..940176538e 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 bf7ffbc4d9..4674d5cbf4 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 e56580bceb..9eb9a741da 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 1c153ca825..4bc8a956f1 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 f6575ac840..663d5dd89e 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 4d81108c5e..b808dd0594 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 fede00cfd7..85ef005202 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 f246c65770..bbbfb75a53 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 940176538e..5e6e5c8b56 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 4674d5cbf4..7b9665462a 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 9101e342a2..3ae3c64986 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 f78d88ab3e..a9d7f0ad5b 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 5e6e5c8b56..6b323191e5 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 7b9665462a..96a69be478 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 82287877ea..c9f2c27100 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 d438f94f4c..5ba6f182c0 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 d977e24bfe..ec100733a5 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 6b323191e5..8c1e230759 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 96a69be478..109f387dc7 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 a95f77ab36..867a104485 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 cd0cda6812..c03f05fc0c 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 8c1e230759..4465e3b2a6 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 109f387dc7..a982e2b9fc 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 acf72eb254..f1f4aeaf0d 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 e6c574b7b2..b5279fa3ce 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 0000000000..674a22993b --- /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 004dd36ed4..1bd44959ab 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 1517f12f52..3b83aa3774 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 9dec8fe0c7..0790ece933 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 a81696f6c0..3e1e790fc0 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 87f55fd6b2..a19f42d7d5 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 e415734bec..2685064a94 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 7005fce63c..9750e37f32 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 f48bc28c77..fd17d7bdb0 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 49bc626a95..2e2f74828d 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 b7239c8bf4..32474881a8 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 0cb7c108b6..216ee519a3 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 a80a7f2e0b..c77d1eec16 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 4465e3b2a6..d8edffe293 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 a982e2b9fc..f4be0c4096 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 7e16a9fc6e..5229881fbf 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 73d5e0be45..7dc5d95853 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 e17869f6cf..999a62b3a8 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 e5e1f9061e..d50cc20c1a 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 8ace9070f8..7c5e21191a 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 bd54f42fc2..37dee08313 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 1c7c8bb4a9..d6effc7eb8 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 7ed1e62ab8..1631038f81 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 e4acc2f907..fb5f8cb6ac 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 5a42ef1c8b..8bf2b77fa2 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 220228b657..b032ca30fc 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 9e05b83135..db4dfc3866 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 f1a27be83b..0c1ce2e958 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 0847f3fb90..6648333bb5 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 3daf0bac82..e9b9513479 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 d52c0867e2..9fd99e993b 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 ca166aa793..2ae3de4981 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 f1fd67cc4b..2a13283738 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 81a54a182d..afb7e23e8f 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 2d119e2cf8..326ac799f0 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 4d984ed682..34e9c5fee2 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 cf5b2e374e..ff65658073 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 ac15838824..bc6cdbe8ba 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 79926cf1fc..f2cb29515b 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 7e41d5af9e..9910fe42e0 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 27d0002470..0986362ba2 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 99dc5b0d49..d91020c7c2 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 29c6756260..48423d08e6 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 93aeb0d28b..7da4da9c05 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 c0391f17f1..f457ebb3d2 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 3a4919daca..c78ec6ad69 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 b18608587e..fa33b0315c 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 d8edffe293..928fefa510 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 f4be0c4096..c8718f3852 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 e35035b8fa..94a8f0c8bc 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 249635f9b2..cb4623cea1 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 c258101da7..8e323c0a71 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 9fa156e0b2..4c78bbb23d 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 402fdbd071..0b86a430d8 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 99173c830a..94a8f0c8bc 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 928fefa510..e6192d5534 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 c8718f3852..079cbc896c 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 cd43659fcc..dc046f718a 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 aff294beec..4d7280a6a9 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 f1f4aeaf0d..3bae7386c3 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 dd33491e2b..cbba7cbdd5 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 47c6f4cf24..0f63039be9 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 0000000000..f02ede2d94 --- /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 0000000000..1fa96e6a98 --- /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 8d432740a4..be57b172f4 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 5e0c9f0405..f864a4c205 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 0000000000..e98bea189d --- /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 569457d291..521e75ab36 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 079cbc896c..5c6c0801b6 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 0000000000..c2d6d8ef37 --- /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 0000000000..9a99f5c14f --- /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 0000000000..837b90ce30 --- /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 c3fc9be6d4..5d88ded9db 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 f0996f9a52..f4e999225c 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 0000000000..872b5b2e2a --- /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 228074abf0..30dcf2793f 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 94a8f0c8bc..df28c6936d 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 2b7d2296a0..152c757424 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 e234c2b1c6..4352b15b8a 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 047f585a4f..0c9c0e65ff 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 3bfc224a73..ab54e19111 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 20763dd39a..51f083b7ee 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 40d767728d..82b7e1be03 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 83e1337b07..d11f8c91fc 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 2807129126..1bf239852f 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 fe7bca654c..ebe5f73669 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 4e086978be..6a3dc1f594 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 86eb3919f0..28746bbfbe 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 0f35cca5f0..6bdb6d0d4f 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 8b5724e014..5455bd6f67 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 209bf71e59..144836bc57 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 52cbe90640..36b4037f70 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 7d8aa104bb..9071da9707 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 55309ea8b3..4a24e97960 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 7ac98f284c..04acf6a9dd 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 11c31107ef..1fbd4885f4 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 67dc07f68d..7713354b14 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 fd7496b131..bb5adb943e 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 d7986fbb5b..fcf61dfe09 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 cfd1cf2a19..6f3e58d4ad 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 33663f121d..9ae61ed9b8 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 50c8790777..c351517753 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 95d2e15a51..9b9b8157bc 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 824af44168..268ec581c0 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 b5e488cc19..40f27135be 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 e4558b103b..fb36a60eec 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 7fa391e806..1cc0e16f30 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 fb57040f2c..b202ff8485 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 b8d18d9083..8e4c712e8b 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 c0725219a9..efd00b3da1 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 41c7df7889..0c0d6c53ed 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 cbba7cbdd5..fa7f6745ae 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 144836bc57..ad4d30358c 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 bd90a87db8..35f21ef3e0 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 ef24a51be8..15ae5321bf 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 a289004ffe..c501fa7c12 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 e6192d5534..38133b1a47 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 5c6c0801b6..6f013a52da 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 446fe898aa..d9c87beea5 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 50100d3625..631e6e9d70 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 39443c3fef..991be0bac5 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 03fd8400df..c3809f76b8 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 6ba301c01e..bbdb8a8218 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 8cb4a0b963..2cfca8e6b9 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 802b7968ee..79684bdeb4 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 d0ed9a9d33..a2b8f2e9ea 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 5c1385c6ec..162d6400fb 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 fb17a8ea47..c0c0c22f56 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 d804726541..8e35b091b3 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 8791e6d864..86c6a2d2c6 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 2ae4e632d6..dd31116212 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 f38836c041..02ccf930c0 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 3cfe36b322..763c22499a 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 85413da8f8..57eedd7885 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 da8c491845..07c77b806f 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 04a9f9e388..4479e269e8 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 e98bea189d..d20619c3df 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 c14903df95..22df2e88d7 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 eecdecbfdf..06bbf1b764 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 e47613e17c..f456809147 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 d309f8c9c9..c16aa9d52a 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 fd4873c808..9b21c015f5 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 6c48024efc..e165b66f00 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 735a9bf58e..2293be4b24 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 33f3b4229d..95497b8bf1 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 4a3e91a3e5..1a477ca4d5 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 e0a5a477ad..254229d091 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 6bfda8c31d..9b56bc9f39 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 a6eaa488c6..535c5add3f 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 03c46f02ef..0370843854 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 36272a3de8..85d1284459 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 987e490791..960e2f22af 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 00d1ab1828..0c1c50e493 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 ed557133a9..65ee5b59a4 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 5539c6f82d..14ebb5ecb9 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 9f402a7d1e..bad618321e 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 faf463ea8d..b0571bb7d8 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 353b1b8563..809d87e13c 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 7951df50e5..784fa3d005 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 9c5ea29189..46dd3f25de 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 93ec8603d0..62537be602 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 2442fa61a9..0519eec87d 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 3ec324f9cd..8c1078fb83 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 add0ad31cb..dfa66b5844 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 ee4df700f7..c7565881a8 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 7bd67a7a2c..13771825fc 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 8af5a5ada1..a486772139 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 28b404acdb..12bc234fc4 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 67031c4171..1d92864aa2 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 40295c74e0..4d55ff328b 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 f2d38a1dc7..e269121086 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 a23c2a9184..4c613a286d 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 9f23f05689..620207c14b 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 4c70652219..185e9ab549 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 abf47e5744..d0f343a21f 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 9fc47504b9..2039f3f39f 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 cbb63cf822..53ba28972e 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 184b7e3894..78471e703b 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 c77d1eec16..0e6a005d3e 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 00f383be50..62ceae7753 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 7cb14b03c6..7af3fffd09 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 0ea8a40bc0..cb1cd5df8b 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 419f365033..10735b7f45 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 300c9b628f..d111aa9583 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 6d53e4f12a..e50a20aefc 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 f8e907b46d..2c571be1a0 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 4e7bd5729f..07ca543186 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 57dd0b709b..f580e7bc1d 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 96d24139c2..8e4acd1ad9 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 5d7ddc8b55..354c69cd55 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 c72ec747b3..8afa6eaed2 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 477ca7eb5e..5afa10f3aa 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 cadfd03e9d..a5f0c6ce38 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 91950f6236..0cd5c7d8da 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 0d6fc42d1a..c0c77261e5 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 39dc17e66d..650f95198d 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 646151a522..17a390fb57 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 7842f858fd..fb7739546c 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 f0a38bcbc5..7d55bd448b 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 2aa0eab328..47157e64d9 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 9e6a0cb270..5346e2da3a 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 1e6700267f..bacd16f5f2 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 5ba3fff7fe..4261608e24 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 8bdb3ea90b..dc9b4833aa 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 fa47c2819b..5c70e37ddb 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 3effdbc60d..a3b34456b0 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 206a1ec299..ef942394a5 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 7bc25726f2..4b257eca74 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 9c5af45619..8692c42127 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 fcf7305d71..a79bee5ce6 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 2fde2782f4..697b1466ef 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 83466327da..2952c8436a 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 e5491a8bbe..fc7f189bd0 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 92f0fd1946..66ed7edff4 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 77443b1ee9..ff7d2d82f0 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 bff5dc2e68..44d3ec5f52 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 1f05a1c7a5..f905f7810d 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 7195cce2e3..10e7e2e140 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 6dff7c00ba..9ba9bbf49c 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 1707285025..8494f350b2 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 403d1980b9..7d55b1f304 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 71de076478..8a3d44f622 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 d3af47b537..0577fc7d24 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 8d5042731c..d6dc5a3af1 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 537bed16a7..8c17d68388 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 1c8aadc219..7ffb6dfbe1 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 94a8f0c8bc..3135705062 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 2db9e0f94e..015b24848a 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 650ae3edd4..ba02a718cb 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 5399d5176c..fe4b8540f4 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 74a72fdd97..50570f8f39 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 81308ba18a..2b6dff2c0f 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 0422919c1a..e5b81fe2c9 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 316fbd946d..fe12c6ceda 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 673fc6f54b..d511994995 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 77bd125003..49d9e2974e 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 697dadb4c7..65d0462486 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 53a32812f6..3668209ac6 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 61cf5a2fcb..5c66562cbb 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 a12fce67ff..11447a72d2 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 893aba7736..e2883db8d7 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 e353c1363a..fd9f4c9824 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 19f4eb0da2..f70795f2f6 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 868fbbed55..a4bf785dd4 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 a239de65b6..e5ea812a13 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 3ef76a5d20..f5110e7bf8 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 ca75fff073..c766993d45 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 881e97bc9c..cb7767eba1 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 628c0ea5a0..be5aab88f2 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 b927e6a563..700fd26aaf 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 d8dec2c40c..17cb2ad85c 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 4e656d3556..183892042b 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 e7a55c55f1..ec4f7b41a2 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 6f9c844d5c..a3773d8395 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 d4b40817cb..84ffc93993 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 9f40c4babd..908a122daa 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 dde66b8e12..1f69203992 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 0ab731eaf5..f02c5cebdc 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 a015ca3077..99d21c2886 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 ddb03a135b..393d7f6b7d 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 b2f669006a..8c3b2e9aeb 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 29e3f342cf..681acd6101 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 7763ff04a7..f7431ee79f 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 75c65f01e1..df5855b0ce 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 4a5fa763ea..410553fac9 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 ed5ec85a5d..acfd480e06 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 e8daeb22c0..6b83daece1 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 f2def50d06..053078c203 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 908e8f0fbc..d7be7f9248 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 c0c2a35081..1cff6db701 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 385334c854..501ca5f436 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 af51aca8af..e3e80942bb 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 9560dde6b3..e27cafce1f 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 ed65a5df7c..cb75480e75 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 89b5ae0c4a..de52e9fe28 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 e0c1b6d6a7..f7a32b0983 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 eefd4526d7..f2c19a12a1 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 d086aaca39..59b0c47ddb 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 30980103b3..7413799970 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 4a371c706f..2221106987 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 590f766273..1e9e403b00 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 b840913b7b..b75600bf2e 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 9a59e4c200..7a40f7b941 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 5bc9efc369..7b40e7ffab 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 398927d370..6d43dd7849 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 9b7b3c39b0..43fa21ce5a 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 e9e6415518..d03b6c3032 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 c1ef5bb792..04c1c0eac6 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 00d048c334..d19eabc26e 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 eb3274f19b..1095136717 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 710aa43501..4c625cdaf9 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 749ba7d9c0..9f20561b9a 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 6dc6ae18d8..fb818140f8 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 02bbb75cd2..981bb3f877 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 e449f668fd..806d986f85 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 bd0dcc5fa4..5686ae42f1 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 0e2e82437e..8f8a98dc28 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 d91f226a7e..f40527697c 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 69ba6b024e..7504155ed6 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 690947364e..d8c1bd75d3 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 eca46d7db0..39c073ad5b 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 974524c932..62d7bfac76 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 519ecef52d..704ef78465 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 d08a5715a8..1687e39368 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 e09d9c0d62..fcec0623ec 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 00ef4c7180..0fbdf397d9 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 b33e9b18da..ab56e87215 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 727b67e324..c3090fdd2c 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 ef485ec610..528f0ca601 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 b559fe5029..62507451e1 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 b364a45c34..697fb332c7 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 b11493e337..3fe44b47c1 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 ae3990c31c..fa22af87cf 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 0453d397bc..46079d0400 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 75b9bcfc1c..f5eb89f9e4 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 75c77d9481..a9154d11f4 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 2e9c97c823..e94b35dfb5 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 7e2f4f1ff6..117bf40d27 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 492e147135..ae3b8cd785 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 85918d7c71..f2ab2c7d5d 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 d99bcb9073..f5bdf90b9f 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 7846d8173c..010f8dc827 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 d779799791..e329f1208a 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 7c7d10f47d..c435eedd3c 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 66934d7a98..fb22747348 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 070eeee8b5..5a08b7f07f 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 02f2590042..0c50069f7d 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 30d501f1af..2749cd6524 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 0a01ec0b2c..14a73c551c 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 752593ce29..d325b036ad 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 6ee4377db9..90571a9c6d 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 762c99ec4d..3ac89b1c96 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 4e1511b2d2..55a12a37f0 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 a7f20253ef..f942600010 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 2a2a1fcd07..2c50b00fc1 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 99c74c3e5c..cc96048b37 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 e8682a0188..1784dd5515 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 6511c7b6da..6b4031efb0 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 e40926d4a0..eb4169afe4 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 3327e34e76..29539f78ea 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 5cedcfef48..e5b9b6f64c 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 a752b79198..12e125f4f6 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 89021793f9..e0c0c8ba0d 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 96638ef08f..27a4106f3f 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 41e1fad412..bdecd6454a 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 30a4cbec6b..53a12848c0 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 2331e57c6e..30d5b4b602 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 dd722907c6..b5eeea4685 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 ec484ffc0d..e02232f027 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 b47ddca4a2..6f696a7b1f 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 939a9a904a..ea7e20a920 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 a25f5dc157..adee951492 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 63e1d99f7a..d4527c69ba 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 dc5717539a..bc26b8f5ff 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 720400e72a..efb460f0e0 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 0216298089..dd9004a6b1 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 4a593cc560..b24954bb95 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 d2630b95c0..5ce4086ce1 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 9522e350ee..65b6198c9a 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 4795267cd5..e7c68a67b7 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 f446bf7390..1e9fe221fb 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 d34169edfc..3f71608800 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 b57a0e1579..0039e484a0 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 68d714cfc1..2b21e1c055 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 da1e173b4a..780599c216 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 607454f440..93b9067414 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 6447926f64..7ec8e2418a 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 6d09fd6ee0..f62d3de925 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 a13874b367..22de0b870e 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 3b21726bcb..6d4aeaf21c 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 88be279ae7..6ce77e0cd9 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 ca4d0b912a..2b782dd5c3 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 ce8a3ed9db..31e478697d 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 3f8e8444cf..ae69e238ff 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 18f5d043db..1696fb3d6b 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 4de4190d05..7187dfd0e8 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 2a99430e43..cd3ad4ba29 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 c5d84f030f..06429d200d 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 f52bb6697f..f82c899184 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 1539429d0e..0490f2f7f9 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 df9fe8866a..0edb0b06e2 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 0991c74b0a..75a12da869 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 5028a84eb3..ddceeb5c5d 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 9213007e93..434c300718 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 c3e2a40ab1..bd9a4a659c 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 4cca42afbf..425cc1bc94 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 ae8b829d56..0a5e46514c 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 34490332c1..4b915da356 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 6febc6ec20..f7ee20987a 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 e5c27bd393..7b3b4bb9f3 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 2aa3868895..0813701928 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 1c6f9224c5..e4d6c2c823 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 bc8f90057e..1054d22b2e 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 0f878b363c..1774198088 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 b69081286e..5ad62a7877 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 45d98e64db..74a24d2f91 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 533d46ca8b..a53edc2ab4 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 61d8bf3ae1..ca258dbc9d 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 e1f01d1567..ee6ddcd32c 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 4f9389e7e4..676f6f9dee 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 2f68fe4332..5adce28ab0 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 dc6f2d51ee..5a0255e74d 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 fdc7b87aa6..59f8b132e7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 b0ad4660d0..b78b8cbaa7 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 561b91799b..01cd9146f4 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 d63bcf9acc..5159d8b9f2 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 8d34eaaf5e..94e2e76d91 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 32c628f0b0..0a86c59934 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 31d8b986d2..7f47a67ba2 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 6b94dbc53e..d7191e0a31 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 98445345f9..1c992f4351 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 018bb9d6a5..bdceb09dae 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 514ad6786d..bdbe41fbcf 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 449989bade..51b6add6a9 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 fc90b3e8bb..6a0eae5d05 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 d0497278fe..67b85faf80 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 193b9a46e3..2ec3e6deba 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 c56822ba5a..83fbfa0118 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 b391af0e60..5ca4c474bc 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 21f33d120f..78e4e20008 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 f238b00e84..7410a79bdc 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 b56cb0c5b7..cc76571b01 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 c5404a173f..a86131723e 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 7894e74b1c..19a774fe17 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 608e12d020..4fb4f92876 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 b6347e2174..ac8538c694 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 3f303140c6..e3083687b0 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 648bd3cfd7..ae2da8858b 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 24ee0e2412..c19c50381f 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 10fc8c02d6..852933c620 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 1ad7a446cf..fb04b498d7 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 dd1a63039e..cc53bafb57 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 453c8fa364..10e9fb563c 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 d9e3a40d30..578e642d4d 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 9d66831b91..a41e5ddd65 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 76ceaf7cbd..c208838ed1 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 41ecfdb80b..e24c29a86b 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 837b90ce30..9332b67d23 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 0000000000..7c24e94b55 --- /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 0000000000..0468cb57f9 --- /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 0000000000..8f8c84b952 --- /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 bf59239609..6c5e66765b 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 7a8f754bd9..c89e9e5964 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 f99681d6d7..1067e85f1f 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 928b6bf353..8a01f48e7f 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 ba5b9f294d..5ee8c5eb77 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 d41d09634d..8c805c6cac 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 788d0c7400..6e5b1668ae 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 1907d65f28..88c6677f1e 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 838598f24f..768d76deb8 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 ec0f0d2453..9b3c75bffb 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 7553933b66..6ebb11f729 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 c72aab4680..4563adfb0d 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 46bfe61817..b2cd8953d6 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 1417720714..4d888941fc 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 454cde320d..3616626b12 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 0faf059c8b..b921f2914c 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 d22f128ffb..e1b7cc0aec 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 774863d4f0..8843d7387a 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 987a15f8a2..025fe7674b 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 c56bf118dc..1a882fd23b 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 26236397de..bf99c857f7 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 82f063b365..99138d8365 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 5d8ab23623..45dcec6023 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 ac1ebbeb23..d2f01f33bf 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 f908f41e32..2a386a2c08 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 2f8d4982af..f23bc80877 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 6dc41196af..dd52c6360d 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 987c54955f..a98a23c7f0 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 99feeb3c89..b004a2113c 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 40d2514b59..95646e7c7f 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 91dafab020..6d11110f1e 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 66dc4ea8dd..28421b72e1 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 86fb32c084..80d59ed8f5 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 21c8e60518..e7180c39a9 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 25b9c10b2e..07660869db 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 f0eebf4b7b..a5ebfa778d 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 f1daff8306..0149962a5e 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 91c428770f..dddcb78690 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 7f55015565..f51d51301e 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 6c733896d2..ee5fddaff7 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 c4399f95de..2dff5973a2 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 e26a829480..76a9f0d2b0 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 85d1b14484..2eb62fd0a1 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 8a1d19c0ec..1595f47e55 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 da03eae701..a44b3d91ed 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 24a7215574..9fde52f421 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 aea55058d1..c712eef688 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 372a9cf076..e430e4135c 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 2f2982293c..9d0e96167a 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 d4f1cf4c1a..906f939166 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 711ac32039..b95cab0f44 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 cf89911071..7ff68cd7fa 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 dce3519f09..5b9b095acb 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 cf5f42338c..6c94fe0980 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 119d172690..e3733a4fcf 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 5aca41f7f7..5844868a6e 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 4e0b1ffca5..ee5fc92391 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 7cc44d7038..d616634fde 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 18398a2b04..8c3d92edf9 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 e88afa7cae..c5e56bc95a 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 962f9ebe42..699ca41360 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 55ac013f96..db6d5c7ccb 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 7c9fbe6756..c33d4c06e6 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 a798ead27b..341efe2d93 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 510b75658a..f213befed4 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 0c0e272e23..6a39505962 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 39c78acc4c..5219caa057 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 605eb0b818..1da2a7921f 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 2655bb40f0..8449db1ec7 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 f08e3e277e..1968f3d866 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 9e484f5d38..8c8cbf8f36 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 65816e696f..75b269eee9 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 f1e18f8fcb..99adbab2da 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 882bc5de35..25dd407045 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 5359f92b13..f853e2d5a0 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 6c30efc594..587bae0d5e 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 2bcdecb2ae..03911b41cc 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 aedd81bacc..a3ed82dddf 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 97b1753ddd..5007a0e42d 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 b543a10d32..552e90dd42 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 4d96e606c7..9deb850b02 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 ed54abac03..dea49b78e7 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 e5b1683790..feee254793 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 e9859d2398..2d053c6b44 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 118c4bc424..7daaef692f 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 4c2f74440c..25518b5efe 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 a59b5215e7..3c77909172 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 89e2ab3286..8ba74734a7 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 bc61e82b98..56c4fdb377 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 43bd868d0c..d91499dd0d 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 5f3dc09cf2..c9b42c4911 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 d360254034..3d00dd1f6c 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 b19e42cdf2..d75a5ef470 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 edc31f4876..a96f48c970 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 923a4cdc81..c228878666 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 171aedc801..211c97cd68 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 6fc6bd8f81..129d96ee18 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 8c03db1852..13f65dbe41 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 dbd56e461b..b0aabd40c0 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 03a3ff4991..dff3b96558 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 9862d924ca..85183b917c 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 b8e5a069e4..75e271a297 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 180de6d8c1..80d1f452c3 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 f122e79442..36ab96cb8e 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 7286694fd9..5de83e5fb0 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 b0ddcbf490..c3f714bf77 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 2fa60015ca..f5338e85d3 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 856bb1445c..f8e21aa44b 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 b3e775fadf..ad5fe4dc52 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 1605e1dc8f..4540db5f25 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 6fa2b664a3..5069457a4e 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 d3a733a3f9..375a4b44fd 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 cfd4b7442d..5a14325246 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 f433a6215b..cb2118c3a0 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 0b8151d23f..78cd905a41 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 4b1d1bd86e..90d9c0b0ea 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 cdf98f5e59..ccd4903bba 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 683bb61dd4..c01c8a734b 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 67d4f85262..fb8f82824c 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 30feb3b5ac..c8dbbcbbba 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 3caea70c4d..fc77fdc9d3 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 bbdf68ed79..6e8a55d56f 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 34b4c86e77..b8ba5afe94 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 c9ab31597d..a5ca34285d 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 088b354fbb..005ce5910e 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 0f1247197a..2058992de2 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 8f0fdda371..d8f55ea605 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 5123dc2366..92898ab0f9 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 457b7d1b89..6bf389bcb4 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 3bcbb59230..84fbb18039 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 ee386bece5..a626e78047 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 544ab0ff2e..6be08699b8 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 fff54bb3f6..eb511dedf8 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 91dd0ea9a5..01c1097673 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 7cd82ed793..2732c6e94e 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 b82d99f87e..117fc3e339 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 ea65ffbab3..96c85cb482 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 d2304a7aa6..e64ddeeaa0 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 93c54b3915..dd415341f5 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 0c2ecf9edb..85463ad1fb 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 da7878e94a..e7c09897d4 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 31148c80e3..ced8249c85 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 72aaa84e70..5bb9a4997d 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 e12668f082..7973749aeb 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 00b9c1f437..54487db6c8 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 61479cb78e..a7675305ec 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 611d38ba95..bf52e00b9f 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 986795e11c..30264b9c82 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 a10ae01e25..b08157ecbc 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 ace1f4182a..18418b375a 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 6d800bb026..5345db7b04 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 f0ea9e57ca..1d73892e2b 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 3d2f835842..0798e8ae73 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 15927059d3..6cd97221fd 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 11a8aac485..f9c2683ff5 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 ada3149461..40c51f99d0 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 030b54a1a6..a747823968 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 3b1f5f8a8d..9609b0e64d 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 a29718fea7..a4176a4308 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 fd2764e5ec..7017d075a8 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 658a39246d..30778b4490 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 e49671c88c..6c1d1c1b3e 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 ef01fcb4f3..a9abb4aacd 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 9fd9b61dda..a60aee6a42 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 3621cd1c40..941f04f5c9 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 51f0cd0064..996b9c138e 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 1173cc48e0..16477633de 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 529170b111..713cdd6ae3 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 efe69b575f..e9e02a6e1b 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 05b4ba9342..3787d37750 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 b7bbb90650..a13903a0f6 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 cb932a0d9d..ac10172933 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 a46606621b..ed813c9e50 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 f224d10092..ea46ae807c 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 8183f28aed..9a07b5ebc5 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 8183f28aed..9a07b5ebc5 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 22ea3d2e19..a793985702 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 b67d4d56fb..33e4ece832 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 4c5f477cc1..b577b02e25 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 7f6ac42d60..084db6adfa 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 af1237ce21..e7b2842e0d 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 f6dfc9399c..3d06f8cb9a 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 db41ee98e0..69db954c6f 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 c682c07a8b..2d06efc2fa 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 1dbf1fa0c8..199a1a83d7 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 9e1cbbb636..f5f1633dfd 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 41a66b038f..b3e07c6fb2 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 c106543e15..ff8394ee0e 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 0be75b94be..e4aef55135 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 89889fd604..c042737ff6 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 cc1a7ac851..717f037a83 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 2010495d95..2ca23b9c42 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 752acbdecd..d3a4fdc186 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 9871df0d26..5590df8dab 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 5a96b853eb..81b7a05690 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 4d23ac8aab..7b97ce66a1 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 c555a3e09b..a1d35e134d 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 6d70987577..d8bac88ebf 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 de754080f1..18144097b4 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 8840532889..c8e5424ee9 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 b6bd30f799..28ee1a39db 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 07fe5e1121..5ebf8da8f7 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 8a542dd0d6..7fd74e1d00 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 3cb54145ad..3943e5f07e 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 4bdc104e7d..e9c3621c95 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 98a9e81f66..bd18159b13 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 774ce1f203..e7b9c7db6b 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 f23f83481e..6e69dfe825 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 d7262f50ea..0847d858f6 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 777b66d5c9..cafebc6426 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 5099b26408..49b5bb311b 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 4e2a09c6be..4b7bdafb9e 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 be2500b38b..62cefda80a 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 d9de1368ec..a12229a12d 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 08e18b89bf..e83fb1547e 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 ab20a6ec42..a0919a7729 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 b7a1bb41f5..98fb3f6519 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 d26da82ad1..dce019b8e3 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 2992d066d4..fc31a6e1af 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 87524cd7dd..8776359503 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 120daaa8a5..d87d5004a8 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 21f67a9471..be74bc781d 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 6d1a80424b..25a2257dc8 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 fff92c3218..d721ba4671 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 bbe77a36af..1c2d53870f 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 29fb34672c..04462798fc 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 589de2b683..8baf1e12cc 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 bb8b291f86..d751f51edc 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 bd8503fabd..6fb6ef757b 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 2c4d16b578..db6c064331 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 614811db45..c7db0e1cc0 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 818783813f..f9567c9a78 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 39072f70d8..58c9624857 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 5544d2e7f7..988d789d3d 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 7f308fdf3a..6e783913f6 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 0950d52bd0..c37646fa6e 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 2ecb587f19..10591facd0 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 2fea66a9d3..c946ef74a9 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 ee1fd5246c..ab9bb411b5 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 56bb3ace26..94c9e1f35b 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 301239cf31..b23da4e97d 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 6658c3ac2e..b925aeaf26 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 bd4e7aa1dd..48d36c53fd 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 65394faba1..34650c72e1 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 660e0064bb..fe382a3905 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 d70be59afb..b674dc1226 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 da62172dc1..2004d82aeb 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 e1eb6ebd35..983ae0351e 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 3ba9029eb0..13bd7eb03f 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 a10e4d9e89..afcb56068d 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 f5bca5e841..e56b1e0bad 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 d52003d10e..7815379f66 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 2653060030..2e882321f3 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 2e689b5e06..c18424d542 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 e8465a5672..2c121e622d 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 81e363aa01..4179fa962f 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 9d7ab4ef2b..62eb49896a 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 e46fc4364d..8d01a111a6 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 ca05983eeb..0bf3a87222 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 8642ae7502..a23c9a442f 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 97e10b451f..e35b89348e 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 d809647c99..c8b723b737 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 1663ea4d23..768ef13184 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 f05b0bcbd8..7b637ee370 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 83850c186c..575ab28df4 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 c0c638851a..597381bcd6 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 a426b7a343..6952472fe9 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 40e6cff446..7910b39368 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 7671e250bf..0efc9044be 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 8fdce004c4..3cf4d12adc 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 20ad7b8b00..14a3681410 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 c3f1941d8b..abb3d98450 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 4ef1e528c2..30e3922f0b 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 bb56b4c815..78350fab91 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 86a4e67801..7da8538134 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 d33fb66f12..eb0248625b 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 d40d927ae8..7df7404d73 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 ddb3c3a36a..6c1725a16b 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 bdd38b8538..cccea2cb77 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 0da64fac62..fbaf0d676c 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 f9c8a21240..8192bf9267 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 376252966a..b2d8f845ce 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 51c18c764d..85d75c81ff 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 f727c8bf52..8cba52b959 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 e284f6c373..b94548b44a 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 629e006564..dd115897e4 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 9b6f770625..ce182a3f00 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 8f39309264..638c1615a1 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 ddee892039..3e1062e420 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 11d1aa3ff7..e797c38781 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 fe26cda31e..16c6ad1e51 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 fc349a0d9d..ccc9f5ac21 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 a0b8efcacd..ba4f87415a 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 0dd32f66c9..fcc37de1d2 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 0f82f93b38..b4111a184e 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 138e077d4a..80a08aa09b 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 32bf473ac3..3ff4a0c135 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 768feb8374..467d1139ea 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 4ae7a356c4..ec12f51429 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 88d8a82269..cf413a3ef1 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 40b4307ae0..0cb50c4e44 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 44a1839687..85b59110a9 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 2e6f8dc62a..edc8fcd19a 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 db4b4362a5..62475b88a6 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 c9852632cd..75d34e925c 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 f5236d1735..3f58bf5204 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 a0a2d77d48..962a417d09 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 be8033f316..003926d6d5 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 26fa4ec0bd..7459f7a1ce 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 628983fec0..f6aed1a1be 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 bb77e87f6a..8f50a6720f 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 4d8068c801..5eaac8bad6 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 8302d8b38c..914560f4a0 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 a56130b226..6e727e973a 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 5e40c8ec5e..7cc1215f82 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 b4fa669fbf..900f255e74 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 ebd201b555..10e6278ac0 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 1c2baa9e02..aca9bdb80e 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 7e4a85f351..a14be0aed6 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 27d223012c..cd168681c7 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 5f4e9d3e4c..afcabd00eb 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 37788522e4..0f46cdce54 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 4839167785..128f1ebf9d 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 bc229d190a..4898573427 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 9cb58b1adb..02061267cd 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 bc70e90882..a07665dc9e 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 e9fa25b30f..33c17cd302 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 2e63c8663c..354f50b2a7 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 c0e8750d94..84052396d9 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 7f1cd8c35e..5cc83d418d 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 0000000000..dd95b221da --- /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 88b8319080..fb36e267f9 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 fd2882c607..416fe27add 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 dddf7dc2c8..dc29217e3b 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 0ac8302389..4df27df0f6 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 ca868b8ebd..5b20c4efca 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 df104c5405..f98770a7b2 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 c155a7f611..27001b0d9a 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 03c8d0bce0..f6a1b7e4b3 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 8e8b050ba7..ba2831ad6c 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 50f31707a6..6299bc0398 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 0abfc0ef52..c49e8cd5ec 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 72caccf49d..a85f8e6874 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 75d925e2f7..1d30994455 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 2c073e1d04..20e7c6f60e 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 6a91abc707..af732d70df 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 6624167722..8fd4287866 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 56c91ad824..b0e270572e 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 21567b8f09..cbf680ffd9 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 cf8b3e5540..c7757eb8ac 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 40fe7f097f..d917ba507e 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 4d4fdcc650..f874e519f6 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 e9865b9bf1..4503700bbb 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 38da7b96e0..8f82f6a623 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 95e59cf350..f1cdefd721 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 ed8d33cc65..01aed49ac2 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 1bbc5e7edb..31e8c09be5 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 dc1dfe5e9b..f9517b8c00 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 5dac9131fb..d60c1bf91e 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 53c1d3e0b8..4fb7efbf52 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 f0dd8a79e5..3fa5fb59dd 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 931fa29596..cf26729c63 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 2d942bbc6a..aaf67ffe8c 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 eb354821d3..507b7c164b 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 8289be66d5..d7e64cdbf8 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 c7a690de6e..086f2032d8 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 bc8669086b..28206deade 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 45d0296b66..932dcf80a0 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 f8d018e1b1..1bd753fcbd 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 5b85611d5b..ebc980860d 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 12715a97eb..f77b7c18a0 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 8ddb5e6129..aa1835d13f 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 5f5acfe7cc..4dd50811ab 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 64f3dd000c..dd97a1e485 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 12f9425040..aa66e0b2aa 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 4e7ceb3846..ccb2f2054c 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 6c02b33954..6a87ebe516 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 a4366cb5dc..d1bb6e48b5 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 79bcba3388..172c6b26ad 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 249b47f9f5..1a281a0161 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 10d6f73e56..8daac5abd5 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 a4077ed630..bbd5d6f6a8 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 62383e43e3..9a543d2055 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 f344c47365..68b8ea0686 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 f4b90cc35c..59b9a9448a 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 f006832b5b..9a4aa3e80b 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 fc522a1a26..f567173702 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 3c7fb00056..581b988632 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 59f9b7be03..63bfc613d1 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 b9bfa2a3b4..35fbd15598 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 44377ce302..06f5c6f4c8 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 2fa1dfc9f4..bec6897ed3 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 6e9443af5e..8f9b5a1651 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 f7773f13db..0ac6edee19 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 27b6335c6f..eed200f12c 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 637a430a1f..e87ce684ac 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 04d5c01e03..a43b2dd19e 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 b390f2dab4..cdab9ab2b3 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 85f71d7443..488692028b 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 1adad3825a..74912d710f 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 37f5ef0e76..50e8242c26 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 490026b366..1ed4b842b0 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 04aec33b5d..b4378620b1 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 431c0e16e7..e041048a04 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 e72e99242c..23205426c8 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 20f21df5ac..5c55feb0ef 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 bc68c3ec82..a8a162e55d 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 3663ff0114..434a86a634 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 e56d41d4f1..77067ab1c9 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 88c9709147..30384a1a37 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 d18d8bc828..d86d0eb35e 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 003a3db8bf..d6a474f70f 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 c907a6bafd..79d0b591ef 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 c422c1768a..213a1c19ba 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 15847cdadc..0cd170cfd7 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 a9d3c8dca7..3ed0fbc850 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 41fafa5763..1a253b18f1 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 daab68f111..efb3f5deda 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 0a6fb79362..8c5791b0ed 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 2b2cac0273..31fbeb84f6 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 30c534b18e..8d5cec07df 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 a4cbecc581..f850c61bc9 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 4495dee078..adfccab84c 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 82160a4295..e6381bc437 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 b9763b61fc..976c744e96 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 1dcf264b3f..10d5a7023f 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 0b3d23bfa3..f516da66d6 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 03f265f271..3464e03e56 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 3e27c34080..d32e17ce6a 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 f46e74a35b..900b97c322 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 f895d28290..fcec44ea3a 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 6874256e5f..2792487359 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 a8c238a60b..a779d8fbe0 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 59396e3a44..525bc38bd0 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 1175597908..3afe70f570 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 c6b92e8308..5af610a48a 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 c93ae906a4..1f98405431 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 e53a91bcb0..41a27d7220 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 85bfc7297e..1200bb174d 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 d19091e75e..256b21f56c 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 a7ad17e6bd..dd420fc08f 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 44d814b9db..f2835c1803 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 d66e0eb6d7..64179ade0e 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 c51a69356a..e124e632cf 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 4c0cd317d4..72de59dafd 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 6e7411f28b..49fdfa21cb 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 e31f473c26..e143dd3302 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 35e7e24c92..8846d85233 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 0f74841fd7..2ecc8c3a79 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 dadd38c24a..3896bca385 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 bd0e947f1d..ffdd320ed1 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 5fd36f7a9f..1caf8c0d41 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 0a85aaa9d1..2a61daf25c 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 fb9eead7d2..433f318564 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 3e87044865..6c9242872b 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 75fcb2088a..1ed0392282 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 b3d1b9a71c..8780c8160f 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 cc338a82e1..f749fb21d8 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 3b23ba5eee..95043a6e9b 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 eb48768183..39ed17bcef 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 9842ae67a4..a633e68e79 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 677762c293..eb8969254c 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 0045b08cec..936cb10ce2 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 089435dee3..71e09774f0 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 b5a865b5cc..3adc8dc3b3 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 3f10f2eb37..c3bb9b1b7b 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 8604dda565..c60247a6e5 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 2610fe156a..3c8a87902c 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 7779c6e40a..9bffbed2d9 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 e652ccc966..efa2e69124 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 ef1a8fb5e3..1b1099f509 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 5f69c1236b..3eb56a4602 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 b65df092b3..1fd25f69ef 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 1d7c2ea402..df493fca33 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 5fbfba547d..9c2197ba44 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 ad19b589d5..37b580369d 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 06723a4bd1..965a21b892 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 7de81bfee9..0ede723702 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 2c9acc227b..c392b228e8 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 b25241e34d..5ba05b639e 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 f53d4d413e..41634ec4d2 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 8effcc6ab1..648ab7824e 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 b1d0fda94b..1dd99a1572 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 f4b95081a1..6e77b88221 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 12ba767035..88286d4281 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 f7ce9a67f5..5b714dcd6a 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 296159f2e5..9679e19fab 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 f79a9f5d73..11a0eb5ce2 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 b118783cd3..53d7bc89e8 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 840cbdf234..cebd8ffcd2 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 ad8f978bc5..ee7b32d703 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 960198eb04..fecd6608d4 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 7b90a5c5ca..e46aec1790 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 ae2b217771..34cf0a4f95 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 2d1dcad217..eb87d9de8a 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 aab8edbe44..a293b4297f 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 19bfc36e42..72b2aaf868 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 78df911c86..d0bcc4f61f 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 f34a21b789..d47cedda6a 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 488a09c376..7e0d87fa3e 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 434fdd2220..9ec47e600a 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 86c68a4cfb..8bae8adaee 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 4dcfda5275..216ba66d20 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 b33bde95ae..abf5f100fd 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 8e205bef43..ad1a304dcf 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 3a927a70e6..23b0e19c2a 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 f99efa91c6..147075c19f 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 c21e76a6ee..80955fa9e3 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 17c550636e..929fcf4088 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 9bb36f00ba..639633dc14 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 f201261526..1f77f9e774 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 20b3fbe21e..c5df274233 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 891564ea4e..ac6a232db3 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 1e0c8c3e9a..5fa28a09e7 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 2aacd9a4ba..a43e5f7ced 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 cc86f0a1b4..0f00578a96 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 c0ee3bc7d5..67024c0663 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 b47fd213ae..af4ae8a290 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 57484e84d9..75f58fef9b 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 6f03fecd58..2337638a89 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 1adbbe39f3..53b138535a 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 d3918269d1..06f55e3dcf 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 10c1666074..c425e515f5 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 0dcc0f029c..291e78095d 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 badd381f2b..40972b3b93 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 2ceb78ddde..928e9899db 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 4f48187b49..1688e3cb26 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 31e5f9894f..63d52f53b9 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 011060694a..728a0d7ee6 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 dfa463fb14..dff4929816 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 4bd26876ac..87779947d9 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 13142fee51..11bf616164 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 28326d9714..485c453777 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 f6e46e2598..55a48f1df1 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 46a574bdf8..4f35153669 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 ff0a8238d4..03bcb57aae 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 385fc128b3..73fb9b3722 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 c22b02fd7e..6a28fe831c 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 9f9b121a7c..5133b66cd1 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 c8a5fb4481..2103b6c38a 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 ab061ee1a8..f0350e8101 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 1d08296007..0c685c3020 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 553360d8da..bc4e518b1f 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 a16c60128c..442c5736c1 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 d1c3ed767c..715937b678 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 5bb98effb9..c247654c7e 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 64ca6da10a..7161f3b5d4 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 993a191ef8..be4faf69a4 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 d4e6e360c2..ffb8ae30d3 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 5c2fd47068..1cac51a839 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 f4e7775293..3a00a7b36a 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 70a5c8707c..a879b74fd8 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 00054dbc51..b35ebcd587 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 8d10e63c60..7d0691169c 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 60848bea45..3021d70024 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 4b88151f3d..ff079e0312 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 392c06390a..ac628f7b01 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 6cd2ab7d7b..25ce58b97f 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 4dd86965bf..7db4f98d7b 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 e5ace2e0d1..7d7d3688e6 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 b89296616b..a7009c5ebc 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 70be518057..826e7288ba 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 dea7dd9bb2..48efffbb7e 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 0987e11430..eb90c5ea04 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 fac6458c5b..f77038cb8b 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 f2d9441e48..5d742100cf 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 e98df7466f..5358c35652 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 6d4d83192c..c5b98770d6 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 b0d1d7dc3f..1c48ceea5f 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 da5d5e0ab8..6523d44639 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 549cd00e8e..29afed9c43 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 20ae78ae31..645c09105b 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 824f7c3fb5..7f6b8b9766 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 e1cecbe35d..c8c356e4a9 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 cfe1d347b0..7b1040ba5d 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 3e7105e8cb..c7a5528805 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 ec2dc29450..24ea5ce4f5 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 b54b552094..0c070f322a 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 e494a6b34d..4a51f55372 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 5bcd39efd2..1140ad1ed8 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 099d197843..19dde27a16 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 8aacc8e165..c5f01b1554 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 2978d2bbbe..574c9f767e 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 96d4991a5b..c0cae40420 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 9efacaf163..4eec6bc148 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 c758e9cc20..c3c273c777 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 7b237aecda..c452b53bef 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 3d47954323..94aebf8702 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 322c7e2f4c..70d07ba36f 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 b70fc8f05e..71b5505ebd 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 69f071bf5d..ed7dca2f48 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 50c753538c..1683d00b43 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 02716a96a7..963c23e406 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 b584d18e8b..2470fc975d 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 6d8b6b4b44..c734a9ccfe 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 33b9334830..49f910154c 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 7360908a11..7e320fbe9f 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 e44e818ea6..d672f73d77 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 e0ab5cddbd..45dfbbf8bf 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 c65a5277f6..6fb23ac800 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 3c15eecf6e..4254aa260b 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 6ec35452e8..c650796f23 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 d4f87905da..912d3e4b7b 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 b1909ca2ec..bca0eeec38 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 1d2331870e..db174f049b 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 59e402080f..eb4a68c902 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 20b209752e..4794b5acc4 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 8223616f11..9d69030da7 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 eb994289a6..8cfd35b6c6 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 a99011cf8b..f3a084e754 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 67f6daa846..b7639223f5 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 7f0566ddd4..a21ee3a53b 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 53ca9a3901..5364519638 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 69bb1f13c8..0f19738748 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 8837e501a8..d42001f629 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 e12789dcb4..148d344eae 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 30494295f0..20013168c8 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 995d677923..a00780eb54 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 a2816fa92f..e70a463dcd 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 33cd20dc9c..498d927ffb 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 479f6c6a97..ff0dadf8c5 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 41393acb26..d37ef1b014 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 aa7977f5bf..4dcd1d485c 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 b4b721b7ff..0c57e09b09 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 c0311b0f19..938d6f2aad 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 cc16ebc70c..39283a733e 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 d9fdc8f91c..4b58e4f9fb 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 25ad45ddda..569d4581c1 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 d2b9a1b176..eeeee01bcf 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 f7c1497098..02df0946be 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 fa98029f6b..3b4f99c6a9 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 4b8371fc74..8056e4ad5c 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 c2a7579e4f..894bdb6dab 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 605bb0d250..2b7d7c1726 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 0919e21161..d9d9a90386 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 206bd05a34..f7d36fc4aa 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 7aedd80b5d..fd3e8189af 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 0e724d62bb..07aee5dd62 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 c60294e21d..d404c85a90 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 61ff5ac5fe..3817766103 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 0487434274..c7b7857a86 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 c7f1af21f2..e35e02de47 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 2f47fcddf2..a3437c0100 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 f8ae990d36..6c7acc9889 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 ff3e2dea2c..aafc2bf1a9 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 da375563d9..6884739e81 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 9a4dd424be..4465c4f88a 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 78905da208..e7154eab4b 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 82166a1aaa..3bb9119a03 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 0954f3ff4f..787aade5de 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 1ba33b0e6e..cd75b53bce 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 cdde0f12d7..96ac18a3c0 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 f155e8fd1c..c21a0f6578 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 4c2b6268ee..4165e25465 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 c6a960f1a6..6925307e25 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 44746468b3..195cc64140 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 a52d101a48..a02b97ea04 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 8d7ac01c55..f75445e66d 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 19bc69b77f..0d047af61a 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 a346753aeb..cd54a59339 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 c5f2b4a2a0..faa0284891 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 c35d1eacf2..14fcfcd8f1 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 9f6ae9a09b..1921dbdf1d 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 9f012c1c40..30c4dfa4a3 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 4ad17ecaa3..7f08dbcaee 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 f6b3d85567..732c8bbc98 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 d99c31d2d6..3d894048d0 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 297ec922ab..151214011f 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 1a5c63f10f..ea06e4158e 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 606f6f9637..1d16002e29 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 17e4f7b8ef..2613b66eea 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 6e3a06ac66..db95d808fe 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 c7c9e2033e..fab87f065f 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 c2d7e0bd98..13b70516cc 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 16b192d16a..88aebcdffd 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 201e9afec4..be95e0e73a 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 5f28f4bde4..f73ca79115 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 53c248fe17..1e1312b096 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 260dbc4021..76afc8c337 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 f5476f73ed..7e1f32135d 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 c00c19be42..41340856a6 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 a4ab9123b4..494a7217de 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 b16213bfbf..02360d9a7d 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 48a2ff233d..299f50a678 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 6a5074c6e4..eb04cdcf9f 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 6bad10ed06..5362594e4e 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 de54ddb3bf..5d4bd86cc6 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 ddc91ae226..125ea33a0e 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 16a1b19ff8..05be972a51 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 e65286b5c6..52f89dc460 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 253dedb7c4..0e2cac536b 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 5dd64364c1..33a49773c1 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 ccd260cb1c..ef2d27ccb8 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 8b1c413b20..09fd044a1f 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 2b5b168817..a0f03689a2 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 ba6ee67624..5c717391c7 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 744a8e10c2..14e5b5cbb9 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 961311d730..2ddeb89d6b 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 00b9374459..aec784bca4 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 3f69f9803a..c37f8ac9dc 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 a3e755fa79..422dbc94aa 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 4866ace08d..7850a0cb0b 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 fa2f2e5574..1de7280fe5 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 0908374231..53a59c63d9 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 aedfc0c0f4..3b96ff44c2 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 c76064c0ab..65b36418d2 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 5e2f35bfea..c7ecdd85e2 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 0aa75438f7..dc48222b5f 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 5b37bde3ee..70d4247f40 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 a5456c7b0c..ef90886054 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 a1e1c20cbc..ae5c6ecb1d 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 26ff4b9dcf..d3e6fabb2d 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 4972c3d3ff..8cc1c6ed45 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 698be68bd7..593f41e0e1 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 97971b99e9..7a36a49f49 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 73d840bdbd..0ce1fd2eea 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 26bfa37d6b..8fe750b661 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 db8d67eea7..5effa2b962 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 c0a515bb74..80ce76009a 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 ea78f0d0d5..57b177c057 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 0647f2ecfb..d607343fe2 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 d14a2775c1..22a0d63641 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 8c8e30fe06..853b3527c9 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 e2a7f94b3d..d54bce408d 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 aa2b414261..aa4c31d0ae 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 146088b4ef..abe05d9c37 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 c9e6f046d8..81d907c482 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 49d1a82a75..44419d333c 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 e317741a0a..80f2612bfd 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 19a07a19c6..2425a37207 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 d81fdc804a..8b6ceb83f5 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 e1a2517e4d..c017f0a93d 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 14c8c8e4e2..9dc7b767e2 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 61cd469017..60c3894733 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 8bc26c300e..0469853fd7 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 0aa3c90eff..3ee3f7a24f 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 6e642b8593..5db8cf1fe6 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 fe0e7d0757..c111234ed3 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 3ba3207cc2..ef1dd82f34 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 9c65891d26..636a2dd869 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 4e45568ae6..f9e45c8af8 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 b0869df14b..f55a5d4ffa 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 6887eddde6..6ee3355dfe 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 fc5b81b659..72c0717d85 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 dd5592884b..8515995247 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 935693f87c..c2a8ac510d 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 683105db86..90b0574cb2 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 979ed3cd71..d4aa6099d0 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 091ea9bc35..107657e9cf 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 0e0c735eb8..3b0e2d4b9e 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 a5b6615638..e5e5c2439a 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 dae4b24de4..a5fdd0a5b1 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 46096bbe63..3d88caa84f 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 4d09e69715..4f2c6fb52d 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 8c4c45f9c8..d8a4c45301 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 659b11ae98..132d4f116c 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 077956287b..8e00d0bfe2 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 3c4ec66e9a..41ee9b5047 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 d6faf60d61..c93c6823e4 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 9c8083a1d9..7bf2889325 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 74e6b4926e..1560b7c899 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 9188b1f6b0..2e913abf64 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 e3bef7270e..d0218da5b2 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 2fe38659fa..ad11a9b72d 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 206702eb59..e9aa35f5d2 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 9e91de0830..d96a34454d 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 e18541fcab..e29c103de9 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 dd7ae5f72c..1025bedcf7 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 128db24715..d2b7e6cd79 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 efb966880e..62b767524a 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 883bb04282..57c1d1a8d9 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 077956287b..8e00d0bfe2 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 80188b637f..0061b9f616 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 e9f7aeb36d..bf8c63c571 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 8610351f43..f51ab3954a 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 58028d1caa..c3cf8fd8df 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 dcbffdcebd..01ab34b1e2 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 3f6c634f38..6be48c3a2e 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 4a900097b1..07f90ed2d0 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 18ffda135e..bf6331c72b 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 ae2e4e03f7..bad6552e17 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 38a12e7411..5cae304942 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 afd4fedc97..9bc3db4e6f 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 987c54955f..a98a23c7f0 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 934849549e..da52ef752b 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 e786e5ae84..bda9013f65 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 5ee001db3c..3cd84f50b7 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 5813d9488f..88d01439dc 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 c2c5042e29..a1905d3d87 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 283594a45b..4ae14e28ad 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 731371cada..09303c4d95 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 8e5c46692a..dc7036f8e2 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 9d2cf69200..264b3be167 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 798ae93d33..5184c27d59 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 6240f074cf..25c8bc48dc 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 77efc04b81..5a8f41fce6 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 d38b9abb70..a9e779c8aa 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 5a83b5cd73..4de52c75d2 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 282715ebb3..455fcf2d4a 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 28e9102aaf..46409ea5c9 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 5a605ed898..ec982acc07 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 0de30f0f3d..a02d1d713e 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 8cfedf3167..ba64432f93 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 70d2c6ef6b..99849ee932 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 ad2d37524c..9f36352003 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 e2f72db7c4..acaef8e388 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 977b69576d..d9d485abb1 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 d47f0dfb50..a527f2efae 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 acb8b51a44..ae4158bbc3 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 d6a43fc790..805a3eccd2 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 46b99e6651..5ade982afb 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 4931fcaf94..301a83c5e2 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 5165fec9d9..ef01256607 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 6e89d42593..04600d8dd8 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 c5614e1703..009048775f 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 7d8280998f..a45b078085 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 00b9881fd9..9b2bebe4d0 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 d726173243..5c1e3fbf82 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 267b4e7913..410585d02d 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 1f9aa1a324..c780f92dcd 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 2ddeb9a4b3..fead941a76 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 96d4ee9040..84b1c6f383 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 2dcfcde740..14b67fda8a 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 e8cba56a0a..51b5cefd7f 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 10d5183296..e65c05ab90 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 de36336f2c..ec51c7bcaa 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 284907b275..e517f81ce5 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 ede4601928..f3447565c0 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 454ad3ac09..dabbca15fd 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 5d88ded9db..6742038830 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 5f1f2fb60f..c4f01461d6 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 ab556519e0..7cdb01eef9 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 459eaacac4..b7ce182dea 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 ad1788e0bd..d6fbeb4cbb 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 2357aaaa86..ea43c2eca2 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 b6bdbc8b2c..7fb1e4753c 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 97d3056f60..b484370a16 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 1ac0402493..72224eead4 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 249fd6d0ae..5cb035dc62 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 f7bd64bc41..25104165f5 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 3a66a1e11a..893cf54081 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 c3cc412d79..f85226ef50 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 91e34e8290..1ba0877993 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 f5e5907f2c..45493bd79a 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 492654c660..c5640be83a 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 a163891c04..c6020fa1d8 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 8dc7c3bc20..7caf8d483c 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 e0b3b667de..3319539b76 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 89922b66f0..b1d656dc4d 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 9ccca663fe..3c30d0f352 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 b8c014c3dc..8d19882bb7 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 b9f716e8d3..0abdd92f84 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 336877fda1..db42824b45 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 fa04c00c7a..bde3e2099a 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 5bb4029dfc..940fb127c5 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 4d92fbfd77..7cef08a0e5 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 a09db3b02c..b1551bf364 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 26a55aa4ed..cb0dedc6d2 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 b80d9bee4e..ffe751bd02 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 9dc3d88322..9b0e0a8199 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 4a5bace592..82de0a6bfe 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 5293ad2a1f..2643e53db4 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 9f82b1a7b1..0bf1271e39 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 c90416b061..db4b9649e3 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 79c621ce12..2f2efcd6ba 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 5498624a06..559d95e05a 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 91593b2651..b491faec9a 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 c6e075683a..cffa27defc 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 979441f728..b51e0bf55f 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 eaf7601be9..a45936716c 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 6af3c9b063..86ee2099b3 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 4f90cf71cb..d4543a2ad6 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 7e632c8dd6..d06c9b64ba 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 cb2fe82129..705d907f59 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 c2c952d69f..5d52e28104 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 7448100158..21f0c84e1b 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 1c7b4e69ec..cfb0880f6b 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 a1545bd657..16fbdd8099 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 a0da84fd09..9266e13471 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 3ace7783f8..04cd775f0a 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 64069d4e75..11517e2cdc 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 ccbc849ab5..ef37d21066 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 a79c2e0caf..2d381f81f4 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 34dd01d06b..d9db35c07c 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 f411c06a3e..6447af84ce 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 ef9c7a40b6..49d7e1e23e 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 86d9fe877a..0d7cfecfb8 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 b0d721891c..d5864315d8 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 f3b7f4d6d2..139dc8bf3a 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 2b2269bee5..8438caf251 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 7e03526421..588700dd30 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 e51a099ba2..ac8476824a 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 02354204f2..d56b7a333a 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 58401a33d1..5498ea9745 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 32acc488dc..d4ab3aba47 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 08a55d26ca..2c02b2aa2c 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 e6017339b7..61711b5d3c 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 512d0285ac..25245dbb44 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 68cf7ff847..145c2fb440 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 947425e480..b76d96cc46 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 b7d2d6c8f1..3233430d8a 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 067b305b80..cae763b42c 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 3af9ab0072..be9de9cc94 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 08be66a896..5f018605d5 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 98345b022f..09102bbb4a 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 032dd606cb..0e5920c384 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 f82c832582..edba5dc17a 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 5181c37969..c69ffec899 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 c3f2601eb9..87eb976276 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 2bb3bb4833..7ecdd132bb 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 ba28d973ec..561d7418af 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 75081c62d4..71150762e6 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 61b4953c17..f3331e450b 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 e8ef5bd31b..2c0f9c185d 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 d83ee57676..621aee364a 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 99143f38c9..e364be3b02 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 2553e2d5e8..b7798bda7f 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 64fdc7516e..e918bb28cb 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 905ec3ce2b..96c9b6ef68 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 f897c67343..e1508bb06a 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 96a264fa6b..f6b52394ee 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 255b2efc91..cbadc37a6c 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 b4f940bc66..2768a7ed85 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 2f3ec6db13..a699228920 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 2e033280e4..6936dc7f56 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 a23502729d..8624bfc763 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 c78905b09c..a0ca32c0d8 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 ae32d43f1b..403ea8f0c4 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 d6a06ea9fa..16a843202a 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 e5f88b5384..f12ff5bd94 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 d5c93c3399..e0716dd707 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 1282708210..5b62cd4623 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 34f1d850a6..d2e0a2418a 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 492bf9010d..7bd4c366c7 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 a935e209bb..591c4677fb 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 bc9375d807..2eec5575ce 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 908394bcfd..a5f9fba3cf 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 e7901ba51b..65a50f70e7 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 cc5239eaf3..68da33e304 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 9c4a3a1906..75385aa8a6 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 2097d094a3..e157b8fec5 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 83e56a52c6..72a60759ae 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 13d2553b0c..142a87c907 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 5bddb53414..c1efff6fa3 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 532c08a968..b33163d99e 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 6dba7e9af8..723261e164 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 67418f616a..ee362f9aa7 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 78c825398d..7f7534192c 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 b4c10bec36..6a1b105938 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 5654edb08f..e9f6476f07 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 6e084d1a9d..b9f4c41692 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 77b3bac803..0a71a623b2 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 62da10e1c9..ebeb37c991 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 9a4a710e52..0681172165 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 a868f9666c..69dd4717ec 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 6ebe598e88..8c49004aef 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 4880e065fa..d4b784046f 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 611428432e..c5f291289e 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 cc2154ad9d..b21164458a 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 c0396ccb18..6c3e379c1e 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 7e1df67811..d687518ad3 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 20fcd202ed..c81c03bd71 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 a798de0530..5d29b267fa 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 9d4b84e9ec..383a7d4263 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 7a78029c37..c57ad99bf0 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 a33e892c6e..3edda00dc1 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 a00a130bfc..9feb395066 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 aa249f184c..2b2f92ebdb 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 6f22d2c585..5306d17ea2 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 2427a7ae50..2a2a194c16 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 82b614a8e1..26cce0fe77 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 3aea407545..69d250ad6f 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 b013fb3bd8..80a11e4f16 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 23894b20c9..aa71441b8c 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 d9f9b474f9..3ef9309c96 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 d5ea8d0bc4..7ad755226a 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 1e80c86e86..a69c443c88 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 ff3c150886..3aef44f120 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 d48b6ff13d..1e9eab323d 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 3752b23bbe..6df2a846c8 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 ff8cfd97b2..63420c805b 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 052557408d..fc12bb2d1b 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 8fb63ff18c..1068dead9c 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 c89a251b67..86116ef684 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 a90f7ff989..0221c2f02a 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 3528f1c1e4..fba9ff9e13 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 4fdef0a987..6e691c8403 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 c53f538799..a91681736f 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 25db0ecef8..ebbae39b07 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 26ec0951d8..b348b03f2a 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 123b03d95a..1363c39d8b 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 23a4c98a54..5d254874c5 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 2ca31ca189..b6fa617b80 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 2104ad9060..b1571ae751 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 90fa5253a6..2bb0cccc28 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 0b0bd45b7d..77eb3f8a43 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 0296d07993..1f3ae163c7 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 d6c831d5a0..807314ad06 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 5135eb33c9..e4590d8f9e 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 406250cd77..4b825f1dfd 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 8e455023f2..4be8656a3b 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 1f2a96fe5b..bda554b39c 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 4d7ef918dd..34c49f13b9 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 bf3c059f81..cd829c3f12 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 2393908e28..cb6285e479 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 7209bdfefd..17be05d9ff 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 7f8a2f2a09..909116d8fa 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 d7c1d9ba9d..f5c066ae4c 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 577f3475b5..afb9258cdd 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 b0befa80fd..955507c447 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 822447f353..f1cb6881a9 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 0ea648256d..4239648627 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 9f676e2acc..58e86a3d22 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 333a295ad0..826a6c4bd0 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 2912b7d730..0ab768ae7b 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 9cecf3081b..b60748ad84 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 3906f96a39..04db56d126 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 221d2a7a86..59875cbe61 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 1eb3b71c94..96e037ce72 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 ecd7f17c84..ced6f03440 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 b00c1b2e3e..6b97a4c94b 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 701ccf2612..244284995e 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 3a5f5e7b40..617ee8bf51 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 46d75a6b73..50c1bd8b43 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 d6c86e9ac1..435497933d 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 8e81e9e52a..a53a04a3cc 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 e93da557ae..4f392558d2 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 3e1d41be34..ed73bcf061 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 b8b2b1fc0d..4677c69a7b 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 2795137829..45fb05b010 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 97af0e8ed9..ae77202ec8 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 931d2a5557..00b5ec5d08 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 3284b581f5..bc53a164a5 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 52b1ec3316..2639d90be2 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 ac15a68bc4..10f635d8d4 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 19e71b5156..c7a20a8aba 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 c5e104694d..004fbc36c5 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 9ed3611da2..5522e08226 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 759fd926bd..3d0530c54e 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 c1dd0462f9..73e1b48b34 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 01fd9ec721..96172796a5 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 375a08d8a4..693079bcd9 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 5ea3f68263..310cf325f0 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 cfc3c290af..970d722fe4 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 3ae97ab164..02c4b631ff 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 6bcb737588..fe50470f59 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 2f7c4e5a90..6dc7f9f051 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 f915263370..1b0b909e5d 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 93412ca75f..c73eafdc26 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 98529a3381..dc2cd72d3a 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 fd0c543241..89a3c8751b 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 4428d7e186..1f06141472 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 5d86a36b94..e9a5835e2d 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 975c106a26..ca2468ced7 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 4dea652aa3..8230edd5ca 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 8f1f021caf..7d4fbb76be 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 f84225444d..ef622bb6b3 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 6a1ff24ef2..c9fcc2d150 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 2bab2e4300..9e8d91a887 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 3d1cbd41a3..2a6aaa2984 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 ddca4c432f..725ade01ae 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 8d9cb92e31..4b5471bc08 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 72255c695a..102d1420d6 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 9e8a293b4b..e21eb422a6 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 2f526826d3..b9594f9ec8 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 f26234e84c..6bbd3cee3e 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 5dd0a7aeab..3569cc2165 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 f16533312f..8d437f90dc 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 1dc5156f7e..df7ce90507 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 6901ed2293..c3c6adcc21 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 f4e2a3b1eb..5154a9c276 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 48682f617a..f482761309 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 182f06c33c..e9144a14e3 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 00661d3f0a..e75a1667ad 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 029fc2526b..eb691d1341 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 428e2b1f99..6067a6e62d 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 b082ef7896..6dfebbd9b4 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 b60495e7f4..ffdd4bce79 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 cdcc7087d0..0394dd99ba 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 60cc984360..881b7d57c8 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 d4bab0e417..e9306d9591 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 04dbb953d0..a997675acc 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 72a251ef9d..514ae2bc02 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 c098d04159..c89058465e 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 aa85bed1d1..e5620f25c8 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 5335bfd48e..0d0ca24139 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 e36a6511aa..603d4426ca 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 2fd772c861..6114f89afb 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 93d028b062..ed51d48148 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 d744de150d..67038a0a59 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 a475518bd8..b6ec410584 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 164cb13967..44025b8475 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 6505229355..c8fa12df5e 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 dcbc40b4c7..338593ec0c 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 a1cfd12e8c..0514010ce5 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 81a98b9754..f66fc97a4f 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 9f91d37c23..cc499625cf 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 c8b120b855..ca0d1626b9 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 6daa5b2657..cced4f6314 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 9a3ef350ab..0d83b874a6 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 e22ac763d5..52ddf089cf 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 ab93d0bbef..a240fe50d7 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 768152084a..a92b9016b3 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 71ffdaf850..cee47da471 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 d8b461913d..23b5c7a70c 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 de7c34ffc8..393c60bc80 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 aeceb80a06..397edebc9c 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 7c49d6f15e..4b303e4a5b 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 8f05ad18df..a6b9b147ee 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 804ad9d67b..64b9b97b2e 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 3cd7ee5625..a489b21033 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 7dff0d237f..da640cfb94 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 f1719f4bf3..d243dd162a 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 5a06743090..a55e799fc2 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 8b2c7f4973..9f39e513c6 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 e2ee25882b..b439b08922 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 648ef0c5fb..fdbb9a4ea8 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 dc10ffd6a0..d902ec35ef 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 38aa1944fa..8d886f249f 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 6aaff5f723..b281d43794 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 845a89c477..2f14684131 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 a7d021066d..a256377902 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 d3a35a6c71..ac17b44d37 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 75a116a3f9..365be074a1 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 35e3cd5a08..f2233607e6 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 97d28db4cf..84cf754b04 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 0423401bf8..aa9be50373 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 d149fe9d77..461eda1a63 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 220da6fcba..8ed4adbe04 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 8afbeb6992..1fbd0216cc 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 9bc10220a9..8c97176e0e 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 c91fd798d6..985c02493b 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 2f11bad696..89e102d844 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 232c7d1617..0ac2ea2095 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 d4996d492a..d05eda9952 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 8e18b27f0d..4fcd689424 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 6d80767239..53367773da 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 844181b5b6..32a4ec76ca 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 a10508f8bb..df4e97ab97 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 7be080d96a..7944a8135d 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 6913f2c91f..55764fb1dc 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 e205090d0c..5adeaf2f0b 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 e536234ffd..fde79efe83 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 31f0fe2c0f..6341001621 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 fa04208cac..16771d9447 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 58328d973f..9c4042720f 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 c52021806d..529d497e62 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 4cf4a7a72f..dffbe942b1 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 a17ed15a54..c8cd52a169 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 ee3ee24db7..6fd7744825 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 2315720246..302c4b9cbd 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 4f42a16362..907327ea26 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 cd627cbe4b..fada51c6ec 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 e277579ea2..b0458e22bc 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 a07b84077a..e0feb85f17 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 d1ed6a36c3..0f8c0a86f8 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 e95938f159..857958c031 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 fb76f697cd..be37c8c824 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 fbcde2a6be..bbca18fcfc 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 c89f66fec1..c55904286e 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 25af1d5e18..2c2bfb7aba 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 b240e12248..fc299883cf 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 54dc85e725..ee06d4802f 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 816d281752..c6e67d666c 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 79a5fe1fba..a9af04df80 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 271e38147c..ac45fd5963 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 e88012b861..28f0812049 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 54c945a7a4..c02c0abf8f 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 e95f4743ae..de3450c581 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 37c0deb9c2..652f16c67c 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 899845fcc2..616ee6d859 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 a66ae60329..618743d07f 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 8140e7df7d..ce2f97e06a 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 b4494a45ad..0ccb9a8b95 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 7189bc53c1..143b2155ac 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 5fa53384ff..b8e0636b95 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 d276b0511b..132914b74f 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 1c61180726..fd1b4f2dad 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 28a497ef21..994cb8da5f 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 6236421ffc..318ab6220d 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 4f9570146f..03a52485c2 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 654eb7675a..90dd206046 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 5b234c514a..7202144aaa 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 4a5e14196b..808637328d 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 3b1ab72f7d..a7e989f1ab 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 ce76667176..d4afcb7a1c 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 ea2b8cdc6c..167f24d379 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 4ff655856f..8f56813cbb 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 31a72fc0b9..4e2e3eb72c 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 c3c8770d2a..e78930a9d3 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 dd5b44bf03..50502ce40e 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 abb7caf418..a174aba2a1 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 f17e48c2a7..f7d53f1449 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 25fa4ef7e6..0bb393e338 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 6f084a9d48..bf8c7dfc0c 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 4312bdba6e..50f54a1770 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 b8cce4bd80..a667f2224f 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 dbda456587..e023916c42 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 e018ab7aa1..8acd3966bc 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 87c6a989f5..be7f53ec63 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 55baf3b7f0..2eb4e7f901 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 4f54e11a11..413af8497b 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 07de20e7a1..0cb2a37698 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 4ba36fd336..71735d70d9 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 eaf930b9a2..fc8c3aeaaf 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 e1e2ed4974..1f0b1b4754 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 b3c82fdd8d..f8e2f981a4 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 e45c287f44..e4a906e713 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 7a9bf8639e..d106a400bd 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 45f7f8dcdb..a2789f6c1a 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 8a0243013d..7bb24458f7 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 25814e1359..dce5ea993e 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 247755d8e8..228d30b2c6 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 fb650bc767..aedbdb9980 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 8416f74e08..365a5ec232 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 86561f89d2..5d49f0f43c 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 989526c8e0..c1011c2904 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 21b9cbdf75..ce1a92a895 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 0bbf39315d..f25c034e98 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 3559fcc6b2..3583df7940 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 86b72665b7..dece8693da 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 c54ae6e3e1..c9c67d1f0f 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 c12004236b..581e63a15e 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 3c57e7b6bb..23b299a939 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 ea8fd9c10d..db2f7336f1 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 a345c05311..5ebc1747f3 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 c367873cbc..133c92f78d 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 41db9de34a..955b7081c6 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 eacf5fc445..98e2af15c8 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 4f495e670f..eb052f4b9c 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 db4ecc9ee4..a054daab11 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 8556f60016..12d9edeb42 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 4d3ed384d7..90be81c68b 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 ec89856496..8e5f5cca27 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 b7560ed40c..68a77191b9 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 14bc601214..d4d0f0fba8 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 d30f9e5ad4..87a6da7b09 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 736234e92d..d08f961797 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 2a75d11a9e..2177c28146 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 73628c8646..27f8eb2579 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 99e7574e4b..571c9f59d6 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 941ed18660..5ea3fadf43 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 50fa4b5866..5130b3f9f6 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 d5615815dc..140f3dd9e4 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 391d0aee19..559aecbcd8 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 3043ec6ec3..ef6b051dec 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 26b0bcb7fd..37788b1e05 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 4846f0180f..0d0188128c 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 e04e73aef2..05da161730 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 dc17289c0e..f8d7436307 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 e6b55b12c5..199fdcd0c8 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 8c4c45f9c8..d8a4c45301 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 57989a346f..ebc6f80f70 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 7acbb718d1..9eab7eff5a 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 64edf9e93c..9334b57230 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 61f49cd5da..44faede844 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 3a4b705e7c..553662de61 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 636568b96d..4c9a9830bb 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 c884226174..dc1e361770 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 39b85754c1..9df04019e6 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 500862039a..daec97603e 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 cf448bb35e..8d0304e883 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 60a3eb65ca..d75bf7e053 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 8a154101b6..4f94c67d12 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 4e8c0b23bd..5297ac3263 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 3cd7b003f6..f75e55b102 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 7f777f42b6..8d472c811c 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 b96a358f2f..5ab9a2b060 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 dc26862f5e..fffe08d20c 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 58f86f5474..7b244a681e 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 b55c6d0068..a1ac11c17f 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 4335b7d167..2efbf37664 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 42170910d1..33336623be 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 9fdf442c5f..b8a8fc3e34 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 756eb07189..9cdea36d20 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 be3915c464..4af3f8dcc7 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 9f19d22d93..b60e3c4e95 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 d40c872e30..19382fadb4 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 3f33dd6c67..c1d04ccebe 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 5ea970d9fb..ea811dac99 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 f315cf549f..2ec7dfa767 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 9abdafafa9..41072b2966 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 d038ed4157..bbe9a31a7c 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 721f891219..ba5d2fbf00 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 82ec7f168f..8dc744fad0 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 996c6c68ea..c317e5bb46 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 0825fdfdc7..389a306a53 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 c477557e7b..ec8790d26f 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 63de8699f3..eb361bcdb2 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 8fec289088..82400e48f8 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 57e717429c..d962d259a1 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 9d69a3ece5..62f2e05e15 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 7e39574d49..0804fb59df 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 23f0bca108..d7c7da341e 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 9994e527f0..b621bedfd1 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 f3e3dafcba..cde5e827b1 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 e360c16d69..39b350e0e2 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 b7e3a18bda..ecec03f6ed 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 5f5fe37511..b3218f473d 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 98e5a7eb35..17686771cd 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 35da44a968..80f287cabb 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 c34fb331ce..20860d104e 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 5288c84e44..9bef8c10e3 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 2047bce5b1..a0199c3819 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 24124e6fb3..d2fbb03c91 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 005edb82b5..66eebbf7c7 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 bda92cc7fe..0aeca50a0a 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 c6dcaed91f..c2871984d9 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 836c6b514c..1aea820987 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 653cc0b3f0..20acbb6ab7 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 5fdd9a6095..767e73d3ed 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 daabbe77ea..90f01a0d82 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 ae80d21878..c6f600ef5d 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 84dbcf5b50..8860d0d090 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 a294518a77..918a3b849d 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 7a768c1ed2..3b83ce4083 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 1c78180e2a..4df9b3ef11 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 b6e73a5e20..04b3a1ed08 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 63b1c61350..755ce131b2 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 6b139fa6e6..ed75e5b1f0 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 1ccd8c86bd..359f3250f6 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 b729b368c3..96dddf9ba3 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 ad2f19b066..36fee5bb36 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 8d0594629f..7c5eab0fa5 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 ae24ba7041..8a841ce057 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 93ab9a4bf5..8b502fd37e 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 e33b50f193..dbd1c8fd7d 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 c848684ab5..da4daa0fa5 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 b5d2eabd50..bfa3ad3834 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 f45ea87f97..70f155cebf 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 302ef3f2b3..d9f369a640 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 fb9ffaad9c..3a946a2229 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 5f790c02a4..ee74ca2750 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 41627cc6ab..04941b7627 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 5abe616403..13d8dc69fd 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 8964818024..705bea205c 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 0e61657f61..6d73fbba8d 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 2767c504b7..b346e92c21 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 6c2f739b94..75cf013e69 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 adbc63b815..8b56d89b74 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 4b82319be6..c89411168d 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 f0ce00ca7e..d3ec784e3f 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 21012de756..6ec527da6c 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 a98f24a965..f7cfce0fd6 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 01db583590..6b02df2045 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 fd2b3114d4..93194bdcab 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 74c0b8a8f5..a3f4861ea8 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 e7ba18d393..d2e8c68d85 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 e228abeecd..700a062b8c 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 f6ef9e703a..0830995a6a 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 a80fc19406..7e73d5873f 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 4024d1d0ce..536a3a137c 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 f9fa46b666..60a6a26957 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 7e9ec8ddd9..a84b260dbf 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 131303354e..2f8562da23 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 31fc3e513c..d018a59eba 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 ee9a67b243..94b0b467c8 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 63997b7960..f31cff7d74 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 4163b39308..5b72d9a201 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 fe9a611f11..d524e1a770 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 4d39dec366..def09ea4b6 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 bbdec393ab..525b5b00fa 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 92217c51c0..3b835faa2b 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 5ba5d232bf..baec16255e 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 9acfbb4bf6..959621e364 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 7508612580..c208eb3295 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 1a00570d32..8b1beebdc7 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 c1392fdd07..6128361f85 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 a51efdb197..266315f660 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 3a057ec4e3..703a675f28 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 331307d3bc..b0b21e3c2d 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 6b30b85931..3d73199cbf 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 9d945eac27..aaaee5d1ad 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 6ad69e23c2..c2190ceba5 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 8eabe6839b..c554b06241 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 61562b9562..2360e81a4a 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 6fa1f260c8..55bd70077c 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 288fae919d..968addd26b 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 6e1e2db5ca..0ae08cf66b 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 ad2f391886..929ded46fb 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 9f6ad4f8d4..b6e3120f36 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 eaf2e12702..1c1f80cc6e 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 cc8ee92df4..134771d6c9 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 df0232d01f..5cd75240de 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 332a21f99f..2d28462243 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 03118f00ea..0dedcaa8b0 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 288fae919d..968addd26b 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 2f83fa3008..6b6b326756 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 262a3d732a..7a9716f76c 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 fd30f83c5f..a6188bb18c 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 beb7c839eb..53b6fcd6b3 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 1a231d680e..b7550430aa 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 c16481993e..6abc49e8aa 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 86e558cc80..4d941d7361 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 e2b264182d..4d408ef525 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 135e26cede..dd7fef44ef 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 2ffd5e7fb4..790819bbe3 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 ff6d1b2105..859b9e72f9 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 905fdbacab..5181c87f3b 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 48283a7410..2a2e2ec651 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 976221188d..d52cd1906a 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 27d2921a7d..846425ec42 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 6d8c537d6a..fe95bee061 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 d9de0f7c0a..399ecfc045 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 d8f46d6afe..3e6a5820ed 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 2310af22fa..552ec1b7da 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 1989e1a070..d3abe40bf9 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 c733f0f12c..4a828e919e 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 25738b7618..274cd02bf7 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 110f60193e..a52c2e0300 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 ba7721ac0a..d83a34ba9d 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 a34077a0a8..77a9bbf2c0 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 f56cff977d..c7036e9316 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 f5398c1c39..8da0aad273 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 5975c34e78..ffe8501b58 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 a82843bef5..2bf02b8cdf 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 03b0c84744..0e86684c61 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 ee1507d9e0..4161597a7e 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 146fda64b1..f62821fbf0 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 21ee65a775..c340035226 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 cdfd651bee..0e0a71c896 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 aba620541e..08154069b3 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 91afa020fc..882cd328f8 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 3851b1cc44..3a6be91a99 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 91df7f5a8e..317c4932e1 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 0e9479c1ed..8e4944772c 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 e7ae559363..0f35269d00 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 2077cceeb4..7f765d5a93 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 64a6935a9b..a5066e0ca3 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 923f452450..98ff43014f 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 1fcf58e308..8a217c57a6 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 481450cbc5..005175c5bf 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 c4dc5ae178..5114b578c3 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 92dafa1c32..5c104c9399 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 6d3aa2c59c..5a41facb50 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 d63802984e..40cca942a8 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 ecb061e91c..af1305b00e 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 d710886b84..849913b40b 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 680571040b..03963cb15a 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 7e7697a339..5d769289d2 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 619fdcf736..1591d0f311 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 62caa58fe2..441fbef41d 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 7711fe98a1..0ae305c76e 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 750e14b1da..5492aabed8 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 0de31a35eb..c0abea57bc 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 dc931b6bd8..a902c3d4d0 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 a1903fa107..1d6ebea298 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 fc1255ed9c..b74ad36365 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 b30bcb66d2..85d744b252 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 9b76bc744e..8c2fc19bdb 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 1bf211476d..f07766c88d 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 53d15e1205..ee2534fa77 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 46b7759a04..e11634c2d8 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 7bfdda60b3..5558a73aa7 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 c86ffb97d3..15b7a823a9 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 b9ca9b355e..8383a6a349 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 0546fcd7ad..dfddaf0274 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 3de562db21..6190c0a52a 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 354a5eaecf..edbbe2d4d9 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 c59e31a3b9..cdf95c7017 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 bb48d95bc5..5db92410f1 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 5cb49836f4..47d5bfcf9c 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 c8b910b6dc..94b0d55afb 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 79ae6506d8..21235032c3 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 a16deb2fca..9158b0c83e 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 be76411d8a..1e3285a628 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 8b21562a87..f3a9bbbc7d 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 851a2f16ae..d28ee5a2e4 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 20ad2ca0a0..a208aa3fda 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 42afc3eeaa..d8f5e4be15 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 6d46b8bc15..27e7cd47e0 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 3ddb9f998a..a67d242398 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 c4d9228532..e834de8ae0 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 71f13959b4..c39cec0c73 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 4b6017ddd0..8692c4c02c 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 1072234a74..53b2f2f664 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 705ac59b98..c53605865f 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 7436513ba6..fec1cb0b40 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 9a94e54dd5..7488d527ec 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 c20b62ef3b..eda0c666b6 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 3192454550..e6a90325e0 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 3c0ef8306e..507b423314 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 0dd9cd43ad..1b54d0ca3b 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 ea589a2c3d..3090a8cb16 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 1ca54237fd..bc107a24a9 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 865155c049..e5a6ea182f 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 1448b56d84..85e383be71 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 4de46c8413..0aad75fc4f 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 8a7bff38db..99d65227b2 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 874f0832b6..ea087c1af7 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 b0fc5a61f7..fb49b3e7fb 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 bd0ac2f121..7f97ee23f9 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 c68fd29f7f..26c208ef9a 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 e171aedf1c..9ce14cc2ff 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 f1bbb1c872..5de5978979 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 6b375c93ad..4909384626 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 1a442e7fbb..4e032a7095 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 583a88e562..ec46be861b 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 f0d0c6dab6..9e98e4a949 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 b907b5d429..376e875150 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 0031ea5a9e..dbbaf1c372 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 d7fcd8bfe7..43c3560df9 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 c86cf73ba1..8be90459f7 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 63ce7b0da3..7f5b3e3820 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 4b162ed8c5..cfe47b199f 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 b85ce09eff..8e80584957 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 fabd9032dc..78a52d9087 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 166d267493..a00f8930d5 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 5c4e67a324..31c9485115 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 cef13db315..2b97431b1a 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 66eaecbb54..53c357fa8f 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 756eb65d4f..242fbfe890 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 0f7066df00..340d4742ba 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 d2d749e4de..45af82bfb8 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 5c49723657..0ce8b77e7e 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 d9fa42b9e4..4b25ffa005 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 de5eb4e5e6..a9afe10984 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 46bbd6b309..23f58ad5bd 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 0986b0e024..9cb8c51d98 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 8eaa20d76c..3f239306ec 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 8692090600..d8a7fb3022 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 b5db81356d..b56efa60ac 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 0770116f1c..e9d7481bb6 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 f6a86be009..ceab0e65a3 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 5d4c8e1228..774e6a2695 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 c7ac8d76cf..3d0fbad5b5 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 f51bc45e0e..f28083fd72 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 a36c8e28d9..da01088462 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 b33002bcda..beba04478d 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 118226354a..53660148d6 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 56a2070647..5d98c83708 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 db996c75c3..9e3e805339 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 2e80e3da6e..341fb1afca 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 86aaf15c0f..0dac2ae5dc 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 8951c46b75..396082c057 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 5e0c6acef5..cd97e4aaa3 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 e2bd6caaa8..d9b547e8fe 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 bed6af70e1..32871a64c3 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 0a7f93dda8..04cb6dc6ee 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 aaa10fa21b..e8911d78e9 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 a10c499dd5..e31ee2373a 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 468ab0b3f5..d638cf5e54 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 05bf5fbe4d..523e2fc025 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 bc87c37006..d02d1a45d1 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 e938c78677..05c291e9d1 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 a7fd606b31..ea2b760cb9 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 fe05d236e8..96d6cec104 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 d52aac4bf4..373a30c435 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 d43d4d9a04..b2abd3fb20 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 8b06301887..06fe7d4117 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 3c07ea850c..789893b597 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 cb97cdac9d..6d51f68a4d 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 80e5f3ff99..f7a6b7ea62 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 86338633f7..ac162b546f 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 03f0fe0e20..6aecb4703d 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 494b1ecc69..f21909d21c 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 919956b8c3..010dc5ca95 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 fe53a86993..3fd8027fab 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 257a0908c6..385fae5edd 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 4ad5bfd7c0..a753548a77 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 2cb49dc0ac..7930698520 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 518ff39f8b..8375483af0 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 48ae0c049c..b5918917e3 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 d95ec9eaa1..fda712f0ba 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 e0bdd7a2e1..a8f1a65a36 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 66d6cb0b74..121d885c9f 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 be25e92080..6debf4ffb8 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 2e1e62c683..2f6e4e14bf 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 14b3c7e4dc..3aabaabc3d 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 34b74f56c4..7e36e6dd4f 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 5e813243f1..01e43f011c 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 8fdf05bd3c..1654b40f9b 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 12e77ed8e4..6dc636f9af 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 e1bce5874e..229db9e6b1 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 68c466150f..ae13a03b08 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 864c110544..985f2cbfce 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 f3d8308fab..ac2a895f7b 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 3d9663a9a7..9c27fa443a 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 c25bdb22ee..77e8a7db60 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 45aebd1ebd..983bdf0a80 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 ca49bcef95..ce7938ac70 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 54caa8f96e..b30711c49c 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 f5598c56d7..e9133de022 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 c0397692bd..bd53ba0d48 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 578399c815..08d8ed78d2 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 2e50ee0d58..8ea4152034 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 f566fb592d..c894277abd 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 d004655eeb..42267f3b8f 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 70736b15a9..2091ed0b96 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 bd8699a361..8bf764ef22 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 e592522c43..b44d707b47 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 905f23845a..82d6644c44 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 58e8663431..d69f926bb0 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 e92790740f..a31cbc42b7 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 8ba71cab49..05b83631a9 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 3f9897784f..4ea988465b 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 3954d9d549..7f30d92a63 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 30c53e1d89..c3b79973c7 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 ffa850f6eb..f6bc4cbd43 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 a76f68f2f6..073efa65f4 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 c530504c6e..710f8a003d 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 d7cad509da..b41e1a3d8b 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 da6136334c..2130d13031 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 df56aa5d35..e9254635a3 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 b92aab58df..92e7bbd796 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 0db5f9718a..991882ac87 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 0745151cb0..ce43bbbcd2 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 529fcb604c..1dd9688b33 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 df142bdb31..da9de46dc9 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 0f6e767f34..1c85587acc 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 b8828c9c1c..5d6d520056 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 a74d2c0450..2c51f1d15c 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 0000000000..5217518cdf --- /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 066de6d548..1ac6ad5996 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 a776c8876d..2caa4455a9 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 a742cc546b..0506560e61 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 7a6b5540c5..9b20b71155 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 24afa67038..5c8a491f6a 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 37dc84d3e3..55fc24154f 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 91581de59a..e23c5cdbba 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 8e722a7add..344110ed1a 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 6ed1d80673..5fd2f8b768 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 692f91efea..6b4548ba4f 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 20b4496b42..3ab32508ce 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 6fc78c96fd..dfce3978ad 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 3dcb9e59d7..4b20490238 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 6e02251f27..5218982315 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 02231169b6..d0e2e0f617 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 016979eb33..15e05bd376 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 bbf39de340..0de30aa5ff 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 423bf61a75..619dbf8dc8 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 e23969be8a..fb9a6399c6 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 d12d47551c..a44be6c5d7 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 b1a49974cb..c9e0b2fd48 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 229b26e56b..c448010e5b 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 32e6f48e15..fd4b1f4af3 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 07078670ac..057596e5cb 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 999ac2a0ac..73cf00b355 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 8bcbbb835a..c0760337f0 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 6041992e56..d97d32c896 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 74e7615cf5..fd4c937301 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 d3fe4028e0..798048479c 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 6a609a05f6..d1d527c030 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 9f7568ef24..5fcf42caab 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 af124ca3ea..5b3b13f9b6 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 61ef8f8d38..ec498ebe3b 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 cf0ca26fdd..2121153a60 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 7377dfd8ae..ecd3d4d252 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 db71d8818b..956c640379 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 4d37438ff3..74ec441a24 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 7951076a95..965453fe40 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 7702874866..9d58589d7f 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 64318828e6..c472cc5806 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 4d0cd3178e..03cecbfb34 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 b0dde032b7..48b3ddb048 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 e91f57a158..1c0988cee3 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 67bd1ea54e..3eb2582b61 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 36ce52f74e..83f2a11a8b 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 d97fa159a8..1115cc97ab 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 ada10db6c8..7b7a840b94 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 b99381722a..6306e1ab2f 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 7f0968e7db..135779d690 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 f1599b58be..4a2c446f3d 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 541ee0c0e9..d384e46641 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 13638985ee..d2d6a42fe2 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 6a22409e8c..e28b5076dc 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 a2c89f0032..b7baefbaa8 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 05034e3e58..b5265a7078 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 ffd1c1d7f6..c1b10bc84b 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 7885890d8b..247fa8d9f4 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 46f2663768..129d1b0e8e 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 7945f3b0d3..56a92234c7 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 d16122d0df..75f09a944e 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 e230421909..84c6e2762f 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 857ef6488e..5875ad8088 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 f5d594ed6f..6d90e9485c 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 aea7a9b640..dbb7d941b2 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 0ec8fd3c6b..7b1e2a3f35 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 f2d9db5797..34d86a4b46 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 2160dc226d..793de99a32 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 39324fe5f5..862ca6f28e 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 08d5b31d20..c48ca23d27 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 60c3784ee9..d753a54b69 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 bf4127fbd8..34b0f198b5 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 fe159cf9fa..84d0bf9e84 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 e204fa96f1..471a6a0cf6 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 613b556547..3345d7882c 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 71581e845f..1ab01c14b4 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 53e67cd550..9db028011d 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 a7e56f817d..3c0c165aa5 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 bad1c40814..8c9da14a60 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 0568cad3f6..1bcfd463ce 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 436fba8fd0..7ba23b7b0c 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 b673d28a7c..d278c5d6f1 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 2f1fe9ca10..a732debc04 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 809c8fc29a..097c6fe3b7 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 33f284e93c..a84e80f9d0 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 1e06319672..7e116f6292 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 15131fb119..81be13f879 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 28ae99c1dc..81c7db754c 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 2981ee7163..5014ee44be 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 bbe44a4fde..dcb235d247 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 8a13a76a2a..bdbea8983e 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 e1fca79c24..9b1d0cc00b 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 04fe2171f3..636943d119 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 c6baac6789..4096720d02 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 df28c6936d..9c1b9ae624 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 4dc9432469..1ff1554fa2 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 513b8ba3ff..59c2f79d85 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 56c30acbf1..1fd32fd1be 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 7f80900d82..adebe4b8a7 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 e4970780bc..56c29638be 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 c2b17eed04..0b96963199 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 f7d86af839..804cce8486 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 fc80ba9f72..2fb6b10a77 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 2b5b646c45..2ba0e1f346 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 929e95dc2f..68782329fa 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 a25de0e2fe..051fcb5e6d 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 849ad17413..7bbce69927 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 84194fee48..dba578def9 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 f49fe04ae8..0b8a9f88e8 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 f07586c16e..0ad425bc93 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 506eb98cc9..ea7c3b8012 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 725957682a..5cf7b43851 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 c871679860..47b04ed2c6 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 2326c394cc..7acf1e3431 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 10d73f8be3..b6164bcd3b 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 9a8767fa7c..2167553ce6 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 e265df4021..0ee1284a34 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 356603c9cf..1e4ccb6794 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 52c4f54ebd..66e56e73bf 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 7c41731988..dc12b0b2ae 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 6aa256d87d..725e95cee0 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 a3fb9ee5e2..e4524f4dcc 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 627c534f6d..5cfefc8079 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 aa4589e558..bd0ad02661 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 8c79ff3bfa..bd39f4cff7 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 1c886e4f20..b3b4155a55 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 f307fa1ad2..3e3ab1e2ac 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 46abfd2677..b70a3059be 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 88edc116e7..7227ff139b 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 19c90f8ec5..223150f2cd 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 818f27853f..5bfd1d487f 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 848f85ed13..6e888f6d5c 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 e814ffd504..3272cd0090 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 6249e49d2d..0ed6fd4d14 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 f3ba34adac..6096d9b7f9 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 94c3750f06..3dc7f769cd 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 69073a0eb7..f79a283143 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 a70bb7a672..964bb4942e 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 b982baac2f..281726861a 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 e4223e373f..4115473253 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 fd3707af3d..84b05f3a26 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 7ed64f5108..978bacfbec 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 cbe913e131..f75a9af1b6 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 7b06c11039..d9345e42fd 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 8708729bf4..458ba0436a 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 201e3ff49c..f2d4e623fc 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 ae8f51983e..22d7727637 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 6523f39362..483edab97b 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 3d4b344825..ff2e4b1e97 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 afc558ca80..76d928833a 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 3cc52b43a6..15cf27984b 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 4dd4177dd1..6f41bfe0a2 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 5e80c1563f..53370bac08 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 e6e7094648..491072a841 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 ebfefe40b0..4ac26d670b 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 25bb0f325a..42a2c21705 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 698c28d99b..f380296324 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 6dabc169f1..7c730cbba4 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 6a041c7ea4..699eebac65 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 f2294823eb..2930048d59 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 a344832c61..1ce3bc44de 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 3e71154b38..621bd13ee1 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 f139604581..136ef6fe14 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 2e6778ffbf..4e171b99df 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 0f1b4944ed..d9a6a482e8 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 65c13f052d..81ac10aad5 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 ea337d1e67..64c56cb37d 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 8bfaca69d9..5d835341b6 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 3965f71e99..36ccf94c22 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 3ce86b4e10..7ea0915a12 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 9fddb46cdc..5963c62bd4 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 fdbf21feb9..00d2f264b2 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 3333d5c0d5..5f9497d48f 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 152152eacf..8024236963 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 981bd9fb16..9942533798 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 e44d7a3f9d..580418df94 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 0b7dd3b689..064da5cedf 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 00bc3eef39..b08beffb16 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 49bf83148a..b13fb51aa5 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 384e7ec420..75a19c6a20 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 46bfd441fc..46b2f34b7a 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 6df113b82c..420cf8fbb4 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 0889cdea2e..69f98c1850 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 797cfa1b2d..9c63ecc366 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 6c7d012970..6bd93ee7bf 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 ea79a45592..4a1cca9e53 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 fdf180a1a6..b484d5925a 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 058f722266..823ee6c753 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 6eeb4f75a3..961b47595e 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 c8cfa1473f..43109352df 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 102413bf44..c77ebb5369 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 fa581eb082..cb9786da23 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 01f7e50eb9..c8ea225175 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 bb3ce895fd..ece81ba345 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 73b26cb91f..e3882a4fc2 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 4741ccdba6..043f37e52f 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 58b8853cd5..4c917794ca 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 b50c030c63..0cd23e6a11 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 b950a439ef..9db0ccb350 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 3b2f2e6bea..54c6e3b833 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 ff0383c7f0..ea066156c7 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 d20eb71cc5..ce2614b998 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 29a3eb7785..70cf906841 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 3a90410207..b9dad43c44 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 c91536abc7..0c0ccf25a1 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 c7fa0e4d29..1ce59e3dbc 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 0a1cfa8325..8ed84338a1 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 b08bc3431c..4d764b0dab 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 ff0383c7f0..ea066156c7 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 f5944cbf9c..3a28194f6e 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 e08e921cf1..d9a7fd5307 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 302ac53bb6..2f3a55fc91 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 0cdb43e424..8b9244c5d9 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 bdfbade2bb..cc8be93034 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 982b32a90a..4fa8975523 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 3b11e6ef6e..1fbff59337 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 392a30d01f..c1f87cd9a7 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 67fd26f1b5..ef651375e5 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 c0b26284cd..945519c859 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 c4b1a55524..20cb32c9c0 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 920d25a3bf..423684442e 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 df9e9d2239..14f85bae32 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 ff6924389d..b260aa2108 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 d2372a7d9b..4a1321bfda 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 987c54955f..a98a23c7f0 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 fd2a77bd12..5891a80dfc 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 54aa43c615..51e4c11394 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 c91f9a78c2..835f113ba2 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 7811a31ebd..5c85ca2594 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 dc810d9773..f9ba72d201 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 06c873b436..60c93f7b42 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 931a0beadf..8bf0b347b9 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 26eaec4584..d39a4d544f 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 de84482cc6..d47b564853 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 e7df1f23f2..a3540b0e29 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 ae47916ac8..32780cecfb 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 a45cb4e982..2ebe0e5d3f 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 e8264b2d6e..c761b08c60 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 379ca96531..7296efb687 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 e442ab9504..c2e4899b5d 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 1bff827d27..5389beaec7 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 6773465bbb..e4fb004456 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 756fe8a748..439e9aca79 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 ebeb1a8b07..5ff26dea49 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 de2609f4a7..4a29360e2c 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 c6fb13c360..d118212e77 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 fa0fa73435..c4aacd2700 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 bcb73eb66b..7e0f58ad78 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 f4f4950317..b9cf4cb2ef 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 49670e7728..8d16fbf7f9 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 b26b2b6daf..6400bfcd7d 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 1e8a90246e..6da10f785f 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 9c233b9b94..7fa73eb02c 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 414c82751b..a51a4fb258 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 ffe78aa0c0..893d33225f 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 af151ecc2d..9ebb4c70d8 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 b7d555cbce..556c5d559b 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 2721c5fdff..01b2b7a38b 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 abe5985404..357d307bc2 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 7a545d32ba..4dc334c6bd 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 1f2e121388..339f86f80a 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 b19f226d8b..d0985024f1 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 6ab0b0a40a..c1067de1d6 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 5c720a1f26..525ebde7c6 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 88755b800f..f8f224d2cd 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 c4ba3d4634..688f406a67 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 702c061c62..d2ae496f35 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 72cf1a6676..b6d7d072e5 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 2a8cbcf127..3be1164d19 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 28332124f9..1c845e1c59 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 afe8f8c732..f93f6d3ff4 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 bc881ced6a..9263a8c3ff 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 d15f5c37ed..8854ec470d 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 ccc5b7983d..54d000ff61 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 f68732354c..6828cffbf7 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 4d7ecf427f..8dcd652686 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 527add9920..6a917bb17b 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 df6a51136b..c5d7905c5b 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 88b146144f..cb69fa9c8d 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 37d55aea19..c7e3a1fee3 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 71d54bbbcd..f0b94eef38 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 aa84c36772..5555158828 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 3cdc5bc4ba..a2e3728ea7 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 83f2300892..205088154d 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 6f8eeffc8b..f6b7ba8330 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 ce408778b5..1e3f7b573c 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 fcf31df392..c9b127fecf 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 3bac6d1628..f3ffdb997e 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 3bf4555641..80b55da4b6 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 60fcd9866c..6d73cc6fc9 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 553a296343..cc5343589a 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 1927227b65..f5fe2bc17a 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 0000000000..998080b1ca --- /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 5fae9bd32e..a850db0f73 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 76144afa4c..f7e1a9d223 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 303e2c099e..eb33565615 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 00890a786d..4eb4d59e64 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 908d0f7b17..68178af768 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 0000000000..5d2a003e5e --- /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 7690efe94f..a2ae32f5aa 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 97e1c1f282..054c446492 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 46ae4eba46..96beb3141c 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 6f337d9a4d..933ad3cf7d 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 895570c369..c85251a0e1 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 c07ff52836..e58c699317 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 4ed9ef597f..601c83d31e 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 1281784dce..3b8cdff398 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 0cee7ade0d..b760f25a47 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 70f4ef6f1d..f5c7efb4cd 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 8519f02ef5..823b50fa86 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 ce152285e7..414286efdb 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 10e289f252..5790bc6d7a 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 a01436f9ba..3437a73f6a 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 fac9475f6f..905653b701 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 934f56a420..a98ce99c97 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 3977bde4a3..854b7fb562 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 68e53df57f..5565fb2111 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 2183b9068b..e0066a271d 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 9f8134ed07..e4f8bf0556 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 fa5b7e2d31..71204c8860 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 7e0a8d28b9..0ee0c4b6ac 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 809132e01b..a7692f2a68 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 657722f7f1..a9449ad999 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 23093d247e..959e174408 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 2f0257d47a..ad1ae6935d 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 85091c350d..a6036e4798 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 4f435aa783..4c458f06bc 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 4dbee73717..67d91759e2 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 3f9e9c4e9d..465d766898 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 ef9d516289..9712f1f780 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 01090bbfa9..976de89687 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 e9bf5e2d4f..dc7350982e 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 a0f8d35334..4879d5ce9f 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 64bf528e95..9d5e030900 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 5f3e83dd24..618ec93820 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 8df2cdd201..e46a184ac4 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 89233646ef..eac0ef7743 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 4b6de20d2d..c8a1b1bd24 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 5354e4e639..4dd852403d 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 ec6d5850d9..6260a5bcb2 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 46263ff64a..ec2763d01f 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 c35cbfb944..f302a4fdb9 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 0de9452b3c..1875957243 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 0a88b82f82..3830c13165 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 e4f73bc7c6..fe588e0143 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 cbcfd5d4ad..938b86add1 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 7d7d6c73e1..c43e8079ec 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 598bc77aee..800e9a1a18 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 10b0532a53..e37995b0aa 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 7c41cdc0d2..d711a2edfc 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 7934913558..3793aa7640 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 dcdf19ca1c..079f6eddb6 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 6ea86c0005..4bf599b598 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 2ca887b176..32df227007 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 eed288a5e3..0dcee9de58 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 80a101ac67..aa65b65dc8 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 52da6579a0..bdc98c5e2c 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 8cb5ddaadd..1b81905627 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 75b46d3f60..e9f1b91968 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 8fb71b80ac..8de052d911 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 4427b90ab9..b38d0fb8f8 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 f3c9cf9588..8880159739 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 c8daeda3f4..c239b1ec5b 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 44111d74be..797bf3c55a 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 a456027be0..361e22534c 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 0000000000..1f04e41499 --- /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 cd7f633f32..8eecf7a087 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 aa8fb858fe..dfc201734e 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 25ffb75307..8ee618ee6e 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 cf286f853f..3beb6170ca 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 1d9fb41fc8..12b54c61ff 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 5225a89fb9..6a81b59c43 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 ba19fd0439..d96ea151ce 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 ff349fe1b6..339c0bf6e6 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 2832804113..51de23bec3 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 1a1199eeac..4559384383 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 7351825398..87e3f72036 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 094174b09c..b8a8c59f58 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 4931e2293d..0d591c0850 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 89255d7851..c442ad2387 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 11ca7218e1..3a40495a18 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 622315fd84..6fdce954a9 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 1d9fb41fc8..12b54c61ff 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 2cb30df1a4..38578dafc8 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 fa90495a5b..40839e8f4c 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 1289a9178f..ce12d35086 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 1d9fb41fc8..12b54c61ff 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 b7d7679324..b22057ca71 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 e686ee4bc0..3f35a24605 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 14b6417d59..6ab2cf93a9 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 80740c9190..23c027fa4a 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 ca3ac91337..81f264ce16 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 17cdebd3f8..d8ff1e9776 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 7fe89d491c..68c2b1d11a 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 0cfb9738d5..52d5b776d5 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 b1ab350c90..2159542b80 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 92b1f3e6b2..6cf78485ad 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 a880483527..99bfc2f0ef 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 dedaf02971..294ffd96be 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 0948a31739..0fea457b5b 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 a0980644a7..ce56480f01 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 40e1aaf4d6..07199c7cff 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 8808d85a1d..156fdcc6c4 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 c4ee0544a2..61295f3d90 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 9fc23b3e39..8db28ed698 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 805b952690..f9ae3236a1 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 b7eaf7fe16..85527af7d6 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 4fa0c4e671..b7ad0024d6 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 1a215c90d4..e1d7aa0839 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 95aaca7e67..c6cdc90aa4 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 ddd33235e0..8a67cb2db0 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 22944e1c4c..f1f50d8473 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 85e8994dc5..adb7da378d 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 a9ce5213d4..74abca0ce0 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 eb3f25e8b4..ee5e2de904 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 58782a1b42..f7270ed944 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 36995aaae4..bf6bcb094e 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 68165dbb29..7b38a1ca34 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 0b11474d67..6a2889e3e3 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 4b3e1ed52d..6387813915 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 343810f92c..151f7e8fd2 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 c1dc31028a..4f8c260885 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 09af3d09bd..6d704b37d8 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 b9b9cc6c0e..38a496e40d 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 88ff9e6104..158524d932 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 5e1439c8d7..d10183877a 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 99ba9053d7..6a1d26cb75 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 02c46b52f6..f551eff524 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 cd3e61a42c..0acf3a310a 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 f190d378ec..951a8419dd 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 544604e2b2..e60a9efa5e 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 490fbaed5a..ebbe5da487 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 208687839d..caa4291b88 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 50c987dba6..0ba666cee1 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 d728bc32f0..f4ea781799 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 cea0e6d938..bc5444e7b0 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 7d2925fd3f..90902691e1 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 dbdc39c604..7b3e1fc2de 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 65c7bbd940..4959b35d89 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 d5c46f63f0..f98e4d2ea6 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 4ca6970b5c..cac431bd45 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 3278f7a3a4..6a04b7a166 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 7630b50cdc..ba0b48429e 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 feabb36434..4b9712967c 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 c3d912e5e7..716e4ad239 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 3605f21e14..9f9a3e4230 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 e64a23873a..b6b4423f62 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 c7a7820179..f63c0a3ee5 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 8a1f01783c..b20145b7c4 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 4d3537818b..fa1582daa7 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 0533574efb..a32c2e539d 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 5abf25e286..5268514252 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 d18a854d6e..413fe69560 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 f3e8c01f3d..0805a5a7ff 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 2c162e66ce..1e927c081b 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 ad43d3ee60..b0445528e4 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 765fb284c3..da77960f28 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 289c9f985e..da20997d73 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 6ae573211c..b05e458f5c 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 df36ab070d..2ef1a75001 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 27ab8e8a8b..caadb8b4da 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 1e3ca933e3..2d60ef39d8 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 586e36a5d3..e01a5a40ff 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 ce969a4f46..a747845c18 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 02ac8ecf27..c615663128 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 60a412684f..7402843f7a 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 0321a6b73c..6f45ff67fe 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 27850d207b..6fb69db042 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 a78867d86a..1a9c683614 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 b6f10842b4..186f6f687d 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 a420133f46..c376709b62 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 02ac8ecf27..c615663128 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 1d4395bb2c..e9e341c8b0 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 130672906e..0025a9a995 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 73735dda1d..15590dabc3 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 5d964604a7..6d975fc203 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 7b74b96d05..3ccf19e22f 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 ba2d874368..edbd77699f 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 0e0083ec5c..46685b2b74 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 1329a8418a..5cc940b6d9 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 bad78e51a3..e945154a92 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 d484ede413..da50d02bf8 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 d5f40d5644..4c3e69c3d8 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 46e53e182a..5c69717cdf 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 3ee0421469..cfc522ba8e 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 a5fd83abef..81721c85bd 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 8112c2a47c..2538787891 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 09ca0f63cf..869520ee95 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 ae96d08976..26e66e7d58 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 4f8926c23e..80b740b62d 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 b8e8882059..b42fcbf4e2 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 96b884b0c8..c1329c0aee 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 842307c666..b0b021be45 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 86e5d9051b..8831caab47 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 c3d6ff16e2..3da622c7f5 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 c61d22db88..7191eba4a5 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 28d6488f2e..f715e1d571 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 30495e5854..8327206773 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 ba8ed6179d..34fdd4145d 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 86d2c44f11..9da6470144 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 673997d5aa..b3863083cf 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 6fda9f0143..35ccf1ecfb 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 858970539c..c5ffa00dd5 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 4b8b897749..527b1a7a37 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 7eefb77b3d..786bd871ff 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 32711da56f..0d7da884ab 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 1afd1ca96c..8f2f33868e 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 afdea87956..db7cf1b6ab 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 d42a647c82..4b83deb174 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 9b729e4c4a..515e5fbe96 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 31c7e6c0bc..87b64e7809 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 659a567a91..71930db04f 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 f6919f985d..6a5f30913a 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 9439715fe7..7cb0a0a9ee 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 d57d80c791..730f11189f 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 26872a9f9a..b82c0036c7 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 fe31651173..7e03a1314a 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 156faf83d9..5085372747 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 08329aed57..b02484e182 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 a57bb33ee7..d60b4b5275 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 c602a58660..6044aa4fa6 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 99b1ac57e0..8b1c55af08 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 6cd09a947e..2850f91efb 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 a2c37f027b..6606175b9d 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 dbf5373aa9..c1ea81e01d 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 ebed653732..8685585996 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 e91bfca407..df4ecc4a05 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 6ee5961f15..66847b1a6c 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 85370eec8e..7d75b14814 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 17d9949453..8f5a1a2cfc 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 c41741b863..334641b305 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 253dfd59a6..c195c8a7c7 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 632d5112f1..a913ee054c 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 bd95b48359..e8098013fb 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 fa299cc379..eb8695eb8e 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 0c49a92bc0..91834ec81b 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 6864658b37..da06ae0793 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 29dab5e09d..a4caa11a0e 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 e822895a6c..99c9cd2366 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 bd6aaeef4e..4ce12cfbe3 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 029e1e87cf..4304a5e795 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 a94471bb61..522a42ec17 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 8e173e4297..ed6238dd83 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 fb1508a1aa..9b45ea7965 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 964e5a6818..084ecfa137 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 bfe4a2ab86..443bb93390 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 d559a05ff2..f05f025ff8 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 bb584da05d..406d1e964f 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 b0a7b7e7b6..358f589dd4 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 4c019d8f20..38fd6134ba 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 e3864aee4d..c5232db59d 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 2194a2dc26..3a0942e915 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 1611dac272..490b0c218d 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 e769f83d28..283a24ea22 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 e38977a483..3a9be7d213 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 5e636c8bcd..6d70f7c3d6 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 72af917e12..48f23aa0cf 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 898380a6f2..b28088efa6 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 1e1e8897c3..197bff064b 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 1e1e8897c3..197bff064b 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 8d93adbf4a..95987d48a3 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 e4f1fbf9c6..d1b74e9ec2 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 6e218afc97..06ca9a058e 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 f38a74e5c1..b902843ae4 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 b2908e8d22..03d9798275 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 c6b1617087..99a3706cf1 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 0856d142be..a412d583fa 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 10ae06ffa7..ab07c0f618 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 2fa1ccadce..2e1cf68cf2 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 5a86443942..528c614327 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 33f9191e8a..5916b339dd 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 d15d12ce6c..9749a468b0 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 91f61c9c2b..c10e24321e 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 0578daa4c0..898c533f1e 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 672bcc9056..347fb5ce56 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 d24bf97393..24c7829a14 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 cecde6b918..4ebd3f804a 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 440c576596..c3c769ef7b 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 de374358e8..6dece462ef 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 6fb71a57ab..521b3fb9eb 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 a12436936e..95cc2f4406 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 0c253fd481..96f991c056 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 f2be5792f3..69f8b74529 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 44b3ea86c5..3573094481 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 cd8b3e59cb..664721c2fd 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 58c62fb64b..2ed046a815 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 856dc77a52..a11d7b0a12 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 4928ea4f0b..4382525752 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 d3e5354755..1d59a36e6a 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 ca43b90acc..2d6cbb5202 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 0825bd0805..7fb25b5885 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 d19d528c61..c47e27f22c 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 372e37133b..3c1ca41456 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 be5f27b7a0..f97fee03c5 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 d6584f11d2..62c2807480 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 23cb6fdfac..47fb6fc504 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 636237dcfc..02307dd7e5 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 a477ca6e5d..64f413a78b 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 05e4a1bbc7..72b340ec88 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 07d9ddafb5..522a2db1a9 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 f233b4cb7b..2ff2ad7f97 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 fed2265def..b36990d9a5 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 e6b9817f5a..1941c399b7 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 a9d8b8c899..f555647e8a 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 64e48adc57..3c6643bf0e 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 5ae11707c1..d7d9b1695d 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 5523dcc0c0..2ea2434ac8 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 85cb147ff6..c5b66f8739 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 7b88bd31d1..a02cd1362a 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 db2691d3ee..c7c30ca0fd 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 61b9c56f49..840098abd6 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 e9cd91209a..6868f1f790 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 ce8f325e0e..1863076baf 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 a7d683e793..84ccb05ece 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 69edce6b9d..5e2b3a1f6e 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 788f85b938..7ad772ae89 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 7553cc683c..bdc14bb4f9 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 6b9a3a8913..fc103b7342 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 5317c1c2ad..83e5c363f4 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 e2d391da0c..97cddfb44b 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 a4918978ba..7e8ab70570 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 eb35fbb0b5..44c732e494 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 0c0ff56af6..81e38391a1 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 c8b74f33e3..e47abb0d57 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 4a26a40ad5..1786fad932 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 df2fb243f8..48c91c86a1 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 3146c8756a..6301e8f186 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 797836e014..c16c99a455 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 65e96945e4..0f79faa0e1 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 2537279d99..ebd99d0882 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 ff729735d7..5dcf65435a 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 ed325acd86..bf38cdb24e 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 bafd7d1bd2..a435fc1fc6 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 d5b6986e9d..ed40c4105d 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 fe52c21e5f..0c853a79a3 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 62db7fa3eb..f27fc576dc 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 1da4d40784..72b322178c 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 8af563b6db..b9c4d698da 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 a3751b7f5d..fa785558c6 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 df390e73dd..196d1833ba 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 e5363a459e..5f4664dae9 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 08b55e2366..444d4b93c1 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 389bfbd3cb..36e06157eb 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 dcfa1954db..0974a312f9 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 cc3a70a0bc..ece4f091b0 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 cf8a52cef2..cc2cce56d0 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 65fc3865bd..86e0418be3 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 c1c8830cb2..e9bdca8ffe 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 25a4172f00..9e6edf3b8a 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 a5315967ba..18161cb7d9 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 b64fab85f7..0a6c90a15b 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 c057251092..d220fa7fb6 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 61340d9df4..ccd298e262 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 0773b0079b..f39ee5e11e 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 4663cf579f..a7680b6771 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 30e384e0bc..4994ffddbb 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 6363ddf198..7c72068b93 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 09e73e4ea8..57ae3d10fc 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 6295d91884..c214bd3215 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 eefa54b949..668927f280 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 f0490e5724..3fe3b06bf9 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 f3e2c36ae7..b2ec33e67c 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 d178ef6c88..d201fe70ab 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 b13cf9ec52..177662c6f1 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 6deeff0748..edc03010a5 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 8cdd851191..5e4287caa6 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 14e6be4091..ed2c1a7d82 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 7d8b268367..a23ba89ea7 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 d534acc5c0..286550aafb 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 7d8b268367..a23ba89ea7 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 fac2fa3a8f..0ec8d9d854 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 c20f7a9ba5..1b3c2a17d8 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 eba1629045..ddbf61d9e3 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 1de0a0d6ce..8c204171e5 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 dfaa09d52f..02f627e07b 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 61ae1fd8e0..b4eca4629b 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 d99df20187..52a707a050 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 0000000000..6e5a8c9293 --- /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 cf4d1d98f6..305684b3f1 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0ab3a789b3..bd6feaf101 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 2a7ef92b0e..fe172b7aa9 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 0000000000..6e5a8c9293 --- /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 0271f7d2b1..74d981fa2e 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 b7f567698e..c1bfc9596b 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 6f275ad819..a39efca5fa 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 644b61ceb7..d179d63414 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 300f88ddc4..c331024664 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 0000000000..6e5a8c9293 --- /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 38496c01ee..cb70263e07 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 0e9381bd16..acd10f5794 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 266f74ce6c..6258ab61cf 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 f50a24eeac..e3edb991fb 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 b2dc9cb654..252b87e1e1 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 6080336c44..94c4f91abe 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 0000000000..6e5a8c9293 --- /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 521434d11a..996f5823a5 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 0000000000..6e5a8c9293 --- /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 a1893bbce5..c5d36b0dba 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 0000000000..6e5a8c9293 --- /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 b9ffb347a8..3eaf52e8a8 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 980c023118..4b2af95ccc 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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 0000000000..6e5a8c9293 --- /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 14139a2040..311a6fc2c6 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 f252518fca..b7effeac9a 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 f7fe15f27e..28772b25c4 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 6050207304..7127066c12 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 df10f39657..6370a98d6f 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 487f2294dc..f16a8cc405 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 48896cc868..c62cccaf49 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 6b2e5d23ff..6b753642e8 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 22eb2c1e70..ebee314c56 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 d19114286a..06439ef5cf 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 3dec14ffa1..6d4d31e013 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 1733cfdf17..0e4ef86407 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 a71ebe3ea0..db7dd9852c 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 9632cb372b..6fab542137 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 542c53f0c0..af00e027a8 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 fab8810ba5..00704aad52 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 22d84209b7..5ba66970d3 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 296588f66a..f948b11007 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 b67d70e057..ad4b78ae56 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 11fc4f00db..a001deee54 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 3180c54345..ad738c2131 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 e53d33512e..3e13c944a3 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 fac13ffe77..47180cf070 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 916d09a683..634e1f3b6d 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 9ad486f504..2b4edb07c2 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 908d8113b2..60f9c60e8b 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 f7a00fcfa7..d61ab9ce43 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 500083a7e4..803d058e0c 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 edf38b4fd3..eb02c27d74 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 2bf817daf6..32aa48328b 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 99905bba83..3e22c7cba5 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 11b2a9fc83..df10e978d7 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 5048ce5259..70ab49a801 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 76a10d2c97..2ea67ece4a 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 c4c65bf203..b447c2e44b 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 fc7ae97050..64a6d760d4 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 392018bb1f..d5a8a89ff6 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 656926017c..096164e729 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 bf651fb16e..fc5b04e103 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 7ccc661dd2..02db7d6082 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 0c86dc95d0..4883c76432 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 c5f38d00d6..54ed72d674 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 53a4500070..2d6c9c687d 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 473cf1cd2a..e9887441c0 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 b0a553263f..22a0152b73 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 9547e7b5b7..6f04234540 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 7140e3956d..77ec3bc45d 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 bbf303a1f5..cb6c71f06e 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 a44fb8ad34..90aad3286b 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 25eee9b3d9..52ba1fe06f 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 f2438f1561..c245e010de 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 081d5c858c..bb35af6337 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 f2ca1a19aa..5e44c2612d 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 ba7885f2e2..bef69802ba 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 8c4c45f9c8..d8a4c45301 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 797a64b207..7f4ba7ac89 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 2842c53598..e067002ca8 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 c380d8e562..2e73c109e5 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 e288019de0..93d8e43553 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 84b6d8aa67..0747ed4514 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 0b700b895f..db03b4af23 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 8d1c737170..98d65a2d24 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 1d5584a82a..bc890e9715 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 a985405c00..de31220ac5 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 2b4b19cde5..b069a5f0f8 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 23c653d02f..4b82173125 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 6920f56cdb..79f6b98625 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 a1039c2ded..50b4e4bc70 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 fa799d1ed3..cb718668da 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 508652a178..9296127a38 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 2c72ce72c6..9299689412 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 2a84e8b3fd..c7ef7f6587 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 0519eec87d..124d2b19a4 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 a4bf785dd4..d1324b9afb 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 0216302c65..91e30c7b1b 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 03e22cd72e..1d485c4be1 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 3e43f824e6..3de41bc891 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 3e82adeb2e..3c7e469912 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 58d904c8f4..3754767dd9 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 51afbae1ca..348b8ca6c4 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 67bd1bc560..bcb9ecac32 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 0000000000..644bfec5b3 --- /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 ca74767813..02a7d577e6 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 0000000000..b78e7d5828 --- /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 ed2fbed34f..fcd801616c 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 dbc477203a..345eae6f55 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 367a86eabb..7801c89772 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 067f6a360e..37cc69b676 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 6dd2974115..4d3d1c9610 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 3b569ebaed..8e6004d362 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 0000000000..cd33a4207a --- /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 d35e7f48cc..2553dbea74 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 212c2bff91..5785759d59 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 098b04a304..33280895ba 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 4bc8a956f1..5ec14e9ab6 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 2293be4b24..ab2d21195f 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 cb7767eba1..50f29de910 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 a1541ef68c..7c86a1ca6c 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 73b6c372b4..0000000000 --- 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 0000000000..f55e793ad9 --- /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 3b64b4168c..52a3903810 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 348b8ca6c4..57e23bee9d 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 27f3a88433..8886debd55 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 2191a8195a..e6e4415f16 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 644bfec5b3..7026aef284 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 cf14ffa3cf..ecd9ec405d 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 02a7d577e6..ad415481e8 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 0000000000..e1735d8151 --- /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 0000000000..6f709b3896 --- /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 0000000000..077a39bb73 --- /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 7973749aeb..8978bb14eb 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 25a2257dc8..0bd9fc1d9f 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 0000000000..5be8180dfc --- /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 0000000000..c77bebd296 --- /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 2a61daf25c..7825a4a84d 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 33a49773c1..352da3409f 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 0000000000..9d8f6a8716 --- /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 7fb1e4753c..32275bfbfb 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 2d381f81f4..2b025862ca 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 1984cf31d7..eb8a1b5bb0 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 ae1492d514..a95af83590 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 3edda00dc1..a180d448fb 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 0000000000..b3841ba87c --- /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 0000000000..fa58cfde3c --- /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 4096720d02..dfe406db41 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 0b96963199..a4148036eb 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 0ad425bc93..19051f906f 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 0000000000..98a78e17d8 --- /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 eb33565615..0acac0df43 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 0000000000..6fbabbc13b --- /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 c239b1ec5b..6a34670b9d 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 0000000000..f4d91ccc35 --- /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 6a2889e3e3..b66cfb8d44 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 7cb0a0a9ee..d959589644 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 0000000000..56d69efe36 --- /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 1786fad932..5b19b4ed66 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 fe172b7aa9..421ade3592 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 c331024664..97cf128fc3 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 c5d36b0dba..4fc85c4010 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 466b532124..cbc9428b2e 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 b93577a03d..ec39734573 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 d34ab0266a..6b71b1e8cf 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 698e6ddac3..8b428c1b70 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 5279bcebef..d8b14124c1 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 0000000000..4c40c30572 --- /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 0000000000..d7e51e5dfe --- /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 0000000000..1e705b37d6 --- /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 f1066fe289..ba005f04a6 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 5833d06c8a..ac20c989de 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 430720785c..6458553894 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 0000000000..2f5eae5a86 --- /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 0000000000..fe6686e7f6 --- /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 0000000000..4f9acf2a6f --- /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 3d64aaf3be..5f48b122e6 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 8e55bc2a4b..987ba900bc 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 345709eb7d..59e10a42c2 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 a1450518e0..78cb21bc88 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 66d3037b89..5dcac8b725 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 1a24c883c0..f8120d8ebb 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 e6d128d1e2..9167c8fcf5 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 ef534d0e47..7093bebf9a 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 8d51d5a718..b77b799900 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 5b5dcf8f3a..26bb5bfdba 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 93b781170b..8ee533521e 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 c2ba5a4652..aeb8cb7e4b 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 124366ba24..721d25d09a 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 874afb1858..59173e72fd 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 333baab1ab..19bbf8bf00 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 b37ad8c15a..387c42a35b 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 e1eb6ae77f..da19c42ed6 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 0000000000..dd91b04bed --- /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 66e791e627..f39525f706 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 0000000000..19d8de4bce --- /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 769f927ea7..dea1c36b5f 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 b4b6e40294..2aa783f7a2 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 0000000000..44c5c6ca32 --- /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 8e4e7e560c..457bba72bb 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 521e75ab36..975b62b3e9 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 26490e512f..6dee20a075 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 0000000000..b88be18bb4 --- /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 e6fe5707a0..68c1e8c813 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 4ebc4580ff..2af7624241 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 f5f21dcfe4..a5893c54f5 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 38133b1a47..fbc87c049c 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 3bae7386c3..3e0e523f95 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 fa7f6745ae..bdf3bbbbe5 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 0000000000..c08ddcba48 --- /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 0000000000..d18d19806f --- /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 0000000000..385bb95562 --- /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 fbc87c049c..c39d1760ef 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 620207c14b..498a960583 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 e58c6379e9..6989e7770b 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 6b84670391..f85425c575 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 0b5c8678f1..af323ecde1 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 7c86a1ca6c..00fd30b527 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 76d62bda60..6d312bf861 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 1f14beafd7..6971cc28fc 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 660e806596..ba9e971d02 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 eeaf6f0126..7ae2ae818a 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 0a17b5aab9..a03bc3ebd0 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 71e94997b0..05a9dee332 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 89e0eb7fba..5ff102ea48 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 e5bbe88edf..ca04dbefb7 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 75cc3126c2..ae50e14d40 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 1bf239852f..f87c66fe41 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 74ec59195d..3c2c03384f 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 c39d1760ef..7cd4accf59 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 6f013a52da..92351e4010 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 928c8d2a2e..19af428df2 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 0000000000..c52c0f44f5 --- /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 f2b32f4530..45886a86ab 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 0000000000..6c452164a3 --- /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 0000000000..3f8b8cc718 --- /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 ff071aed08..d1c9821f89 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 0000000000..4231e0268a --- /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 0000000000..dc6f2b5f52 --- /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 90dac7c7d0..df20bd5ca9 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 285bac2cb4..7af9dd3547 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 98c3012c12..b7925e0f72 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 0000000000..fd98cea97e --- /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 0000000000..b635fb6aae --- /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 0000000000..b024071faf --- /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 0000000000..8d51025070 --- /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 0000000000..35bbbebbdd --- /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 0000000000..c3cd5c0c71 --- /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 0000000000..dac5995aca --- /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 fc089e64b3..81a4aaeb69 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 1645b78295..f7296c9a4d 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 0000000000..84acd44004 --- /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 e9cb812767..51be96633b 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 0000000000..b9f694e470 --- /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 0000000000..f7a77f0d81 --- /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 0000000000..d34066b409 --- /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 0000000000..bc338149d3 --- /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 0000000000..c8945c8e49 --- /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 0000000000..c92838ea32 --- /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 0000000000..b261c40510 --- /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 a05f57f458..15d52149e1 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 0000000000..5083d17aca --- /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 77b842ba07..1ccf7aac06 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 0000000000..c1fb148004 --- /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 0000000000..d4fe2079d8 --- /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 4eee3f359b..aa02e3046e 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 f70cc72811..3d9126610a 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 e6e4415f16..f2f95963cb 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 bcb9ecac32..02ac81cafd 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 7026aef284..a292c3b443 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 ecd9ec405d..b22737519b 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 162d6400fb..f6e7039a90 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 c0c0c22f56..bf079e4c59 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 8e35b091b3..794f70901f 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 86c6a2d2c6..cd81d1862d 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 dd31116212..008d21c463 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 02ccf930c0..50bc8284b7 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 763c22499a..0e49301198 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 57eedd7885..0000000000 --- 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 07c77b806f..bffca81ab3 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 d20619c3df..1e434cd118 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 22df2e88d7..12b309b740 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 06bbf1b764..c7de86ba63 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 c16aa9d52a..3bb5d3ad4e 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 9b21c015f5..949034e6bc 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 e165b66f00..1e82d285ee 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 ab2d21195f..baa749166d 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 1a477ca4d5..d1a691dc92 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 254229d091..606a2f0f0c 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 9b56bc9f39..e27083d2e0 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 535c5add3f..6e3a5687db 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 0370843854..bae8b6ff06 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 85d1284459..be7d0aa1d7 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 960e2f22af..a47c1c4799 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 0c1c50e493..48b72d0de0 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 b0bf08cd8f..f801eedf73 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 65ee5b59a4..50fa03f3e9 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 14ebb5ecb9..2a7e59989b 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 bad618321e..72265a5455 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 b0571bb7d8..1f14d91e04 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 809d87e13c..496b996823 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 784fa3d005..1c6a72f27c 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 46dd3f25de..fe328c0560 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 62537be602..d364d76b2e 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 124d2b19a4..2187bcbc99 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 8c1078fb83..ae8ab0357f 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 dfa66b5844..f3d4344cd4 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 c7565881a8..d8ccb94fae 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 13771825fc..8d5229c994 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 a486772139..e093d02051 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 12bc234fc4..383afad1b9 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 1d92864aa2..47d8bce7e7 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 e269121086..2b2a75ebc0 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 4c613a286d..e3a89b8f41 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 185e9ab549..f4ad099be8 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 d0f343a21f..b9e22a7b04 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 2039f3f39f..b637e0de13 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 f714cee825..3ab8573edc 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 53ba28972e..0029ad0688 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 78471e703b..5b32593841 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 0e6a005d3e..e3e28ace1f 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 62ceae7753..efc9582e20 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 7af3fffd09..78512dba77 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 48f61ece4c..95c14050a7 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 cb1cd5df8b..60ab4cac7c 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 10735b7f45..22d3f52c63 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 d111aa9583..663ba3a668 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 e50a20aefc..7770ce3d0e 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 07ca543186..53a0c160e9 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 f580e7bc1d..347589c788 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 8e4acd1ad9..2ac026d300 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 90c9d4fc9c..e3b74d8157 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 354c69cd55..0000000000 --- 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 8afa6eaed2..29ea3c0b95 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 5afa10f3aa..f74398e944 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 a5f0c6ce38..814df01b49 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 0cd5c7d8da..fc6e426b8d 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 c0c77261e5..3f4bd769ea 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 650f95198d..0ca0b03134 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 d6e1156b23..0576a466d7 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 17a390fb57..c7b3aec27f 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 fb7739546c..2b63958767 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 7d55bd448b..b182dc6b8b 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 47157e64d9..a7300b1659 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 5346e2da3a..f104a37a93 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 bacd16f5f2..015df16453 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 4261608e24..e25ca1e584 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 dc9b4833aa..2d5c5bbfb1 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 b9f694e470..02027a84d8 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 5c70e37ddb..1764e6cc96 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 a3b34456b0..6a3d79e040 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 ef942394a5..76c12cdacf 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 44c5c6ca32..4d9783ca1a 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 4b257eca74..eb074e608c 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 d1045e3eca..f55ca58767 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 8692c42127..2d4b530cd5 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 a79bee5ce6..b82761461e 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 697b1466ef..f78943ca94 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 d34066b409..52e1d8165e 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 2952c8436a..962e8d3522 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 fc7f189bd0..f3b5fd5c4c 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 66ed7edff4..bb5ed67143 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 bc338149d3..4949ec80ba 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 ff7d2d82f0..c3a864565c 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 44d3ec5f52..fbda22c514 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 f905f7810d..1c73e74902 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 10e7e2e140..0d1eabc1cd 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 9ba9bbf49c..8c8c7b1e6a 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 8494f350b2..7d187994a2 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 7d55b1f304..a679b2fdbb 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 8a3d44f622..36081fe967 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 0577fc7d24..6c90fdbaab 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 d6dc5a3af1..97a945a5a9 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 7ffb6dfbe1..3d9d832c99 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 4c78bbb23d..3f9ee75b17 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 3135705062..c8b938ebc6 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 015b24848a..245260b0fc 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 ba02a718cb..03b14c51a1 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 fe4b8540f4..6d54e5a8be 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 50570f8f39..7b82a658a7 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 82e62e7dd0..6e15b01e96 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 2b6dff2c0f..90ea98f7a8 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 e5b81fe2c9..b20ed95b41 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 fe12c6ceda..c7831e31ca 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 d511994995..41d303b787 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 49d9e2974e..f865ca0002 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 65d0462486..1192ba544d 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 3668209ac6..d94b8965ce 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 5c66562cbb..7a15e5d35d 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 11447a72d2..3ab64dafa2 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 e2883db8d7..0ce98c7c4d 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 fd9f4c9824..f462f411bf 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 f70795f2f6..8574f4f34f 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 9052a22808..ce88766039 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 d1324b9afb..5f33549260 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 e5ea812a13..ef8f49ab3d 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 f5110e7bf8..75005e7cb3 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 c766993d45..96e0249df9 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 50f29de910..40f4e1f500 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 be5aab88f2..8c1c3fa237 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 700fd26aaf..d5f9d4e7cc 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 17cb2ad85c..7b294eddbb 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 183892042b..80c934c98d 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 ec4f7b41a2..399e30446e 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 a3773d8395..3a9766c207 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 84ffc93993..41138029e6 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 908a122daa..b4f5123d5a 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 1f69203992..3900d0cb5f 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 f02c5cebdc..c3c9193df3 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 99d21c2886..755ba7ae71 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 393d7f6b7d..f1bbad0ec0 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 a292c3b443..65d26a47f6 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 0000000000..118a5c964d --- /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 0000000000..8715bfb22a --- /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 0000000000..2c69d1c1bf --- /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 0000000000..40ccefb0c7 --- /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 0000000000..742f923198 --- /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 0000000000..36ce7786de --- /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 0000000000..b138be83e8 --- /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 0000000000..e0bc56da9b --- /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 0000000000..c484ebc458 --- /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 0000000000..1042bda1db --- /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 0000000000..57d644f0ff --- /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 0000000000..3a5c61dceb --- /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 0000000000..ed2d6bc2fb --- /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 0000000000..3e69ec05e8 --- /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 0000000000..dc8e2d498f --- /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 0000000000..311b3516ff --- /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 0000000000..cc160bf6e6 --- /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 0000000000..abca631cc8 --- /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 0000000000..aedf1bc5fe --- /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 0000000000..64159727e1 --- /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 0000000000..3021ac6fc0 --- /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 0000000000..39b6959691 --- /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 0000000000..38635ffa15 --- /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 0000000000..2c022f25ba --- /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 0000000000..75f35a48fd --- /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 0000000000..4a269befc2 --- /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 0000000000..c235a45361 --- /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 0000000000..9569b55f8a --- /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 0000000000..ca53ce780d --- /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 0000000000..25a9cdab10 --- /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 0000000000..c5dcc8f308 --- /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 0000000000..73e71a0f35 --- /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 0000000000..73e71a0f35 --- /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 0000000000..5dc1e78a1b --- /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 0000000000..292b4186ce --- /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 0000000000..b3377bbf11 --- /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 0000000000..1be9e2a822 --- /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 0000000000..0ccb6b64fb --- /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 0000000000..7d28e9b3a0 --- /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 0000000000..76ff4f8d5b --- /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 0000000000..41b261b92f --- /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 0000000000..679a9c0701 --- /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 0000000000..12901ae770 --- /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 0000000000..1f16215f7e --- /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 0000000000..65350eea60 --- /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 0000000000..b36d7749f7 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..fbedd03d80 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..7cbc4542dd --- /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 0000000000..f442b3e956 --- /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 0000000000..6e49f3139c --- /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 0000000000..c80dadbad5 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..4a834715be --- /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 0000000000..c9fbb307a4 --- /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 0000000000..ae95841c3c --- /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 0000000000..ae95841c3c --- /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 0000000000..26d1b60db7 --- /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 0000000000..fdccc24439 --- /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 0000000000..1fc2c848da --- /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 0000000000..582aba7c24 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..f7cd91ea13 --- /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 0000000000..6cf05d9675 --- /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 0000000000..6316af1892 --- /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 0000000000..715ef2c82d --- /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 0000000000..1210d512b3 --- /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 0000000000..1e5b40167f --- /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 0000000000..89d2b8e5aa --- /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 0000000000..63135ea5e1 --- /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 0000000000..ed650d7535 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..489ca49040 --- /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 0000000000..219b316890 --- /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 0000000000..88f28fd40d --- /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 0000000000..c80dadbad5 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..c9fbb307a4 --- /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 0000000000..518760278f --- /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 0000000000..c92e99488c --- /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 0000000000..f442b3e956 --- /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 0000000000..0b963871f6 --- /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 0000000000..83190e2c93 --- /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 0000000000..5bd171dfca --- /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 0000000000..2e7e568b00 --- /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 0000000000..140c06dbbf --- /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 0000000000..6189fc95e5 --- /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 0000000000..938dcac5fa --- /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 0000000000..48543378da --- /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 0000000000..a975126d9e --- /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 0000000000..f39ec9e654 --- /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 681acd6101..3489c8bc86 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 f7431ee79f..5a1552700d 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 df5855b0ce..e482cce526 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 410553fac9..c00fd6ad5a 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 acfd480e06..abbac44f2e 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 6b83daece1..feaef16fdf 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 053078c203..ced57c4fdb 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 d7be7f9248..76f06de9b8 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 1cff6db701..1c4cfe0087 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 501ca5f436..89b695da7d 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 e3e80942bb..414ffb92ef 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 e27cafce1f..857a460fa0 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 cb75480e75..4e8f6084b5 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 de52e9fe28..580b1f487c 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 f2c19a12a1..dc269b112d 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 59b0c47ddb..d7a25bb20b 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 7413799970..1f9cf968fb 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 2221106987..505e1a850e 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 1e9e403b00..e0e6e13128 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 b75600bf2e..d56b133539 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 7a40f7b941..40328574ba 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 7b40e7ffab..5120d529cb 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 6d43dd7849..90c3ddcb35 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 43fa21ce5a..adabb83ab0 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 d03b6c3032..3a1a73ac6b 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 04c1c0eac6..19c1a5ce6f 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 d19eabc26e..d9b5d81b46 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 1095136717..5a36b35d02 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 4c625cdaf9..8e4bc821fd 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 9f20561b9a..777e1e992a 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 fb818140f8..c3c9aef22c 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 981bb3f877..95ce591747 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 806d986f85..4c839fc9e1 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 5686ae42f1..4e3439dd62 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 8f8a98dc28..7c129cba3a 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 f40527697c..5194e799b1 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 7504155ed6..7b2886b660 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 d8c1bd75d3..605085af1f 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 39c073ad5b..8c83b8c024 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 62d7bfac76..7cad7c1ac3 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 704ef78465..8ae4a5481d 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 1687e39368..f3473fd319 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 fcec0623ec..d4e7dd2ec2 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 0fbdf397d9..76e8702e8f 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 ab56e87215..5eaaeac8cf 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 c3090fdd2c..551c5cd294 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 528f0ca601..ab24369923 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 62507451e1..43770d1767 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 697fb332c7..353acfe2fb 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 3fe44b47c1..a454a38fbe 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 fa22af87cf..f91b2de241 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 46079d0400..c42af14f03 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 f5eb89f9e4..5283797eb7 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 a9154d11f4..9a935079d9 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 e94b35dfb5..f8edf64daa 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 117bf40d27..9cf2b5d70f 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 ae3b8cd785..965b12ef1f 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 f2ab2c7d5d..3cc4388330 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 f5bdf90b9f..971b4653be 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 010f8dc827..9b3a62331d 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 e329f1208a..9fe84c532d 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 c435eedd3c..4a79f9cefe 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 fb22747348..d594922cd8 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 5a08b7f07f..d8866051c6 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 0c50069f7d..82e4c122c3 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 2749cd6524..c7f2c32b4e 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 14a73c551c..ada76676ca 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 d325b036ad..2c442f5c3a 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 90571a9c6d..f53113a6b6 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 3ac89b1c96..268c82bfcc 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 55a12a37f0..c28790288a 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 f942600010..69e8ea6d38 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 2c50b00fc1..1a9463da15 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 cc96048b37..8258c0e86e 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 1784dd5515..1d2a5edd96 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 6b4031efb0..376da5c390 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 eb4169afe4..a655743685 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 0000000000..558f49fb09 --- /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 0000000000..3e6de5ae7e --- /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 a9342c8c47..3caca9aeac 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 0000000000..3426337861 --- /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 5c33ac3c96..24af5bf309 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 247a4e96da..00c7bf78d8 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 0000000000..ba8f7ec16f --- /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 220034d23e..7946020e1e 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 2b319c4a8a..265d423fee 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 0000000000..d35aa5e86e --- /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 85b6be1138..05f7a455de 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 861d9c1327..bb52cc9d0c 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 0acc0e5c98..13c676dffa 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 0000000000..a8fc08d0da --- /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 0000000000..6b9d2ee0eb --- /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 0000000000..ea6d95099a --- /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 0000000000..282efed45d --- /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 f87f1b79b8..a57315a9ec 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 0000000000..bbf257ca18 --- /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 0000000000..b04df44946 --- /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 b249a16c9f..d617a9d38f 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 0000000000..aeeadc1438 --- /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 0000000000..fe0f0a1086 --- /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 0000000000..b21763c9be --- /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 0857f0665a..5bef0c6fff 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 321bc44244..97cc34b29b 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 6c0d32f42a..c12dbb7648 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 0000000000..7de5a3c5b7 --- /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 0000000000..8391a34d2c --- /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 6f26cc99e2..f65ec99619 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 0000000000..8901d664ee --- /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 c1125be31b..6e54256780 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 274aa8cb4c..da6c981eee 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 90b9b1d43d..fd9b6b7308 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 0000000000..46bcb39baf --- /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 36705dbcef..acabe6d984 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 0000000000..6b479d22a8 --- /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 c817f7830b..b1125b44cc 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 65e4433f5a..e062346402 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 0000000000..85fe22c576 --- /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 0000000000..541e5a658c --- /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 0000000000..821755f7f0 --- /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 0000000000..eb827764e1 --- /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 0000000000..c8b6740e26 --- /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 0000000000..8f09efc1d2 --- /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 a02ea1c196..1d3a7a1efa 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 29539f78ea..c2bcab535f 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 e5b9b6f64c..8747f1ed7d 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 12e125f4f6..9ce415cf8f 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 e0c0c8ba0d..d90bbc9154 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 27a4106f3f..2a587d4640 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 bdecd6454a..de9fb58eab 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 53a12848c0..f39a1660bb 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 30d5b4b602..2f9be096d7 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 b5eeea4685..3e68336bf3 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 e02232f027..f8791895d5 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 6f696a7b1f..3b866a326b 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 ea7e20a920..7a2a60b1a6 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 d4527c69ba..d27b903452 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 bc26b8f5ff..6b3feb4bd0 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 efb460f0e0..94dfbefb86 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 dd9004a6b1..3821a65e08 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 b24954bb95..cc2197ffab 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 5ce4086ce1..70743f68e4 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 65b6198c9a..96e3d92e06 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 e7c68a67b7..e76a714d5b 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 1e9fe221fb..d260691eb9 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 3f71608800..da0430346a 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 0039e484a0..3229e9f412 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 2b21e1c055..6fba5772a1 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 780599c216..509b801fa6 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 93b9067414..55fb20ef45 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 7ec8e2418a..01d6643b63 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 f62d3de925..c16b0c1026 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 22de0b870e..2da7a0ee4c 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 6d4aeaf21c..311e05fa19 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 6ce77e0cd9..3d2b56ba46 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 2b782dd5c3..17e6dfa9c8 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 ae69e238ff..e0df96e036 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 1696fb3d6b..69cb3f0e81 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 7187dfd0e8..1b0ae2a74d 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 cd3ad4ba29..a1eefc7857 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 06429d200d..e293b41122 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 f82c899184..3ff8ed3da9 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 0490f2f7f9..2efd9f1354 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 0edb0b06e2..173b1c39c5 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 75a12da869..87934f8e90 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 ddceeb5c5d..b8a4f1ab29 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 434c300718..ae4fbe3650 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 bd9a4a659c..10b7eebc38 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 425cc1bc94..d2c60aee5a 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 0a5e46514c..12272affdf 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 4b915da356..d88e9f9c9f 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 f7ee20987a..e6b9563482 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 7b3b4bb9f3..1991d053f6 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 0813701928..83d273dc4d 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 e4d6c2c823..c679b270e8 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 1054d22b2e..53ad8c9094 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 5ad62a7877..972d1210f0 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 74a24d2f91..bb597971b0 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 a53edc2ab4..d3ac36bf0e 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 ca258dbc9d..56c8b5f718 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 ee6ddcd32c..a78bfbe304 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 676f6f9dee..0fbacf5ccc 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 5adce28ab0..7c6be84d59 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 5a0255e74d..fc092c7c24 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 59f8b132e7..f14d177e89 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 01cd9146f4..4f8f9cebe6 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 5159d8b9f2..e022fac379 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 94e2e76d91..d46be650e2 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 0a86c59934..b8bf1b1bc0 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 7f47a67ba2..28d9743c07 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 d7191e0a31..da2df2461a 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 1c992f4351..3a5f2676ac 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 bdceb09dae..28d6ed8842 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 bdbe41fbcf..501af05c2d 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 51b6add6a9..2ba841ea13 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 6a0eae5d05..5cc039b8e9 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 67b85faf80..5d78dac5ef 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 2ec3e6deba..6b7e206d4c 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 0000000000..533b050087 --- /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 0000000000..4dc0cbf56d --- /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 0000000000..76d41381ea --- /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 0000000000..af5a1d1c64 --- /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 0000000000..85ad9be771 --- /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 0000000000..765ef3f1ce --- /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 0000000000..92f6c37c4a --- /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 0000000000..2e6c49d899 --- /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 0000000000..364c1e6a7f --- /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 0000000000..377d161111 --- /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 0000000000..a9d5176d84 --- /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 0000000000..d42bb67a7c --- /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 0000000000..d42bb67a7c --- /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 0000000000..9c8a688873 --- /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 0000000000..1d581a8099 --- /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 0000000000..20d20198cf --- /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 0000000000..c0fe052d97 --- /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 0000000000..a9d5176d84 --- /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 0000000000..a9d5176d84 --- /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 0000000000..9fecfc15e0 --- /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 0000000000..22bca4eea0 --- /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 0000000000..af5a1d1c64 --- /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 0000000000..5af915af6a --- /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 0000000000..cdc8aef914 --- /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 0000000000..39fd058fbf --- /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 0000000000..578f496e7a --- /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 0000000000..b31bce51bf --- /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 0000000000..2ad5a773f2 --- /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 0000000000..baf560f557 --- /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 0000000000..a36d5e3980 --- /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 0000000000..7ce7b3aee4 --- /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 0000000000..1a6f96ff9e --- /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 0000000000..2e6c49d899 --- /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 0000000000..4ee698511e --- /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 0000000000..a50d79febc --- /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 0000000000..d36d6a60c2 --- /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 0000000000..d36d6a60c2 --- /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 0000000000..8ba4a19e64 --- /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 0000000000..76d41381ea --- /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 0000000000..522cf4e238 --- /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 0000000000..109203867d --- /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 0000000000..a9d5176d84 --- /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 0000000000..dd710dddef --- /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 0000000000..1ec9bf6a48 --- /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 0000000000..5699356f67 --- /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 0000000000..616dac85b1 --- /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 0000000000..82e4090361 --- /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 0000000000..2a1a63c716 --- /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 0000000000..e98a4cdb79 --- /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 0000000000..fce4c42735 --- /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 0000000000..8c321e51de --- /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 3006b8cadb..3b5266ed09 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 0000000000..e793b8a61f --- /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 3a3485a3be..da64d5e489 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 cb941e6788..0957dabe35 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 0000000000..2ae1c0fe16 --- /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 ffa68b094b..be8ed7dd5f 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 55a079ca42..38f0975720 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 0000000000..0ade7a09c9 --- /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 213d947236..0db078b845 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 f6f3a378eb..60a844a173 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 02fbc46525..9b7a472208 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 0000000000..6dccfd6054 --- /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 0000000000..7870fed8bf --- /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 0000000000..960e5fa593 --- /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 0000000000..a33c9bf4e8 --- /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 f5b2e2bfd9..ce5f0e4db8 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 0000000000..63d106094f --- /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 0000000000..27f4ed3d2d --- /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 0000000000..afbb516a8a --- /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 0000000000..e793b8a61f --- /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 d53e869e07..0286d3164b 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 0000000000..d228e3312f --- /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 0000000000..0e75343c31 --- /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 0000000000..3b543a371c --- /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 db897b68da..29c3f16a18 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 0000000000..27dc24d028 --- /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 733d3a8de8..a6eed61f1b 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 7120b1bb28..ecd276a8ec 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 7668dfa5ac..295919e27b 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 0000000000..cbaa6c032e --- /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 04d40ecf9b..552def8dbf 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 0000000000..4f35d2212f --- /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 ef174e7233..e713441bb5 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 0000000000..5b1e664224 --- /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 caea4c6c97..3a1401e746 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 438822a97f..8bf81d8503 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 fe1323c674..5ca84a4b3a 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 0000000000..597060def8 --- /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 234146e2e6..25064209e7 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 ec5d57daa7..1e89b6eb75 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 0000000000..fc106a1225 --- /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 0000000000..63a898f407 --- /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 0000000000..efa686ba70 --- /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 0000000000..bdc2f8a378 --- /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 0000000000..d7b293c542 --- /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 9ad8e67e6b..ed74b1bf8b 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 7b48833dd7..5124c449d1 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 0000000000..a569c7548d --- /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 e1735d8151..f46ff584d6 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 9332b67d23..04ab583073 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 6f709b3896..c6fe7db443 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 7c24e94b55..afd0f0d758 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 0468cb57f9..cbafa3c4b4 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 0000000000..d818bda11f --- /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 077a39bb73..33e8d71bd6 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 0000000000..99ab83a39c --- /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 8f8c84b952..cf2c87f4c9 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 6c5e66765b..bf96f4c3d5 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 c89e9e5964..6d9edc1fca 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 1067e85f1f..fb1a142039 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 8a01f48e7f..6d45347808 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 5ee8c5eb77..337f5b624f 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 8c805c6cac..7773a02d0b 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 6e5b1668ae..9dba52055a 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 88c6677f1e..77bdb4b6bf 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 768d76deb8..7631709d0b 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 9b3c75bffb..5b79c87c17 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 6ebb11f729..d8d49b0b3a 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 4563adfb0d..2dfef67fb1 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 b2cd8953d6..c612e5f898 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 4d888941fc..94f23b8b5d 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 3616626b12..b59501e8cf 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 b921f2914c..66c4df1ac6 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 e1b7cc0aec..91085e32ba 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 8843d7387a..ad6372c423 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 025fe7674b..cf268cb456 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 0000000000..ba22ae540f --- /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 0000000000..bec892cb35 --- /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 0000000000..6552f959be --- /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 0000000000..0f65da1b8f --- /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 0000000000..3209d2e34d --- /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 0000000000..1ef286616d --- /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 0000000000..89ab8601d0 --- /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 0000000000..ba22ae540f --- /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 0000000000..ba22ae540f --- /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 0000000000..a2481a086a --- /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 0000000000..0eac68d8a3 --- /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 0000000000..38a154a4b1 --- /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 0000000000..38a154a4b1 --- /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 0000000000..ba22ae540f --- /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 0000000000..a478c39e27 --- /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 0000000000..15fc7951a2 --- /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 0000000000..9a11644e4a --- /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 0000000000..ba981a80de --- /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 0000000000..01d71d8e12 --- /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 0000000000..5bd795c98f --- /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 0000000000..0f65da1b8f --- /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 0000000000..27caf39186 --- /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 0000000000..6ee3308d41 --- /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 0000000000..ba22ae540f --- /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 0000000000..09c1bccc8e --- /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 0000000000..38a154a4b1 --- /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 0000000000..f81d502bfe --- /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 0000000000..7e52dc3b9d --- /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 0000000000..5c2ca2dd4a --- /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 0000000000..4048cac0a3 --- /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 0000000000..ba22ae540f --- /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 0000000000..ba22ae540f --- /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 0000000000..0f65da1b8f --- /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 0000000000..f813b69b68 --- /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 0000000000..c83427ddc8 --- /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 0000000000..c83427ddc8 --- /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 0000000000..0eac68d8a3 --- /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 0000000000..e62c8f2897 --- /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 0000000000..f529e83a59 --- /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 0000000000..83ba7739cd --- /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 0000000000..ba22ae540f --- /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 0000000000..8194b8c28f --- /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 0000000000..ec9862732c --- /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 0000000000..1e330ed3f5 --- /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 0000000000..6552f959be --- /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 0000000000..4ee82e7a46 --- /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 0000000000..5b4f640364 --- /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 0000000000..3953cc1428 --- /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 0000000000..f3d16970c0 --- /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 0000000000..08b8206449 --- /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 0000000000..f1a15a7a82 --- /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 0000000000..f3d16970c0 --- /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 0000000000..4183534642 --- /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 0000000000..f3d16970c0 --- /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 0000000000..cc881ee406 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..7203c2118d --- /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 0000000000..cc881ee406 --- /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 0000000000..e3c81d8bb6 --- /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 0000000000..e3c81d8bb6 --- /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 0000000000..1003a79e3c --- /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 0000000000..f3d16970c0 --- /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 0000000000..da13f0eb55 --- /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 0000000000..f3d16970c0 --- /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 0000000000..bbda5dfdef --- /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 0000000000..f3d16970c0 --- /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 0000000000..e1980ddd88 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..dd0f230556 --- /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 0000000000..f3d16970c0 --- /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 0000000000..b15ca27014 --- /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 0000000000..14b7f2226f --- /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 0000000000..6cd37d2c0a --- /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 0000000000..2079917030 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..cc881ee406 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..a72d99e23a --- /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 0000000000..02fc2b75f9 --- /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 0000000000..cc881ee406 --- /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 0000000000..f1a15a7a82 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f3d16970c0 --- /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 0000000000..b11756de7a --- /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 0000000000..adeed7fbf3 --- /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 0000000000..f3d16970c0 --- /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 0000000000..f1a15a7a82 --- /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 0000000000..2636db35b4 --- /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 0000000000..5d04ffdfc0 --- /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 0000000000..1cc988e8be --- /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 1a882fd23b..746278595d 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 bf99c857f7..0b35829330 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 99138d8365..79694e427c 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 45dcec6023..3230e215bf 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 d2f01f33bf..5a87e714bf 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 2a386a2c08..81ba045724 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 f23bc80877..c4374997d8 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 dd52c6360d..3a5f565323 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 a98a23c7f0..0e652624ef 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 b004a2113c..a4fef5a7c5 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 95646e7c7f..019561c2b8 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 6d11110f1e..e3f09f8b09 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 28421b72e1..83f0f959c7 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 80d59ed8f5..f4d66facce 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 e7180c39a9..ba3cdc0645 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 07660869db..f078c7c13e 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 a5ebfa778d..c41b240779 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 0149962a5e..9ea5e36b37 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 dddcb78690..b22c25f129 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 f51d51301e..0c7d56d3ad 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 ee5fddaff7..de041d89f8 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 2dff5973a2..26897da5da 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 76a9f0d2b0..25c0adf866 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 2eb62fd0a1..dcf0391c42 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 1595f47e55..4dd8c04c38 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 a44b3d91ed..fae0cd417f 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 9fde52f421..eb4e930af8 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 c712eef688..937604b100 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 e430e4135c..9806057716 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 9d0e96167a..7e75cfce4f 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 906f939166..9f834a9899 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 b95cab0f44..0b7101b5cc 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 0000000000..89e000dff1 --- /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 0000000000..05fc8ce111 --- /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 ac1b05b096..9d918323c5 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 0000000000..e8feb64aa8 --- /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 bde91c26b7..5d6c73db05 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 0000000000..37d9647e01 --- /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 0000000000..0f0d63a675 --- /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 78731dd157..cbb10514f8 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 444c2cc460..c48a617f67 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 0000000000..a4e6c9aeea --- /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 2a56426e98..e759dd7525 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 f3b861b919..a7de025af7 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 e873427e69..25731f3b3a 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 0000000000..6c81a5c1f7 --- /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 0000000000..4eb0277b45 --- /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 0000000000..307571e2bc --- /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 0000000000..592325be44 --- /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 0358a60f18..c4b087e22b 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 0000000000..e8feb64aa8 --- /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 0000000000..19a1456e97 --- /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 0000000000..543b7d5125 --- /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 0000000000..e8feb64aa8 --- /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 38d6cc6882..dd7b55ba04 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 0000000000..9b63c0e17b --- /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 0000000000..7834c7ddfb --- /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 0000000000..8d3595d316 --- /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 25a09b7d66..566d431a7b 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 299172958e..769e029303 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 2b6ca061fd..a66dc68749 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 0000000000..70acb19f05 --- /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 0000000000..e8feb64aa8 --- /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 87e16c1c88..58f2c37536 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 0000000000..e8feb64aa8 --- /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 f2a09eee3e..5d9a8793c5 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 0000000000..741ab50a8a --- /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 0000000000..3633e0fb2f --- /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 0000000000..741ab50a8a --- /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 6a9c52be20..04d324fb78 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 0000000000..2a1e7aecb4 --- /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 ecaf24fed8..e4a6c67cc7 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 51fe054054..64e4c06d95 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 0000000000..d96cc9128d --- /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 0000000000..f80100c2fa --- /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 0000000000..899c176618 --- /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 0000000000..53b5ff7ba6 --- /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 0000000000..8602253dd8 --- /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 3459ef3b79..4be2137810 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 28ff10f09f..2e7c1839b0 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 0000000000..f4542971d3 --- /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 0000000000..b24fff873a --- /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 0000000000..2ac14a9221 --- /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 0000000000..099945f620 --- /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 0000000000..ae7c391ec1 --- /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 0000000000..2ffb94dc97 --- /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 0000000000..f4db7378cf --- /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 0000000000..099945f620 --- /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 0000000000..099945f620 --- /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 0000000000..fb24cfd0b8 --- /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 0000000000..26ff6b741b --- /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 0000000000..ae7c391ec1 --- /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 0000000000..ae7c391ec1 --- /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 0000000000..37e0a4ea1d --- /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 0000000000..ec5c8134eb --- /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 0000000000..d5527516e0 --- /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 0000000000..30355fa7e1 --- /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 0000000000..1989aecdbc --- /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 0000000000..26ff6b741b --- /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 0000000000..42c5ef0793 --- /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 0000000000..099945f620 --- /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 0000000000..2ffb94dc97 --- /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 0000000000..011aa485dd --- /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 0000000000..099945f620 --- /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 0000000000..e4b36d0877 --- /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 0000000000..c496e55f60 --- /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 0000000000..5b70415caf --- /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 0000000000..666a190572 --- /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 0000000000..0fdc255715 --- /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 0000000000..099945f620 --- /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 0000000000..26ff6b741b --- /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 0000000000..099945f620 --- /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 0000000000..099945f620 --- /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 0000000000..ae7c391ec1 --- /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 0000000000..ae7c391ec1 --- /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 0000000000..26ff6b741b --- /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 0000000000..2ac14a9221 --- /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 0000000000..2ffb94dc97 --- /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 0000000000..099945f620 --- /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 0000000000..8115938bd5 --- /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 0000000000..8be8e71bf7 --- /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 0000000000..8b0137018f --- /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 0000000000..75194b60e1 --- /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 0000000000..29fea28b28 --- /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 0000000000..0bb5901218 --- /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 0000000000..de0ac73312 --- /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 0000000000..37ccced461 --- /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 0000000000..b74d6fcd9a --- /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 0000000000..753558615c --- /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 0000000000..e0183cbce8 --- /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 0000000000..60795341d2 --- /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 0000000000..3bdf3862d6 --- /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 0000000000..8f7dfbe50e --- /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 0000000000..20d6f8feff --- /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 0000000000..b27eaed6e9 --- /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 0000000000..aafff25eba --- /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 0000000000..642c5a64ff --- /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 0000000000..54d9f55a04 --- /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 0000000000..2a05f60c1d --- /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 0000000000..bdb615bfc1 --- /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 0000000000..679432e2d4 --- /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 0000000000..8a4c2d9cd7 --- /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 0000000000..85516ffaf8 --- /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 0000000000..0a6f93565d --- /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 0000000000..54d9f55a04 --- /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 0000000000..05a5a43f51 --- /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 0000000000..eeccec319a --- /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 0000000000..60795341d2 --- /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 0000000000..863f34a269 --- /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 0000000000..d7cd9c6242 --- /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 0000000000..3cc821278b --- /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 0000000000..ec14e3986f --- /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 0000000000..7ee70b92f5 --- /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 0000000000..e2aec03cb1 --- /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 0000000000..b95eaea734 --- /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 0000000000..714b106884 --- /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 0000000000..b27eaed6e9 --- /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 0000000000..2b3dcdad5a --- /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 0000000000..b27eaed6e9 --- /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 0000000000..00e93934f9 --- /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 0000000000..20b82694d3 --- /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 0000000000..3bdf3862d6 --- /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 0000000000..c407b2a70b --- /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 0000000000..cb8c411d68 --- /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 0000000000..dcb27d50d6 --- /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 0000000000..8a24231aeb --- /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 0000000000..ec14e3986f --- /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 0000000000..8f3118176d --- /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 0000000000..35921d062e --- /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 0000000000..eaff120695 --- /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 0000000000..713b6c28da --- /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 0000000000..d8fdbc9b4d --- /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 0000000000..ca605ebd37 --- /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 0000000000..cfd34df797 --- /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 8c8cbf8f36..a7fff4f036 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 75b269eee9..fb256e52f8 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 99adbab2da..56e7d591d6 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 25dd407045..5cd4b98faf 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 f853e2d5a0..b29decd38b 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 587bae0d5e..6c09ceb725 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 03911b41cc..e1da9263a0 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 a3ed82dddf..6835914c51 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 5007a0e42d..f790e01871 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 552e90dd42..33ac306ce1 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 9deb850b02..cd9ac7a397 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 dea49b78e7..e010aeb3e6 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 feee254793..46fb120375 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 2d053c6b44..328b113a18 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 7daaef692f..8407a8429b 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 25518b5efe..993a66539b 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 3c77909172..d97fe244cd 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 8ba74734a7..60a26c2102 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 56c4fdb377..a96bf8bd43 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 d91499dd0d..c44da0ab21 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 c9b42c4911..c368b5af56 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 3d00dd1f6c..f2aee659bc 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 d75a5ef470..f388c73435 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 a96f48c970..91bd835de7 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 c228878666..21a72d80f6 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 211c97cd68..fcee85c40e 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 129d96ee18..26b40e06eb 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 13f65dbe41..e549a67469 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 b0aabd40c0..916a3e1d20 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 dff3b96558..359f15b332 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 85183b917c..4660aa81ca 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 75e271a297..7a39c547c8 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 80d1f452c3..4ac4358dfc 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 36ab96cb8e..5bb92ac117 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 5de83e5fb0..22d5b893e4 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 0000000000..bd80a5fff7 --- /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 0000000000..da5bb48f0c --- /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 4651fb4aeb..8c7ff4baae 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 0000000000..8fb2faafcc --- /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 1a0f054469..cb42b90653 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 bed9bc976d..447890ba7f 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 0000000000..0c539f587b --- /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 29691b4154..e4a4d62781 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 9a9f0be21e..dbe6c53509 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 0000000000..a45ed3b547 --- /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 e529d6e77d..4bd1c90143 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 0000000000..7d5ad113b2 --- /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 04efe4964e..5232baf8ca 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 0000000000..361a6957eb --- /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 0000000000..3985fed6db --- /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 0000000000..183ba79e06 --- /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 83bd5df826..3033958d93 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 0000000000..1ba4c09948 --- /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 0000000000..ecc19f2f84 --- /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 0000000000..8fb2faafcc --- /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 5e91736a26..b6b085ce9c 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 0000000000..8f24a7993a --- /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 0000000000..5a7095ea35 --- /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 0000000000..a62aa376d2 --- /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 1e2e85821a..feda2c458c 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 ae67663f46..b0a10cd63c 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 4cbbf34887..cea00af3e8 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 0000000000..5cc8740ed3 --- /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 0000000000..91d23a039a --- /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 472583687d..10539d6204 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 0000000000..d12951fe90 --- /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 ce035b2533..fba3c76078 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 0000000000..4a016c9ec8 --- /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 6234d2685f..2cfe9c7671 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 0000000000..876aefaf6c --- /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 97a8a8ba1b..32073d7c3e 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 0000000000..ca2ef720cb --- /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 818f17d58f..10d72af13d 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 906768d3eb..1bef92f8de 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 0000000000..dfa9112d5e --- /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 0000000000..6ffc0e869d --- /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 0000000000..73d4b523b8 --- /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 0000000000..c1c4b89a36 --- /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 0000000000..f2d92c12f5 --- /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 0000000000..b576d35055 --- /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 d91010e974..f525da61ff 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 c3f714bf77..dd80874ada 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 f5338e85d3..35d2dafd33 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 f8e21aa44b..230bd7ecbd 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 ad5fe4dc52..ac7df0863b 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 4540db5f25..f66f360d09 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 5069457a4e..3facdce66d 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 375a4b44fd..b774ac67ed 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 5a14325246..b15a9fae26 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 cb2118c3a0..eef3afdc5e 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 78cd905a41..72d5acd97a 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 90d9c0b0ea..129da9b87d 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 ccd4903bba..4fab38c911 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 c01c8a734b..0e0db0c907 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 c8dbbcbbba..42d13cf684 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 fc77fdc9d3..e4444c3f0c 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 6e8a55d56f..294e14b107 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 b8ba5afe94..7e8f008619 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 a5ca34285d..a7b57fcb75 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 005ce5910e..f48d729b83 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 2058992de2..0825d6ed39 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 d8f55ea605..4d01bb3e14 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 92898ab0f9..57b891d1ad 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 6bf389bcb4..bab5411868 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 84fbb18039..97b44175a2 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 a626e78047..2e91223b27 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 6be08699b8..9cdeb87ef0 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 eb511dedf8..07f0e91489 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 01c1097673..bfa31d9398 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 2732c6e94e..9fbf86780b 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 117fc3e339..1a95816dab 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 96c85cb482..3f26699635 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 e64ddeeaa0..ed756dbc2b 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 dd415341f5..60772a762a 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 85463ad1fb..d14cf775ad 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 e7c09897d4..9dd6fc8f83 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 ced8249c85..4f2e6e8d26 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 5bb9a4997d..ef2688f413 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 8978bb14eb..4ff508451d 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 54487db6c8..d2c55261ae 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 a7675305ec..4007c23d2a 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 bf52e00b9f..193ad115b0 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 30264b9c82..bea2f2e009 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 b08157ecbc..b521fdc040 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 18418b375a..d48c695a34 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 5345db7b04..84a4389657 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 1d73892e2b..759e6340ed 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 0798e8ae73..1cf09bf8c0 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 6cd97221fd..7d7ab2ac67 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 f9c2683ff5..933b48ca73 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 40c51f99d0..07213aa953 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 a747823968..0d7cf62f26 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 0000000000..b5f17b7b6c --- /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 0000000000..210306752b --- /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 68affa5afd..4546b7777c 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 0000000000..e02959cb4a --- /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 3a95841559..21bb882f72 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 7e82f1a34f..b03a107fb0 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 0000000000..a43481ced8 --- /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 d714b5b7d3..5313afe53b 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 90a81db6b9..33e2d407f5 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 0000000000..4a8c6db80e --- /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 1022608477..7a9cad1d87 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 cfbf7bcfe3..2943fcb0e0 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 cfbf7bcfe3..c9c5ab444b 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 0000000000..343c22aa45 --- /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 0000000000..5df0204959 --- /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 0000000000..82c64c4704 --- /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 4c59d5ea1c..1546d885b9 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 0000000000..d68f6442ad --- /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 0000000000..dba6c44f4c --- /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 0000000000..e02959cb4a --- /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 7302f40df9..794eaeb2c6 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 0000000000..52323bd892 --- /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 0000000000..06d58c2649 --- /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 0000000000..55dfbb4dcc --- /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 112afc6689..0cd34c90fd 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 1834767222..5202f8b6f1 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 2c49f69266..204488d856 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 0000000000..0e4d636cb5 --- /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 0000000000..574645aa53 --- /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 31ab788f17..73d583cdcd 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 0000000000..420fab8649 --- /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 3930031ad3..1bdee10384 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 0000000000..299568d752 --- /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 8a8f662183..193d1622f9 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 0000000000..93c8ffc041 --- /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 58767361fd..6bc3e75e0e 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 0000000000..134b52d047 --- /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 11d876883d..36c1ca747a 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 70287ad318..df0ff63f23 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 0000000000..fce36c0038 --- /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 0000000000..259d249037 --- /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 0000000000..c899992ba6 --- /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 0000000000..ca99ed4372 --- /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 0000000000..26d1be1972 --- /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 456e09ebf0..83595d2b67 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 6611cb0c27..e4adb451c2 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 e7b2842e0d..069545d93c 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 3d06f8cb9a..17dd38ffb2 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 69db954c6f..3ad8ba78c7 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 2d06efc2fa..bcab485a51 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 199a1a83d7..cc65084d5a 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 f5f1633dfd..cc9eda6a96 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 b3e07c6fb2..1aa3d23cb7 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 ff8394ee0e..a25f2db891 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 e4aef55135..81de11edbd 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 c042737ff6..d44e7f60cc 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 717f037a83..fe31d88e5c 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 2ca23b9c42..ef49094efd 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 d3a4fdc186..a10adda670 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 5590df8dab..4739537179 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 7b97ce66a1..8abbc221b7 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 a1d35e134d..3b939a9f36 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 d8bac88ebf..3d4ad4ca34 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 18144097b4..e6ed255e6c 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 c8e5424ee9..15ecb63392 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 28ee1a39db..742302dcd1 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 5ebf8da8f7..bd3ae17ae7 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 7fd74e1d00..8ae8cb6f78 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 3943e5f07e..a9c9316e60 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 e9c3621c95..98156c3c70 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 bd18159b13..0b3fa8f29e 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 e7b9c7db6b..e271497ae3 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 6e69dfe825..a69cc9c32d 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 0847d858f6..d165476de6 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 cafebc6426..3c740c8966 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 49b5bb311b..8c3bbb94a8 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 4b7bdafb9e..1fb8b72cde 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 62cefda80a..9e0906ea2a 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 a12229a12d..23010c90c1 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 e83fb1547e..a453809948 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 a0919a7729..19387c68db 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 98fb3f6519..6546dafc13 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 dce019b8e3..9bd469ee4e 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 fc31a6e1af..ad9d99e555 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 8776359503..7e3ba80377 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 d87d5004a8..70717aef6a 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 be74bc781d..95a7cfb308 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 0bd9fc1d9f..c08c666d6f 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 d721ba4671..72632afed8 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 1c2d53870f..b41931be82 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 04462798fc..158b783406 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 8baf1e12cc..c6a638f253 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 0000000000..336a40904d --- /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 d751f51edc..b751d1bcf8 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 6fb6ef757b..773bc6bd11 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 db6c064331..916c700a18 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 c7db0e1cc0..27af2cc098 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 f9567c9a78..d0be33847c 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 58c9624857..a105296f81 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 988d789d3d..26260e38ca 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 6e783913f6..46e56ce8a1 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 c37646fa6e..4910991e73 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 10591facd0..428ce78229 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 c946ef74a9..1973c3ab8a 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 ab9bb411b5..adcee0b084 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 94c9e1f35b..9bb62c258c 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 b925aeaf26..560fe4cf4e 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 48d36c53fd..c0fed1d075 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 34650c72e1..8b970c140b 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 fe382a3905..37c1f63822 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 b674dc1226..ee84a98cf3 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 2004d82aeb..4bfb4e0ec1 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 983ae0351e..db1ffa56c8 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 13bd7eb03f..0a15bb1257 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 afcb56068d..99ae908db6 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 e56b1e0bad..fcebb7aaa0 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 7815379f66..1a2ff6d97f 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 2e882321f3..46a008009b 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 c18424d542..3860a09de9 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 2c121e622d..7eca88dc2b 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 4179fa962f..6d9e860767 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 62eb49896a..50b8536ea0 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 8d01a111a6..7c2e3cf4e9 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 0bf3a87222..7f027b63f8 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 a23c9a442f..2d60155cbb 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 e35b89348e..344c2c086e 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 c8b723b737..1684ce8243 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 768ef13184..a09a00b840 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 7b637ee370..eac8bcdb29 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 575ab28df4..f2b3001ae1 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 597381bcd6..87fe1df063 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 6952472fe9..73ca29cdca 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 7910b39368..1574af9fa6 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 0efc9044be..784a9feb64 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 3cf4d12adc..9dc4f4839b 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 14a3681410..6dd87e8471 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 abb3d98450..c9f3f0e187 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 30e3922f0b..9683797200 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 78350fab91..6e1af6353f 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 7da8538134..6870ca4926 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 eb0248625b..45877e1699 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 0000000000..a815011988 --- /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 7df7404d73..7362ec42e9 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 b2d8f845ce..c061f08b17 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 85b59110a9..f77d3957ea 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 0000000000..9d6d417a05 --- /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 edc8fcd19a..6cd1405b82 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 081275d3de..b8c245a66e 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 0000000000..9d6d417a05 --- /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 62475b88a6..c05e2d34f0 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 75d34e925c..64262aa654 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 0000000000..9d6d417a05 --- /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 3f58bf5204..b52dbc5a3f 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 0000000000..9d6d417a05 --- /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 962a417d09..7bbe61aceb 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 003926d6d5..ff2f1f093c 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 7459f7a1ce..8159b3cac2 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 f6aed1a1be..b023bd03cb 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 0000000000..9d6d417a05 --- /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 837d18d27a..9c646def82 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 0000000000..9d6d417a05 --- /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 8f50a6720f..050c122249 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 0000000000..9d6d417a05 --- /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 5eaac8bad6..e89f3360b3 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 914560f4a0..8d00a3d98e 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 6e727e973a..4edc46a372 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 7cc1215f82..628fb01a2c 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 900f255e74..c04f0c2a09 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 10e6278ac0..a2e56e0980 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 aca9bdb80e..bbc5642189 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 a14be0aed6..7a5e8621d4 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 0000000000..9d6d417a05 --- /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 cd168681c7..8361fa371a 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 0000000000..9d6d417a05 --- /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 afcabd00eb..64aa9716f2 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 0f46cdce54..3c3a4a53f6 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 ceab9b6e11..10520139bd 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 0000000000..9d6d417a05 --- /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 79c9e70bcc..ec22664e46 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 0000000000..9d6d417a05 --- /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 0000000000..9d6d417a05 --- /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 128f1ebf9d..8c756a6968 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 4898573427..7495204945 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 0000000000..4eb212a6a5 --- /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 0000000000..8f417f02ab --- /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 f678c87096..e20877e025 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 0000000000..56bb146be2 --- /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 e2f3ce2b0a..0f96ac9986 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 0000000000..21a705e17f --- /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 0000000000..a176c43186 --- /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 0c9556bfed..290d2ab0e1 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 9c3559b7cf..a50e53bef7 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 0000000000..7eac238107 --- /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 c27d983ca2..a211308d68 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 dd0c006d76..3fa024cb90 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 4ceefe9c72..477b7b4739 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 0000000000..42f2c24200 --- /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 0000000000..9205f5f38d --- /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 0000000000..7e84365606 --- /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 0000000000..15d8186b31 --- /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 e6944dab78..5317cd664e 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 0000000000..841163d608 --- /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 0000000000..4b76ba30b4 --- /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 0000000000..56bb146be2 --- /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 b559f29c58..5f8c57542e 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 0000000000..360eb4af7c --- /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 0000000000..057da69426 --- /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 0000000000..975cd23385 --- /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 4fab847f1c..b3844afce1 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 dec2a711e5..f0af6a71bb 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 f5170949ba..af051c19b7 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 0000000000..33b887870d --- /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 0000000000..1cc3c49dad --- /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 4837b301ea..641361bc5b 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 0000000000..1cc3c49dad --- /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 709a63c238..929c72732f 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 6b95464bdb..953726f0d6 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 ab78bc776b..ffbcc229a0 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 0000000000..56bb146be2 --- /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 157c78975c..9a52a68d44 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 0000000000..21a705e17f --- /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 a2bca3352a..aa112b4ed9 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 c080d1b364..ea1f26b624 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 0000000000..6bba3eccb3 --- /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 0000000000..fae832be1f --- /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 0000000000..0c6f96bcf6 --- /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 0000000000..48ad928b0a --- /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 0000000000..1582154a5b --- /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 f909bd8ac6..f6a592b67d 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 01da8652b2..57bb4bb438 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 02061267cd..71ee4fd234 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 a07665dc9e..99a1072889 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 33c17cd302..ed24c552d8 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 354f50b2a7..cf872da6de 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 84052396d9..b44e5fd894 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 5be8180dfc..6d9974f948 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 5cc83d418d..fe67b5734d 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 dd95b221da..1440d3d047 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 fb36e267f9..eb9b1261bd 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 0000000000..9673cb6c96 --- /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 416fe27add..cc7dea80e5 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 dc29217e3b..c26c1f55b2 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 4df27df0f6..69e4fc0f47 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 5b20c4efca..88997a89c9 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 f98770a7b2..cdaa475037 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 c77bebd296..fc90199664 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 27001b0d9a..a41afe3ebc 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 f6a1b7e4b3..2692e9219e 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 0000000000..3b8a17163d --- /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 ba2831ad6c..b4ff15d404 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 0000000000..843794b8a5 --- /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 6299bc0398..b10552d0fe 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 c49e8cd5ec..264e0ed303 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 a85f8e6874..cf18dce087 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 1d30994455..15e18a8982 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 20e7c6f60e..3c62f33c3b 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 af732d70df..3854823843 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 8fd4287866..11d27eebd6 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 b0e270572e..9c86ce6a77 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 cbf680ffd9..eccc419c79 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 c7757eb8ac..0ec9bf70ec 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 d917ba507e..084dd70ee5 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 f874e519f6..1bef863e15 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 4503700bbb..0a36450501 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 8f82f6a623..be643ab9fd 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 f1cdefd721..d128e1d2e2 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 01aed49ac2..504c95290e 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 31e8c09be5..f664ad0e1f 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 f9517b8c00..54d27e9956 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 d60c1bf91e..52ae403cca 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 4fb7efbf52..e14769bc67 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 3fa5fb59dd..ce97ccccf1 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 cf26729c63..fd805fc4e4 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 aaf67ffe8c..70f4bf8401 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 507b7c164b..4727a21db6 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 d7e64cdbf8..6a5b859c3e 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 086f2032d8..e9b71c49c7 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 28206deade..ae678abfe0 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 932dcf80a0..e144ac994f 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 1bd753fcbd..b3aa4e6604 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 ebc980860d..594cbffeaa 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 f77b7c18a0..0f11ab2a8b 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 aa1835d13f..f13f62abbe 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 4dd50811ab..db6359c881 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 dd97a1e485..cc59dfa78b 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 aa66e0b2aa..07d1a4bdb7 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 ccb2f2054c..8b4d3522ce 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 6a87ebe516..816b44ceef 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 d1bb6e48b5..df44a1d9fa 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 172c6b26ad..47eca9a7fa 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 1a281a0161..3fad0146c1 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 8daac5abd5..1aeaf21928 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 bbd5d6f6a8..5125ce8c58 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 9a543d2055..f2a09892a6 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 68b8ea0686..372a24c0b3 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 59b9a9448a..406f8af58f 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 9a4aa3e80b..b946694403 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 f567173702..24c4e8a9b5 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 581b988632..6688b68eb5 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 63bfc613d1..3e643c732c 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 35fbd15598..1bd9cf1a81 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 06f5c6f4c8..315b1d3be8 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 bec6897ed3..a91fa1cbb6 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 8f9b5a1651..176ba84b76 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 0ac6edee19..c585ee467a 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 eed200f12c..dad5e9c77d 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 e87ce684ac..bb8160ed5e 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 a43b2dd19e..ae7f87b93b 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 cdab9ab2b3..142f40754b 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 488692028b..026912e0d3 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 74912d710f..0640d351e5 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 50e8242c26..f1ed98f50c 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 1ed4b842b0..16f973e526 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 b4378620b1..bedf5f7efb 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 e041048a04..ea9e1827b6 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 23205426c8..9180d3483e 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 5c55feb0ef..1f715bf4a7 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 a8a162e55d..c5b080f0dc 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 434a86a634..dd2a20ad61 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 77067ab1c9..ba293c8c11 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 30384a1a37..f18a7bd25b 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 d86d0eb35e..5be88f69e4 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 d6a474f70f..4bf9f6b715 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 79d0b591ef..8b4d3e91f2 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 213a1c19ba..e97142a6e3 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 0cd170cfd7..a1ef4d4146 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 3ed0fbc850..583712c6c4 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 1a253b18f1..68f73bcf08 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 efb3f5deda..0de80cf346 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 8c5791b0ed..e448f9993b 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 31fbeb84f6..c07f04cdb6 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 8d5cec07df..b231629e85 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 f850c61bc9..482330099b 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 adfccab84c..4fb50788fc 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 e6381bc437..b14e0ded37 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 976c744e96..80d891a441 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 10d5a7023f..9f08d6b820 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 f516da66d6..7ee4f64431 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 3464e03e56..b1e2071146 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 d32e17ce6a..b1040e9bc2 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 900b97c322..1d697401b9 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 fcec44ea3a..e50751ad49 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 2792487359..8af45618a1 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 a779d8fbe0..b83162e0b3 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 525bc38bd0..8c3cd960b4 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 3afe70f570..fe24b6dcea 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 5af610a48a..c26033e186 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 1f98405431..2692768910 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 41a27d7220..e1d2bdb9f9 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 1200bb174d..c566cdfb81 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 256b21f56c..9ee235ea2b 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 dd420fc08f..0d5108982b 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 f2835c1803..73c7c1eaab 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 64179ade0e..17ce4a32b4 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 e124e632cf..23a5640ae6 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 72de59dafd..904bcd6831 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 49fdfa21cb..33a7f90b6a 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 e143dd3302..885c41957f 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 8846d85233..3abddb78c6 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 2ecc8c3a79..a587c9c0fd 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 3896bca385..1e451432be 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 ffdd320ed1..d4442982e1 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 1caf8c0d41..0a5cea1819 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 7825a4a84d..3d07ad843b 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 433f318564..a7c30cd9d7 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 6c9242872b..b06c41208b 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 1ed0392282..5702d3b33d 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 8780c8160f..e49fe2ebfe 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 f749fb21d8..2ad64efadc 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 95043a6e9b..66cd2393a2 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 39ed17bcef..09fddb5622 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 a633e68e79..93c78b33db 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 eb8969254c..4d4b07f31c 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 936cb10ce2..ca94b617c9 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 71e09774f0..f01728783c 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 3adc8dc3b3..a8bafa5011 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 c3bb9b1b7b..0d75f83f9e 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 c60247a6e5..ef60201a57 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 3c8a87902c..dd9d151296 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 9bffbed2d9..995ae9d3bb 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 efa2e69124..69c34907f1 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 1b1099f509..0330e8cef6 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 3eb56a4602..16b768fd92 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 1fd25f69ef..cc9be2d6ce 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 df493fca33..ebb44dc1d6 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 9c2197ba44..7e8d5af6d8 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 37b580369d..d0e318a045 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 965a21b892..4aba9293bd 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 0ede723702..c2f2b9d473 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 5ba05b639e..dd593c4add 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 41634ec4d2..b0dcfe0c36 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 648ab7824e..d87bcb536c 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 1dd99a1572..081b9ebfda 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 6e77b88221..c4ead9e6aa 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 88286d4281..dd7c3711e3 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 5b714dcd6a..56843e752c 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 9679e19fab..aebd839a83 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 11a0eb5ce2..d3420c011c 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 53d7bc89e8..e14b3a9ceb 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 cebd8ffcd2..3aab63489c 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 ee7b32d703..46bbb23148 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 fecd6608d4..a6d855dc75 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 e46aec1790..0c20258fba 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 34cf0a4f95..65db2a5a30 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 eb87d9de8a..6080cf11c5 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 a293b4297f..8c26f19ac5 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 72b2aaf868..e084884975 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 d0bcc4f61f..a69ac61bc9 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 d47cedda6a..c5cb3b737d 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 7e0d87fa3e..2b3dc0f67f 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 9ec47e600a..76cac00025 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 8bae8adaee..6362914f52 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 216ba66d20..de430273ba 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 abf5f100fd..fabf247759 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 ad1a304dcf..1d33f45069 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 23b0e19c2a..db53fcff97 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 147075c19f..f6934cb5e4 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 80955fa9e3..9e410084f8 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 929fcf4088..cb363a7dfa 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 1f77f9e774..ad6a6e10ab 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 c5df274233..bb1e217133 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 ac6a232db3..a3727721b2 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 5fa28a09e7..845c096882 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 a43e5f7ced..2b573170e6 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 0f00578a96..9eda02551e 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 67024c0663..2e2458cb8e 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 af4ae8a290..000b5dae30 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 75f58fef9b..43a16be8d7 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 2337638a89..9fe9810751 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 53b138535a..8df85c6dc6 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 06f55e3dcf..e112a2c682 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 0000000000..755da4e86f --- /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 0000000000..0274345b0d --- /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 0000000000..dbe9eb1594 --- /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 0000000000..ddedd5e0a1 --- /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 0000000000..4d3cabae91 --- /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 0000000000..dfb23d2c61 --- /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 0000000000..60260ba961 --- /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 0000000000..b41c930ac9 --- /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 0000000000..b41c930ac9 --- /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 0000000000..39521a87a0 --- /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 0000000000..1a85d1ddb3 --- /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 0000000000..c3c49f56ee --- /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 0000000000..c3c49f56ee --- /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 0000000000..4ec00acf89 --- /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 0000000000..6862a08561 --- /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 0000000000..77445f57da --- /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 0000000000..d92d58bb30 --- /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 0000000000..f18765d86b --- /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 0000000000..b41c930ac9 --- /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 0000000000..0a96e99d30 --- /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 0000000000..debda9db89 --- /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 0000000000..ddedd5e0a1 --- /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 0000000000..0ae5c0d3f1 --- /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 0000000000..c1398138df --- /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 0000000000..c6d0480b1b --- /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 0000000000..89c542cacb --- /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 0000000000..16eb80c6bf --- /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 0000000000..e5ad363cc4 --- /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 0000000000..cd50cc2a15 --- /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 0000000000..b41c930ac9 --- /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 0000000000..ddedd5e0a1 --- /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 0000000000..b41c930ac9 --- /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 0000000000..755da4e86f --- /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 0000000000..b41c930ac9 --- /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 0000000000..ddedd5e0a1 --- /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 0000000000..c3c49f56ee --- /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 0000000000..c3c49f56ee --- /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 0000000000..c6d0480b1b --- /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 0000000000..4478fc5ae1 --- /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 0000000000..dfb23d2c61 --- /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 0000000000..dfb23d2c61 --- /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 0000000000..4ec00acf89 --- /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 0000000000..4803077aed --- /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 0000000000..e8862d529c --- /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 0000000000..c6d0480b1b --- /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 0000000000..dbe9eb1594 --- /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 0000000000..83a77447dc --- /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 0000000000..7f17036379 --- /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 0000000000..068bb73369 --- /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 c425e515f5..09ffce392a 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 291e78095d..a186723f34 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 40972b3b93..6b6d430307 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 928e9899db..e490c33805 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 1688e3cb26..5602713d24 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 63d52f53b9..bd2170a0f9 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 728a0d7ee6..9ff97592d9 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 dff4929816..692df44c5b 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 87779947d9..b1c29f3577 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 11bf616164..2e8bec54c3 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 485c453777..c3863a860f 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 55a48f1df1..ea7fd49a54 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 4f35153669..1bcfeaeba5 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 03bcb57aae..094280da4e 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 73fb9b3722..4a5af0779a 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 6a28fe831c..fa146adde2 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 5133b66cd1..fac7766025 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 2103b6c38a..883a53441a 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 f0350e8101..9402687b8f 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 0c685c3020..20b17ec37b 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 bc4e518b1f..3f8fd23b07 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 442c5736c1..d85caeb2bb 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 715937b678..682d561929 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 c247654c7e..580c858d15 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 7161f3b5d4..853dfa1487 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 be4faf69a4..f9e5ec14c5 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 ffb8ae30d3..46d1de99c7 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 1cac51a839..1619eaddb6 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 3a00a7b36a..a7c520c400 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 a879b74fd8..ae640f1287 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 b35ebcd587..17964db682 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 7d0691169c..a5d96ec7ef 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 3021d70024..4343ec3139 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 ff079e0312..8095fa0515 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 ac628f7b01..3272c8941c 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 25ce58b97f..abcc094883 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 7db4f98d7b..9cae066320 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 7d7d3688e6..533c14097a 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 a7009c5ebc..85b61f923e 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 0000000000..9c99ba98bb --- /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 826e7288ba..5b4171de5c 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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..d8a4c45301 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 0000000000..981cb51c83 --- /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 48efffbb7e..4f52830af0 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 eb90c5ea04..02e8e22d92 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 5d742100cf..b395497d67 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 5358c35652..bbd0d8beec 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 c5b98770d6..3227e5115f 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 1c48ceea5f..01338dc5af 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 6523d44639..b79871d487 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 29afed9c43..7f76c932c7 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 645c09105b..8cd10b3c24 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 7f6b8b9766..2e6cfab035 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 c8c356e4a9..1e7902adfb 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 7b1040ba5d..de124207d6 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 c7a5528805..f3e9dfed7e 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 24ea5ce4f5..8703148b3f 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 0c070f322a..25588d79e0 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 4a51f55372..fbba14d88d 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 1140ad1ed8..abacf5c8ca 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 19dde27a16..d0c219cefa 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 c5f01b1554..9983242b34 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 574c9f767e..76fe3aadc5 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 c0cae40420..8215388a16 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 4eec6bc148..01ca002dd5 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 c3c273c777..607347ff9e 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 c452b53bef..a0aef80e03 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 94aebf8702..d75ffed4c5 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 70d07ba36f..e42d91082e 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 71b5505ebd..ca0738ec9a 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 ed7dca2f48..c9c4270360 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 1683d00b43..dafe3836a5 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 963c23e406..389653422f 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 2470fc975d..3d878ed40b 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 c734a9ccfe..18199edf85 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 49f910154c..cdfbb069c0 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 7e320fbe9f..9fef289f54 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 d672f73d77..65c9968dc1 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 45dfbbf8bf..77e5c6298e 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 6fb23ac800..bb406e90f9 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 4254aa260b..d24c839865 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 c650796f23..01d484075e 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 912d3e4b7b..44feda4fff 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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..d4578360f5 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..d8a4c45301 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 0000000000..04b5b760f6 --- /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 c60ed15556..f4ffbf157b 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 eeeee01bcf..dd04e1e825 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 02df0946be..4cb5e8d092 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 3b4f99c6a9..efb73dd6e7 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 8056e4ad5c..a520aef37d 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 894bdb6dab..f3ec84fe3a 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 2b7d7c1726..26ca6eb60d 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 d9d9a90386..a853d7677c 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 f7d36fc4aa..a017a5a1df 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 fd3e8189af..08bd179b4f 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 07aee5dd62..212a6d2779 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 d404c85a90..9e650e132f 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 3817766103..a410d9e28b 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 c7b7857a86..8c99cddf6f 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 e35e02de47..d00f082d2e 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 a3437c0100..954aff55b6 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 6c7acc9889..393a0689bf 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 aafc2bf1a9..af5b37773b 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 6884739e81..c4154e7489 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 4465c4f88a..e6a506a776 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 e7154eab4b..7c0497c2d4 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 3bb9119a03..5f7fc81bd9 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 787aade5de..649530de53 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 cd75b53bce..58ee71e722 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 96ac18a3c0..a0179dfc90 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 c21a0f6578..85c71ca3fa 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 4165e25465..02781ba48f 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 6925307e25..e457ce1631 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 195cc64140..5c765c83bb 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 a02b97ea04..762132a459 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 f75445e66d..6ba708f2b0 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 0d047af61a..e07499b007 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 cd54a59339..d3a9aa3efb 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 faa0284891..3a66c447e5 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 14fcfcd8f1..495ddb81bc 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 1921dbdf1d..39e8b1045b 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 30c4dfa4a3..485a29f5a7 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 7f08dbcaee..9f5a2cf04b 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 732c8bbc98..28885b9435 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 3d894048d0..25846f40b7 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 151214011f..0a1ebbf2ea 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 1d16002e29..77c212c10b 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 2613b66eea..86e6e4e585 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 db95d808fe..a55c593326 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 fab87f065f..6e4c34c095 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 13b70516cc..fe4a8db5d0 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 88aebcdffd..3dd267ed73 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 be95e0e73a..4094733ba6 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 f73ca79115..76db584bae 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 1e1312b096..d0f625e734 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 76afc8c337..d9070c7c29 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 7e1f32135d..fa966b7d0f 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 41340856a6..031076172a 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 494a7217de..c2b667431b 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 02360d9a7d..e250da7627 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 299f50a678..8b2b90456b 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 eb04cdcf9f..550fd805bc 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 5362594e4e..92553c84cf 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 5d4bd86cc6..5b3efb9455 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 125ea33a0e..3b03fb84bc 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 05be972a51..aa28e012ca 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 52f89dc460..80e90f16be 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 0e2cac536b..2af5753f65 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 352da3409f..fff0016a46 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 ef2d27ccb8..6c4290140d 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 09fd044a1f..31bf427196 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 a0f03689a2..cbdb31e3b3 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 5c717391c7..346bc8af9a 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 14e5b5cbb9..01ca31cec2 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 2ddeb89d6b..a0873737a7 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 aec784bca4..fa9f3f5abc 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 c37f8ac9dc..251ee74c9d 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 422dbc94aa..dd46565956 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 7850a0cb0b..055cd02dff 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 1de7280fe5..1990840209 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 53a59c63d9..cefd7393f2 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 3b96ff44c2..894c4f9f98 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 65b36418d2..3de410802f 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 c7ecdd85e2..f3b763c7b0 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 dc48222b5f..b7ec9588b3 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 70d4247f40..4da913f8e2 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 ef90886054..b86dd4358b 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 ae5c6ecb1d..1988db1767 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 d3e6fabb2d..2b9e1068b6 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 8cc1c6ed45..bebad01c31 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 593f41e0e1..74ae609c0d 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 7a36a49f49..60e9634acc 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 0ce1fd2eea..471b21cdc9 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 8fe750b661..23b3602744 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 5effa2b962..b0d193254f 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 80ce76009a..a83dfe806e 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 d607343fe2..622cf931cb 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 22a0d63641..dd8ca0adc3 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 853b3527c9..a5d7566254 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 d54bce408d..73e988139f 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 aa4c31d0ae..4bab2dda63 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 abe05d9c37..7161fec645 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 81d907c482..ade0c4a3bd 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 44419d333c..1c179b2532 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 80f2612bfd..0b06ae422d 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 2425a37207..0e94418822 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 8b6ceb83f5..49bd9d612e 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 c017f0a93d..cce095e029 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 9dc7b767e2..4dcf547619 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 60c3894733..27429081e1 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 0469853fd7..a39940d42e 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 3ee3f7a24f..b6e9abe94b 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 5db8cf1fe6..bbfb1fe32b 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 c111234ed3..84691ebd13 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 ef1dd82f34..f1384df73b 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 636a2dd869..a4c7f1f8d9 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 f9e45c8af8..53a0e0090d 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 f55a5d4ffa..c8949bdc16 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 6ee3355dfe..18ffb07094 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 72c0717d85..3ca8252a55 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 8515995247..0fed17b7ce 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 c2a8ac510d..f917bfedd6 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 90b0574cb2..674757b92b 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 d4aa6099d0..29f9fa29fe 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 107657e9cf..1f14283a05 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 3b0e2d4b9e..109be40acc 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 e5e5c2439a..1633f091a6 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 a5fdd0a5b1..5a54f5a9aa 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 3d88caa84f..097ecad5b7 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 4f2c6fb52d..7160627e54 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 132d4f116c..823801e974 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 41ee9b5047..560c2c8406 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 c93c6823e4..ce037f1c5c 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 7bf2889325..30dd8b04c1 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 1560b7c899..a13dd946a3 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 2e913abf64..f6ebaa0e7c 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 d0218da5b2..23bf7895ad 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 ad11a9b72d..54c2f71f40 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 e9aa35f5d2..47bf2c29a1 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 d96a34454d..18e0791b18 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 e29c103de9..f32ced997d 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 1025bedcf7..36e75204e9 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 d2b7e6cd79..c78fd1090a 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 62b767524a..83a5a4567d 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 57c1d1a8d9..6de7b1f4f2 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 bf8c63c571..e58bd80af7 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 f51ab3954a..8337aa8247 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 0000000000..15f4ee4a22 --- /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 0000000000..06862b4a62 --- /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 0000000000..8bce5cce6d --- /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 0000000000..fcfae2b4d6 --- /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 0000000000..ecd84483d1 --- /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 0000000000..86c01e96a9 --- /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 0000000000..ed5077cdca --- /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 0000000000..c191ba6525 --- /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 0000000000..dbac728483 --- /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 0000000000..dab56cff29 --- /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 0000000000..54e0086839 --- /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 0000000000..abbb60ec22 --- /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 0000000000..abbb60ec22 --- /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 0000000000..add6434b02 --- /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 0000000000..0782c872fc --- /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 0000000000..113626f41e --- /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 0000000000..d902beb747 --- /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 0000000000..5a5fb880a2 --- /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 0000000000..b54f9ef1af --- /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 0000000000..fcfae2b4d6 --- /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 0000000000..8e6fc14706 --- /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 0000000000..5911e50064 --- /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 0000000000..19e3a64dcb --- /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 0000000000..cfb4b6144e --- /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 0000000000..ec0bd86fe8 --- /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 0000000000..0f90ef2df5 --- /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 0000000000..baf495d13a --- /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 0000000000..0ae600eeb1 --- /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 0000000000..cdaf3b4128 --- /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 0000000000..15f4ee4a22 --- /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 0000000000..e5e3c7ffe9 --- /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 0000000000..c8a2c98ee1 --- /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 0000000000..96c31ffda1 --- /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 0000000000..96c31ffda1 --- /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 0000000000..f5c041230d --- /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 0000000000..351f89c434 --- /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 0000000000..4d38e1f8c4 --- /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 0000000000..b20e427a35 --- /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 0000000000..9aa4622a97 --- /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 0000000000..a00e3b6a8e --- /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 0000000000..97c0283501 --- /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 0000000000..ecba43fe4d --- /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 0000000000..fc353e0496 --- /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 0000000000..de0ffe5149 --- /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 0000000000..9d4f10ce0a --- /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 0000000000..9e4bd59085 --- /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 0000000000..f5bbc92c4f --- /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 0000000000..cf0a52133b --- /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 0000000000..6ca01629e6 --- /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 0000000000..1289314235 --- /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 0000000000..6b5bdac6b7 --- /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 0000000000..63ddcc2cc4 --- /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 0000000000..fab62477d5 --- /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 0000000000..0331e29f37 --- /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 0000000000..29b5b3d1f4 --- /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 0000000000..c06686e7db --- /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 0000000000..81d89eb53a --- /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 0000000000..6b5bdac6b7 --- /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 0000000000..6b5bdac6b7 --- /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 0000000000..eb5f6b8e65 --- /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 0000000000..c8d78581a4 --- /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 0000000000..2710baee30 --- /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 0000000000..4b01ea6066 --- /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 0000000000..d2b33ef935 --- /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 0000000000..8e692afee1 --- /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 0000000000..b9e7c7826b --- /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 0000000000..81d89eb53a --- /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 0000000000..92d2f41d80 --- /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 0000000000..acc0dd2ade --- /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 0000000000..81d89eb53a --- /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 0000000000..4122af6a37 --- /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 0000000000..bd252181db --- /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 0000000000..b9e0a40035 --- /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 0000000000..a6535cc544 --- /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 0000000000..e10574b1e6 --- /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 0000000000..e3908eefa7 --- /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 0000000000..786980e5a7 --- /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 0000000000..7e75ea439b --- /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 0000000000..6b5bdac6b7 --- /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 0000000000..bfca0cadae --- /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 0000000000..7f4de4021a --- /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 0000000000..33ccfb0a3a --- /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 0000000000..a62957781f --- /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 0000000000..4c7c0eaeb2 --- /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 0000000000..fa235bcc11 --- /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 0000000000..d48149c655 --- /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 0000000000..355cf7e394 --- /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 0000000000..4c15379801 --- /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 0000000000..a8ae01ea81 --- /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 0000000000..fb601442b6 --- /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 0000000000..a7c564e900 --- /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 0000000000..c5e809e7e8 --- /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 0000000000..af6bb4e8dc --- /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 0000000000..110852b914 --- /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 0000000000..8946ef71fd --- /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 0000000000..dd81918329 --- /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 0000000000..570c7b1759 --- /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 0000000000..810b63fdcf --- /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 0000000000..08ff0bf4e6 --- /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 0000000000..ffff2a6597 --- /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 0000000000..79c01a21fc --- /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 0000000000..9de1e52eee --- /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 0000000000..54c8ad7936 --- /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 0000000000..e86a07db95 --- /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 0000000000..025943ee4f --- /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 0000000000..e72e7b1028 --- /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 0000000000..2e81fb69ee --- /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 0000000000..385584a5e8 --- /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 0000000000..26c1983d16 --- /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 0000000000..14c37289ac --- /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 0000000000..43f7682268 --- /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 0000000000..99600fedc7 --- /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 0000000000..9d9d0cdb3d --- /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 0000000000..fa1b82196b --- /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 0000000000..c583531954 --- /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 0000000000..22c089f8f0 --- /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 0000000000..dbc7d7f366 --- /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 0000000000..a5984527e1 --- /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 0000000000..f3970ce802 --- /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 0000000000..d3641924ce --- /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 0000000000..c22fa60652 --- /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 0000000000..a8c4d08abd --- /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 0000000000..673793f919 --- /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 0000000000..9e990791ed --- /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 0000000000..ede9ff7bd1 --- /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 0000000000..b4d83e081f --- /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 0000000000..6b9dfbd771 --- /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 0000000000..51eb69a073 --- /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 0000000000..65becd1195 --- /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 0000000000..1393345756 --- /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 0000000000..c3657e30ef --- /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 0000000000..8df8026484 --- /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 0000000000..944a288f77 --- /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 0000000000..1b0c21d302 --- /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 0000000000..bd087e535a --- /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 0000000000..f1bb56d3bf --- /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 0000000000..7b80fb16d4 --- /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 0000000000..631f486d46 --- /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 0000000000..2158886045 --- /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 0000000000..972b400738 --- /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 0000000000..3d9ca48933 --- /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 0000000000..32be17c859 --- /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 0000000000..cd3606e03a --- /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 0000000000..c639bae22f --- /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 0000000000..d9cb424783 --- /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 0000000000..5108e16efc --- /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 0000000000..51a7a178a0 --- /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 0000000000..04e57ee945 --- /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 0000000000..4f474990db --- /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 0000000000..dd280ee7c6 --- /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 0000000000..e05a913058 --- /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 0000000000..f4182fbb3d --- /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 0000000000..a5a7b0c35d --- /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 0000000000..b521ec9fed --- /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 0000000000..2204584116 --- /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 0000000000..6fff8ef5e3 --- /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 0000000000..abcbfa4f52 --- /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 0000000000..0a909c435f --- /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 0000000000..766e745824 --- /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 0000000000..e39ed6234f --- /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 0000000000..4c533f5eac --- /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 0000000000..677efd751f --- /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 0000000000..c635f1d295 --- /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 0000000000..68960733dd --- /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 0000000000..7d2ec79080 --- /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 0000000000..6268cf2df3 --- /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 0000000000..c36d2b6aaf --- /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 0000000000..c5cc371243 --- /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 0000000000..6524078584 --- /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 0000000000..4ef827032d --- /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 0000000000..e31e0ccc72 --- /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 0000000000..5c6efb211e --- /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 0000000000..d519b992eb --- /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 0000000000..64c8e55f83 --- /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 0000000000..c2449db709 --- /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 0000000000..09988294d4 --- /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 0000000000..981034c73b --- /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 0000000000..1ca8fbd4ec --- /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 0000000000..ec93697dc3 --- /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 0000000000..c180518088 --- /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 0000000000..0e4265d7ca --- /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 0000000000..0fcc548a68 --- /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 0000000000..b230db9fc6 --- /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 0000000000..76806d23a5 --- /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 0000000000..3c6b44d43d --- /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 0000000000..af85b8135e --- /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 0000000000..73689e0e6d --- /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 0000000000..34a36e0cd8 --- /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 0000000000..8a20dd83cf --- /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 0000000000..c36a4687fd --- /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 0000000000..0558e76de4 --- /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 0000000000..7354ebf3d7 --- /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 0000000000..8b58030ede --- /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 0000000000..0832123d47 --- /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 0000000000..e74785ed24 --- /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 0000000000..ad5d4266d2 --- /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 0000000000..ad5d4266d2 --- /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 0000000000..22378cd35a --- /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 0000000000..d55843edda --- /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 0000000000..4f9dfdbf6c --- /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 0000000000..e93b725dc4 --- /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 0000000000..6fb50ef1c6 --- /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 0000000000..822ba13d9a --- /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 0000000000..9927fb325f --- /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 0000000000..d528d526af --- /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 0000000000..296e047ba0 --- /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 0000000000..fb8243c7f3 --- /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 0000000000..87462c9421 --- /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 0000000000..80f397dd89 --- /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 0000000000..5620635d90 --- /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 0000000000..4e1ceb45c9 --- /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 0000000000..bd5971875f --- /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 0000000000..6840f1416c --- /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 0000000000..9abccb1411 --- /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 0000000000..45abc169e4 --- /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 0000000000..9a1b05e323 --- /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 0000000000..129d832682 --- /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 0000000000..6d9b589e7a --- /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 0000000000..b745ad4359 --- /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 0000000000..51cc2815b2 --- /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 0000000000..3d6843727d --- /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 0000000000..94e92eb924 --- /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 0000000000..e16183afa0 --- /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 0000000000..94afe97c81 --- /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 0000000000..4e92c4d99e --- /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 0000000000..76026f5c0d --- /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 0000000000..ace44f8d7a --- /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 0000000000..84306384ee --- /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 0000000000..49380782fb --- /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 0000000000..8fd89f7392 --- /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 0000000000..9d35992c72 --- /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 0000000000..e348970b1f --- /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 0000000000..3bbafad402 --- /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 0000000000..022ceeff50 --- /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 0000000000..2648fa7e91 --- /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 0000000000..a0e09f9fe8 --- /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 0000000000..fedd3397d0 --- /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 0000000000..c0f3910152 --- /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 0000000000..b9c5f81e9b --- /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 0000000000..f657840f1c --- /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 0000000000..dea91ea03a --- /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 0000000000..a44a36a38e --- /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 0000000000..1b39d85466 --- /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 0000000000..047874d632 --- /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 0000000000..0e33139518 --- /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 0000000000..6c530bc7e5 --- /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 0000000000..5ba2ca12a7 --- /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 0000000000..31c429c04b --- /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 0000000000..66ad4c1e7c --- /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 0000000000..1883aae18b --- /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 0000000000..e497069394 --- /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 0000000000..a729614ea9 --- /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 0000000000..8f8d4e036e --- /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 0000000000..31b0f43019 --- /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 0000000000..e2795fdc36 --- /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 0000000000..6f8e3a04f2 --- /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 0000000000..713f325e40 --- /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 0000000000..e35d693123 --- /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 0000000000..a643fa15fd --- /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 0000000000..13826884fa --- /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 0000000000..fec4d20c33 --- /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 0000000000..5a08514f41 --- /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 0000000000..1b39d85466 --- /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 0000000000..d4f0554e65 --- /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 0000000000..e5fc063ced --- /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 0000000000..87a2a7629b --- /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 0000000000..3799a441e4 --- /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 0000000000..c0954d42ea --- /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 0000000000..d93e6d6262 --- /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 0000000000..6a7d984a3e --- /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 0000000000..b2e6fe41a4 --- /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 0000000000..943e124770 --- /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 0000000000..378d9d5ad3 --- /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 0000000000..a80f432520 --- /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 0000000000..d23f7f1eaf --- /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 0000000000..fb1c570b7f --- /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 0000000000..2d8af02961 --- /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 c3cf8fd8df..69e1523ac1 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 01ab34b1e2..3f16dbc220 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 6be48c3a2e..afb0307492 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 07f90ed2d0..37db62d120 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 bf6331c72b..337ed3ad7c 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 bad6552e17..6352142e71 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 5cae304942..5938e27930 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 9bc3db4e6f..9e94d53671 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 a98a23c7f0..0e652624ef 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 da52ef752b..02fb127e36 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 bda9013f65..fd0c5c7c47 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 3cd84f50b7..77bbc56e39 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 88d01439dc..1c69ea0a48 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 a1905d3d87..e41382ea62 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 4ae14e28ad..36c18ea34f 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 09303c4d95..bb6ec7b9f8 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 dc7036f8e2..3405086576 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 264b3be167..2fc5a3f1c5 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 5184c27d59..5645bd91e2 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 25c8bc48dc..58b02fe8ca 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 5a8f41fce6..8eee79de74 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 a9e779c8aa..52a1a66ba3 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 4de52c75d2..b4b13d3955 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 455fcf2d4a..d19343acc8 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 46409ea5c9..e0958432a6 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 ec982acc07..03d91e0219 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 a02d1d713e..8e659dbadc 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 ba64432f93..ba85332cb7 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 99849ee932..fcabe7be75 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 9f36352003..2318a5eba0 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 acaef8e388..dca37f6178 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 d9d485abb1..62e2e1e59c 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 a527f2efae..823bf9ab93 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 ae4158bbc3..7b319c66a4 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 805a3eccd2..a3f83c150e 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 5ade982afb..9a3a11a7a7 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 301a83c5e2..c4818393ed 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 ef01256607..0aeb36b044 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 04600d8dd8..5ab6af8d21 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 009048775f..3fd1a8d8ea 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 a45b078085..e4896df58b 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 9b2bebe4d0..79248e0d06 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 5c1e3fbf82..4e4cdebeec 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 410585d02d..f87f915c24 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 c780f92dcd..4a0d8e0b01 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 fead941a76..2e67da7624 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 84b1c6f383..b9e98886e6 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 14b67fda8a..d42b858157 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 51b5cefd7f..1606c8cb5e 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 e65c05ab90..7e0da1fb84 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 ec51c7bcaa..a3d084ddaa 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 e517f81ce5..8ed12b70d6 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 f3447565c0..19ad3f2eed 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 dabbca15fd..4040275d89 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 6742038830..7fe5132ed6 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 c4f01461d6..c56083bbf6 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 9d8f6a8716..d2f53fec24 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 7cdb01eef9..2f4b9a1171 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 b7ce182dea..c331b9c7e2 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 ea43c2eca2..2d4fe3e64b 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 0000000000..742dd8621e --- /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 32275bfbfb..5a8c606876 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 0000000000..8141aa276b --- /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 b484370a16..68cda398da 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 72224eead4..8a233f30ff 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 5cb035dc62..cf75f845ef 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 25104165f5..ee478a67dd 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 893cf54081..c42f9092d9 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 f85226ef50..63ffc14559 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 1ba0877993..0fbc0ecceb 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 45493bd79a..c5b8d0cbd8 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 c5640be83a..85de80b5c9 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 c6020fa1d8..6b7a63d102 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 7caf8d483c..5a1f257f8f 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 3319539b76..a8e1ff5fa7 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 b1d656dc4d..edbbd37f82 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 3c30d0f352..37fb766ee3 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 8d19882bb7..38e10460ae 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 0abdd92f84..3247c162e7 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 db42824b45..69b1bd3745 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 bde3e2099a..69297d6aef 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 940fb127c5..3e47ca925d 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 7cef08a0e5..066fae277b 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 b1551bf364..035b952d20 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 cb0dedc6d2..2aed0f309b 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 ffe751bd02..016e0fb070 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 9b0e0a8199..6c08029d9e 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 82de0a6bfe..4703241360 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 2643e53db4..7c9b7008f2 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 0bf1271e39..664cc72d96 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 db4b9649e3..9fb3163ae1 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 2f2efcd6ba..76b88ebb6b 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 559d95e05a..8fd2930e8f 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 b491faec9a..8d8e15d218 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 cffa27defc..5b0576a12e 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 b51e0bf55f..21dfa2f9ad 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 a45936716c..af7146230d 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 86ee2099b3..49c806aa56 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 d4543a2ad6..2d0bcdd329 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 d06c9b64ba..41c39c32c6 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 705d907f59..2e05823ebe 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 5d52e28104..fce7cd7096 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 21f0c84e1b..7f7bb327ea 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 cfb0880f6b..afe65f67f6 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 16fbdd8099..48751d0d8d 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 9266e13471..36ab7150c1 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 04cd775f0a..11adeea4c9 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 11517e2cdc..05e3fa3368 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 ef37d21066..566c623c80 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 2b025862ca..84fdcac488 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 d9db35c07c..6945c5ae47 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 6447af84ce..7e8ed67599 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 49d7e1e23e..c513a9a0d7 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 0d7cfecfb8..fe1879875b 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 d5864315d8..fe3ce92f47 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 139dc8bf3a..b4f8d74d68 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 8438caf251..0a6a52d2fb 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 588700dd30..3e6136fb2c 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 ac8476824a..5a1c8fe08b 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 d56b7a333a..9c8dca0b06 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 5498ea9745..a61e4372b7 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 d4ab3aba47..76f46e7c81 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 2c02b2aa2c..09970c5901 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 61711b5d3c..18f22d7f1b 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 25245dbb44..33d8d59d08 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 145c2fb440..fc6c58d8ed 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 b76d96cc46..a08c6bc6ef 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 3233430d8a..3142208b70 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 cae763b42c..426f3b242a 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 be9de9cc94..f4a455212c 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 5f018605d5..ad1ececc85 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 09102bbb4a..7c129cba3a 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 0e5920c384..fba620789a 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 edba5dc17a..19a6c6d882 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 c69ffec899..b841e7b28f 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 87eb976276..d95bb809cd 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 7ecdd132bb..857f12041d 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 561d7418af..915c7e7f55 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 71150762e6..025ee20269 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 f3331e450b..e44a4524ee 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 2c0f9c185d..a9a45f1f48 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 621aee364a..9ebb8c43b4 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 e364be3b02..b6faac51ac 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 b7798bda7f..654fbe82ae 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 e918bb28cb..fe7daaaed7 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 96c9b6ef68..8676326e99 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 e1508bb06a..5ed177125f 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 f6b52394ee..60dc00a32f 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 cbadc37a6c..9b8fe3632c 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 2768a7ed85..380acd0a87 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 a699228920..8fd7a0ca75 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 6936dc7f56..8bf15060ed 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 8624bfc763..e8a42bd567 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 a0ca32c0d8..c189eb1e18 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 403ea8f0c4..82f99c45e7 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 16a843202a..53e623e05d 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 f12ff5bd94..e95f452c1e 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 e0716dd707..73fdb846b1 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 5b62cd4623..6ef2bd8697 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 d2e0a2418a..a7f6dfbd6a 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 7bd4c366c7..5bcb8b328c 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 591c4677fb..c85449078d 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 2eec5575ce..6d30adcd45 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 a5f9fba3cf..fc9e407b4b 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 0000000000..1e21027a60 --- /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 0000000000..9d445724c1 --- /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 33b57d9e7c..b9cc911822 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 0000000000..7f15790013 --- /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 ec7641e1ca..62f026fb03 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 0000000000..2a3458c3f0 --- /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 0000000000..734a81fba1 --- /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 8115a3bfba..dd9526e8ad 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 eb8a1b5bb0..75178c5ed2 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 0000000000..12356ef38c --- /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 6a777265c7..50cf04725f 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 b63f0d4445..56469f7842 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 f4e999225c..18eb21be2a 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 0000000000..dc02240fb9 --- /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 0000000000..c1b2a00162 --- /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 0000000000..5669c44896 --- /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 0000000000..fad6bd2cc1 --- /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 4a1dc82bbd..b6146584d0 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 0000000000..fff5188e04 --- /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 0000000000..2343dac5bb --- /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 0000000000..f92740755b --- /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 0000000000..7f15790013 --- /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 5192a8c7df..5152603495 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 0000000000..d6eb30277c --- /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 0000000000..b9ebd39379 --- /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 0000000000..7c0c5861cf --- /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 a95af83590..8049e36586 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 0000000000..9608bdb306 --- /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 c0c47dddfb..5f8d9034a6 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 8ffa33a6a3..e910eea107 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 1436829ee9..d9edc58b97 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 0000000000..81bd5e3a13 --- /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 e742a337cc..51ef35385f 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 0000000000..81bd5e3a13 --- /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 1f2ff19f9c..798a8f9f65 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 05414b1e03..ecc540b2cf 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 272516f4c6..19b4e79fe9 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 0000000000..2f757b4bad --- /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 d6c3d03753..8f8b220af8 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 0000000000..752d3a78a5 --- /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 5704ebb682..7e62ef3f7a 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 8df3f3d382..6d9654f3c5 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 0000000000..94b931e03b --- /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 0000000000..695fba906b --- /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 0000000000..f48d00a7de --- /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 0000000000..c70dde76a9 --- /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 0000000000..8d5a70dc00 --- /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 0000000000..4626033dc5 --- /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 872b5b2e2a..4cb2f1bab6 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 30dcf2793f..ec83710e86 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 68da33e304..dd337013f5 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 75385aa8a6..127d2870ae 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 e157b8fec5..2fa885d1ff 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 72a60759ae..c1f06d34a8 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 142a87c907..512c056744 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 c1efff6fa3..ff559803e0 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 b33163d99e..ef07dc2ca7 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 723261e164..71dba36dbe 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 ee362f9aa7..ff5e226dcb 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 7f7534192c..cd83aad724 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 6a1b105938..091a3b8d69 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 e9f6476f07..2c05353be3 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 b9f4c41692..6cdaaf837a 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 0a71a623b2..b2c565e13d 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 ebeb37c991..1fc09298fd 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 0681172165..bf2bc7070a 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 69dd4717ec..65e0269967 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 8c49004aef..3df56ac5bb 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 d4b784046f..2d8c2b7177 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 c5f291289e..7a28dd692f 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 b21164458a..e0df693436 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 6c3e379c1e..eebf7c1d0c 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 d687518ad3..072f6ec964 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 c81c03bd71..5a4077352e 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 5d29b267fa..7af2564976 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 383a7d4263..c1933032ed 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 c57ad99bf0..09b894742a 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 a180d448fb..3e15925460 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 9feb395066..2662eab36e 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 2b2f92ebdb..a404e1747e 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 5306d17ea2..88de9704a6 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 2a2a194c16..0b12afbcbb 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 26cce0fe77..c5ae118ef2 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 69d250ad6f..24246ca573 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 80a11e4f16..e7e7a5647b 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 aa71441b8c..ca1103043e 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 3ef9309c96..9c8f27dff8 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 7ad755226a..1510317717 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 a69c443c88..540724e578 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 3aef44f120..61c6a6c48a 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 1e9eab323d..074443908f 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 6df2a846c8..afee5b832c 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 63420c805b..482d43c711 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 fc12bb2d1b..750797e535 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 1068dead9c..d28fb54182 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 86116ef684..e699e41903 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 0221c2f02a..4e65415b1b 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 fba9ff9e13..7e3fe9bcb0 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 6e691c8403..c023cd832b 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 a91681736f..e2e51a3cbd 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 ebbae39b07..42086f5cfe 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 b348b03f2a..655752b6e6 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 1363c39d8b..46f9f41323 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 5d254874c5..7294b31ef7 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 b6fa617b80..11ea7c671b 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 b1571ae751..e7091e19c0 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 2bb0cccc28..591f2f4230 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 77eb3f8a43..13a2a33aa5 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 1f3ae163c7..45185a5fec 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 807314ad06..9a7245396a 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 e4590d8f9e..53df0ba59e 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 0000000000..e9025e1532 --- /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 0000000000..4162a0f14c --- /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 54b80842f4..69acda4ed4 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 0000000000..51901bb911 --- /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 69655ac1da..cb7f020791 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 3843248a9e..8fb24e3ce7 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 0000000000..696bff2f77 --- /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 e2f2588349..b3081298e5 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 443c70b68d..0ec46ac387 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 0000000000..62e6aee9f6 --- /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 262ba27d95..5654afd028 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 0000000000..5f60b921ef --- /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 0c352d9608..b0cde00f82 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 0000000000..e830ed3c4b --- /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 0000000000..f87e718561 --- /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 0000000000..4162a0f14c --- /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 0000000000..221373a116 --- /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 cc7e7d6f3e..5265219738 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 0000000000..a46901bff3 --- /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 0000000000..30915eaf55 --- /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 0000000000..d4242bd270 --- /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 0000000000..0daad2457c --- /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 20b1663558..d38a8884cc 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 0000000000..9e48ced4eb --- /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 0000000000..46cf272994 --- /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 0000000000..19571d3ecf --- /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 72c350dad2..beb955cdb6 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 fb202f73b3..8398212681 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 1bdfa9ac4e..1ce5fcdca0 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 0000000000..ce72e3b3be --- /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 0000000000..db774e6fa0 --- /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 61370236a9..dc18049ba1 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 0000000000..db774e6fa0 --- /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 a312391961..527a6f45d3 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 f6bde89a3a..76a1e7117b 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 05bcf44166..b96299070e 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 0000000000..2a983ee79b --- /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 479fa4bee2..40bc1f09a8 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 0000000000..2e8dcdc14c --- /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 01cf3feb4a..8ee0aeaaa7 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 7d50b4ea61..d4eecaad20 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 0000000000..5ffdfc78cf --- /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 0000000000..b32becac87 --- /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 0000000000..e53864e7a0 --- /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 0000000000..9a0a1d8899 --- /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 0000000000..700372a916 --- /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 0000000000..68af2a4639 --- /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 049d88ba3a..52da286bbc 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 054f7a5a18..bbc7b0c373 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 4b825f1dfd..792290656d 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 4be8656a3b..2da6bc19d7 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 bda554b39c..fecab81829 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 34c49f13b9..81292c8306 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 cd829c3f12..4befbe95f6 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 cb6285e479..8cc6883387 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 17be05d9ff..d262a9659d 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 909116d8fa..170edcaf48 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 f5c066ae4c..6ce7948472 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 afb9258cdd..de6ca6f483 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 955507c447..1d19cb32b8 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 f1cb6881a9..01b6309e90 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 4239648627..f6c91435c0 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 58e86a3d22..2a274bf75d 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 826a6c4bd0..80d075c358 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 0ab768ae7b..ece65955de 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 b60748ad84..906b647bbe 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 04db56d126..e839d9864c 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 59875cbe61..d0ea36f7bf 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 96e037ce72..a94269808d 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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..cbdc153a58 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..d8a4c45301 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 0000000000..2fc0c81a46 --- /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 ced6f03440..816d0519ec 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 6b97a4c94b..e1b5072b96 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 244284995e..0a38e6200b 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 617ee8bf51..c44ee10761 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 50c1bd8b43..b2169dbc2a 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 435497933d..0c325c7097 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 a53a04a3cc..eddf31c91a 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 4f392558d2..9f8276ff3b 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 ed73bcf061..8b3492a042 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 4677c69a7b..2d63c0f585 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 45fb05b010..f3673c2775 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 ae77202ec8..a5b4c5cc46 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 00b5ec5d08..d7f17fb522 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 bc53a164a5..f7c93460fa 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 10f635d8d4..1d48834f75 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 c7a20a8aba..1a5b58586d 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 004fbc36c5..e2fce8f57c 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 5522e08226..deb2de26fd 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 3d0530c54e..5123fa9438 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 73e1b48b34..edf88f798f 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 96172796a5..62d823c5fe 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 693079bcd9..02024b1849 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 310cf325f0..2c0e06f800 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 0000000000..a3922ec5b6 --- /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 0000000000..287aace0fe --- /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 0000000000..d28a1480f9 --- /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 0000000000..611c172b42 --- /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 0000000000..2d25417753 --- /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 0000000000..13aad35f5b --- /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 0000000000..1673ff4044 --- /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 0000000000..3c5eee88fb --- /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 0000000000..afbbced95e --- /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 0000000000..1c05c37281 --- /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 0000000000..9c47ef2069 --- /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 0000000000..a099f895f9 --- /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 0000000000..a099f895f9 --- /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 0000000000..6f16b99f5e --- /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 0000000000..a1a6b03867 --- /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 0000000000..eef7cb31d0 --- /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 0000000000..34f34c789d --- /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 0000000000..b19309b5ac --- /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 0000000000..c22e68673a --- /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 0000000000..5fb0b0a2ad --- /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 0000000000..1a330a2e3e --- /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 0000000000..184ee25ab2 --- /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 0000000000..7671b559d5 --- /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 0000000000..b91fd076b8 --- /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 0000000000..d4fdf75a2d --- /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 0000000000..724a20934f --- /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 0000000000..dc980b3908 --- /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 0000000000..9f3acdac98 --- /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 0000000000..ddaa6a26c5 --- /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 0000000000..fd11ec96ce --- /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 0000000000..3c5eee88fb --- /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 0000000000..4392f15554 --- /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 0000000000..3c5eee88fb --- /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 0000000000..0950f58f18 --- /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 0000000000..91860a2966 --- /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 0000000000..91860a2966 --- /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 0000000000..fc36e86b9f --- /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 0000000000..900934ae82 --- /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 0000000000..260d2d8075 --- /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 0000000000..2e362de69f --- /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 0000000000..1238dd85b7 --- /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 0000000000..ddc6e1a1d3 --- /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 0000000000..64b24fe6f1 --- /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 0000000000..bf46c84aa0 --- /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 0000000000..b9b8f44712 --- /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 0000000000..603e9049fd --- /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 0000000000..69b22a8448 --- /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 0000000000..276927624d --- /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 0000000000..0f16352916 --- /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 02c4b631ff..207dbe2b3a 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 fe50470f59..eb79eb5edd 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 6dc7f9f051..7a687ac8e9 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 1b0b909e5d..ee50332933 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 c73eafdc26..d37fe5d038 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 dc2cd72d3a..85044505c8 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 89a3c8751b..4e95e6934f 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 1f06141472..27033df404 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 e9a5835e2d..84c69d1b6f 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 ca2468ced7..89cfcbf358 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 8230edd5ca..f913f513b2 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 7d4fbb76be..975b0154da 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 ef622bb6b3..e416bdc6a6 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 c9fcc2d150..9444b5045d 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 2a6aaa2984..9f26892e70 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 725ade01ae..c1184dbb9e 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 4b5471bc08..6285162878 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 102d1420d6..e6d7329f52 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 e21eb422a6..c26b3b9383 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 b9594f9ec8..b660cb871d 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 6bbd3cee3e..baed592049 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 3569cc2165..1c6af1dc4c 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 8d437f90dc..1d500c180c 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 0000000000..0e013c92be --- /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 0000000000..41a6cd0b14 --- /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 f6c18cbe11..359768ca7a 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 0000000000..f611b8ee06 --- /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 4889c1781c..eb23f36df4 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 afda756740..35942dab17 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 0000000000..eff781806b --- /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 a53bbed07d..5e7f387449 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 7efad821a9..cc3d8a7364 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 0000000000..792fad8c9d --- /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 472cb98f28..96bd7c448a 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 0000000000..399a8b498d --- /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 d4cdcf3d25..b2b1462687 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 0000000000..a6c60e9e21 --- /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 0000000000..625a219799 --- /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 6be3e60959..3b374ad959 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 0000000000..aac497e66c --- /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 0000000000..659e5eca5d --- /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 0000000000..f611b8ee06 --- /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 fbefbc43e0..08be469573 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 0000000000..5550a4f1a1 --- /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 0000000000..9b5d837269 --- /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 0000000000..13918041a6 --- /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 93ab26d458..119152d612 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 0000000000..fd3335f2f4 --- /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 b7ebc93099..223e78168b 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 99b6f12fd6..0ef9f04f98 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 0000000000..ffa97a4cd2 --- /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 0000000000..1c1179756f --- /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 cfd63d190c..a5b73362a0 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 0000000000..6b4aa51f99 --- /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 29b3beaee6..c7afb44a0f 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 0000000000..f611b8ee06 --- /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 0000000000..ea8b4e6855 --- /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 0000000000..a5b625e43e --- /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 2b459ccab0..d1864a2239 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 0000000000..df9c217fe5 --- /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 eafc10bd8a..a57aa704bd 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 b7f62a138d..2d59dcd5ca 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 0000000000..83147683e3 --- /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 0000000000..c49493bd17 --- /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 0000000000..02970796a6 --- /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 0000000000..e37ff20a2b --- /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 0000000000..f5c2c85e22 --- /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 0000000000..f611b8ee06 --- /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 c4020b8194..1524b34111 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 e3353c5e5b..53ff574364 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 df7ce90507..f384905d1a 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 c3c6adcc21..23263beb4c 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 5154a9c276..2b4cf1316f 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 f482761309..4ab1ac566e 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 e9144a14e3..9dbb9d4f1f 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 e75a1667ad..0385113787 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 eb691d1341..c027473ad1 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 6067a6e62d..5db3f001b4 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 6dfebbd9b4..9bcf41c23a 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 ffdd4bce79..8ef8cc716b 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 0394dd99ba..fcdc00168e 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 881b7d57c8..070a509cd1 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 e9306d9591..3b23ca96bf 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 a997675acc..cd78c5f2c5 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 514ae2bc02..f96b2c05ea 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 c89058465e..0702ca3bbd 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 e5620f25c8..895bf9c5bf 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 0d0ca24139..242232663f 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 603d4426ca..7a530e44fb 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 6114f89afb..61d4dc4660 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 ed51d48148..8c57e4226a 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 67038a0a59..fc3d4f64fc 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 b6ec410584..e9cfbce529 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 44025b8475..9f43be5d93 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 c8fa12df5e..5b57e11ac6 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 338593ec0c..8196d4bffe 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 0514010ce5..18433ab169 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 f66fc97a4f..846aca7f4e 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 cc499625cf..88041b9abe 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 ca0d1626b9..3cb932e609 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 cced4f6314..0e024a0e1e 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 0d83b874a6..a46b53faf8 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 52ddf089cf..a0438b6af8 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 a240fe50d7..f16aac2174 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 a92b9016b3..85333490f3 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 cee47da471..d424f19699 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 23b5c7a70c..9475a0b291 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 393c60bc80..0128f0ad44 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 397edebc9c..02f43e0d4a 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 4b303e4a5b..d0fe7cba89 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 a6b9b147ee..1c05beac36 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 64b9b97b2e..7b161dcda0 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 a489b21033..4c04a5d32c 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 da640cfb94..9ad5f298fb 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 d243dd162a..83333c60fe 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 a55e799fc2..23b40164c7 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 9f39e513c6..166ddaa68a 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 b439b08922..1ec89b44d9 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 fdbb9a4ea8..27dfb56f8d 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 d902ec35ef..cecc1d75c6 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 8d886f249f..12e74728fc 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 b281d43794..47e2eda63a 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 2f14684131..912748ada8 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 a256377902..a3aac5f013 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 ac17b44d37..afece58eef 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 365be074a1..10589dac47 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 f2233607e6..d31465ac39 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 84cf754b04..0eb7c99a91 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 aa9be50373..692d1247fc 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 461eda1a63..b575db70f1 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 8ed4adbe04..533d2edf6f 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 1fbd0216cc..41858abd83 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 8c97176e0e..69cdadb4df 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 985c02493b..8c73521afd 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 89e102d844..2ae18d8342 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 0ac2ea2095..d4fa954b40 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 d05eda9952..a3c86dda34 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 4fcd689424..6fa745a8b5 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 53367773da..44ee1ad440 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 32a4ec76ca..e21472d4da 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 df4e97ab97..10030cba55 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 7944a8135d..22cb8590c3 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 55764fb1dc..caca14b79e 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 5adeaf2f0b..e34e2fb7fd 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 fde79efe83..60deb64a07 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 6341001621..484be7bd41 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 16771d9447..fc736c667b 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 9c4042720f..3f30c1babd 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 529d497e62..f2bb4dfa3d 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 dffbe942b1..3a2cb80fc9 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 c8cd52a169..7f214c4774 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 6fd7744825..9244acb214 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 302c4b9cbd..8b08af7b10 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 907327ea26..1d589f942e 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 fada51c6ec..bc3bb2955a 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 b0458e22bc..c5e1abdf72 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 e0feb85f17..b95c12a1d8 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 0f8c0a86f8..30607ad3b1 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 857958c031..0025551142 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 be37c8c824..7527294a3c 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 bbca18fcfc..6dc996fa67 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 c55904286e..487a036e44 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 2c2bfb7aba..697f676df7 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 fc299883cf..b1d244cc4d 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 ee06d4802f..e497ef546e 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 c6e67d666c..f718142496 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 a9af04df80..9ddf3c9558 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 ac45fd5963..cb666a7d72 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 28f0812049..ca145bd68c 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 c02c0abf8f..55d1d4e0d9 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 de3450c581..608a4a7879 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 652f16c67c..1b91c566a5 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 616ee6d859..f427f3e3a1 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 618743d07f..77fd651741 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 ce2f97e06a..06375b4a0b 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 0ccb9a8b95..25828e48db 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 143b2155ac..860d455d58 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 b8e0636b95..a6e7e73890 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 132914b74f..79917f35d7 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 fd1b4f2dad..d2c326270e 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 994cb8da5f..f2d2200f44 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 318ab6220d..bb79e2d1e5 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 03a52485c2..497179b2a1 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 90dd206046..0916a0ac34 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 7202144aaa..272e4d6f04 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 808637328d..5bef54b6df 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 a7e989f1ab..d088b64b4d 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 d4afcb7a1c..e6e6208a8a 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 167f24d379..4c76920226 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 8f56813cbb..3e62a06630 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 4e2e3eb72c..fabc33234b 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 e78930a9d3..d16a249d1a 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 50502ce40e..4ba78dcfbb 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 a174aba2a1..6f530fa8a8 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 f7d53f1449..bbbeed0c1f 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 0bb393e338..a16cf1ae38 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 0000000000..0271388876 --- /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 bf8c7dfc0c..9113e3c8d8 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 50f54a1770..384efdebff 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 a667f2224f..7b93dfe2fb 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 e023916c42..d021c1fcba 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 8acd3966bc..ba605bd659 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 be7f53ec63..8713163bdf 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 2eb4e7f901..f7bc89da80 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 413af8497b..af0bd912bc 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 0cb2a37698..131e0855ef 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 71735d70d9..20ff3db651 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 fc8c3aeaaf..74eec7a1f1 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 1f0b1b4754..f8defa4970 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 f8e2f981a4..6799422751 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 e4a906e713..ee0ac26e0c 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 d106a400bd..0afc9ee702 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 a2789f6c1a..2007a946dd 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 7bb24458f7..32c3f892e5 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 dce5ea993e..ba84a2e30c 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 228d30b2c6..56684b3253 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 aedbdb9980..ab64bd1b9f 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 365a5ec232..3bfceb324a 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 5d49f0f43c..73a29caced 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 c1011c2904..1fe0ef5c6e 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 ce1a92a895..0776c148e9 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 f25c034e98..5fb6d3a3e6 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 3583df7940..a3747044a5 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 dece8693da..9ca44a36d8 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 c9c67d1f0f..58855eeb62 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 581e63a15e..a5da0304c5 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 23b299a939..9b24b09b10 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 db2f7336f1..d22f3a3908 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 5ebc1747f3..d5c890e416 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 133c92f78d..54392f3e29 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 955b7081c6..a405883fd3 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 98e2af15c8..4ae00e7495 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 eb052f4b9c..9e0484dd6b 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 a054daab11..31e3f8646e 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 12d9edeb42..9e9ef66d1d 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 90be81c68b..4db38e2b91 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 8e5f5cca27..81ec65f0d6 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 0000000000..f39ed488a1 --- /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 68a77191b9..5ed6e4c2f9 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 d4d0f0fba8..c2ebfb92f9 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 87a6da7b09..d1cfe9f7a9 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 d08f961797..33b3200927 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 2177c28146..7316275f37 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 27f8eb2579..d41faddcc6 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 571c9f59d6..766f05d31b 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 5ea3fadf43..66f1bb5280 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 5130b3f9f6..329776ed22 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 140f3dd9e4..a456a2688e 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 559aecbcd8..806bf54d35 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 ef6b051dec..a62009f19b 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 37788b1e05..6ada7a1745 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 0d0188128c..5e828a8266 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 05da161730..7c129cba3a 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 f8d7436307..63ce9b7bec 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 199fdcd0c8..a040c880e3 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 ebc6f80f70..92935906a8 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 9eab7eff5a..ed20b5a904 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 9334b57230..eb0fa0ec6c 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 44faede844..8d8fe62903 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 553662de61..c5b303e9cd 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 4c9a9830bb..92fd386c5c 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 dc1e361770..82a894ffb3 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 9df04019e6..2666696f8d 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 daec97603e..27b9b398e7 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 8d0304e883..2ea9b41950 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 d75bf7e053..d816813855 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 4f94c67d12..773a2d8c59 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 5297ac3263..238ac5711f 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 f75e55b102..6308098b9c 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 8d472c811c..a0ed665986 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 5ab9a2b060..d2418b0072 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 fffe08d20c..8ed8bcc843 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 7b244a681e..3a805baec0 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 a1ac11c17f..2e567a27ce 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 33336623be..2d65458665 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 b8a8fc3e34..526c258bb2 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 9cdea36d20..85775d06e2 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 4af3f8dcc7..a70720a332 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 b60e3c4e95..0adab5dcdc 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 19382fadb4..b5953decc6 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 c1d04ccebe..2594540c6e 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 ea811dac99..f0e074aca2 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 2ec7dfa767..afad668a98 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 41072b2966..674a01556c 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 bbe9a31a7c..46b714b729 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 ba5d2fbf00..f5f165e37e 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 8dc744fad0..6a434860c0 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 c317e5bb46..4eb8677762 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 389a306a53..ce0824075b 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 ec8790d26f..3d8e88d2d0 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 eb361bcdb2..4cfd8e27cf 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 82400e48f8..1f35d3466c 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 d962d259a1..0a8d187e50 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 62f2e05e15..1e23982e0a 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 0804fb59df..d157a74606 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 d7c7da341e..d2d67e0e51 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 b621bedfd1..e71b6a20b2 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 cde5e827b1..e7d410a1d8 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 39b350e0e2..f5749ebf2c 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 ecec03f6ed..7332643a4f 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 b3218f473d..dd23b6ac42 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 17686771cd..582dc1037b 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 80f287cabb..a4d4d1b983 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 20860d104e..8de4e5bcb9 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 9bef8c10e3..231db98bd5 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 a0199c3819..2557123da3 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 d2fbb03c91..eba134e156 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 66eebbf7c7..fcbb879548 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 0aeca50a0a..0ff4da3b2e 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 c2871984d9..016518495d 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 1aea820987..d2d92d1e85 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 20acbb6ab7..8082f912be 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 767e73d3ed..034aff83ec 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 90f01a0d82..a918de60fe 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 c6f600ef5d..3179afd93a 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 8860d0d090..335d8834ec 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 918a3b849d..ee8fc183b3 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 0000000000..55c234fbde --- /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 3b83ce4083..a57dbfa7e0 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 0000000000..158d5d0ea4 --- /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 0000000000..39bc6a8b2d --- /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 0000000000..490d3242f6 --- /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 0000000000..851833c7f7 --- /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 0000000000..3ecfc7048b --- /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 0000000000..fbbdd78888 --- /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 0000000000..53121aa8ab --- /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 0000000000..f1edbe1fe5 --- /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 0000000000..69d1f3539b --- /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 0000000000..e95012f318 --- /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 0000000000..debb343359 --- /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 0000000000..d92f73d4a7 --- /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 0000000000..d92f73d4a7 --- /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 0000000000..d2c08643c0 --- /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 0000000000..29392867d8 --- /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 0000000000..7c4a993c7c --- /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 0000000000..bfcad73e8e --- /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 0000000000..5d7a44ad47 --- /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 0000000000..6e872e1492 --- /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 0000000000..0fbda59731 --- /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 0000000000..b5c88047f6 --- /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 0000000000..7bb60b0986 --- /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 0000000000..723b49fe6a --- /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 0000000000..bc22e65d2d --- /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 0000000000..389e575158 --- /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 0000000000..b09c72c410 --- /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 0000000000..8d34274c23 --- /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 0000000000..622c197876 --- /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 0000000000..397eb6b088 --- /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 0000000000..d475109f2f --- /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 0000000000..409692f722 --- /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 0000000000..d475109f2f --- /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 0000000000..61c214981b --- /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 0000000000..d92f73d4a7 --- /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 0000000000..d92f73d4a7 --- /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 0000000000..389e575158 --- /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 0000000000..b3126e52f8 --- /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 0000000000..cef031d505 --- /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 0000000000..13770eba67 --- /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 0000000000..737e068fd3 --- /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 0000000000..dbf2312179 --- /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 0000000000..254e99451c --- /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 0000000000..7339ffe3eb --- /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 0000000000..3f10d1f6c1 --- /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 0000000000..86821a3e50 --- /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 0000000000..a9769af907 --- /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 0000000000..b09c72c410 --- /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 0000000000..b09c72c410 --- /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 4df9b3ef11..dcb76f65ac 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 04b3a1ed08..7a4831517f 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 755ce131b2..26e37c64b7 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 ed75e5b1f0..8d0e0d37c4 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 359f3250f6..4d587ba2e5 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 96dddf9ba3..7537482ce5 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 36fee5bb36..6e0e7eb538 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 7c5eab0fa5..ca40862f47 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 8a841ce057..c9bb0d6fa6 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 8b502fd37e..1c9cabbf74 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 dbd1c8fd7d..b60cdeb60f 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 da4daa0fa5..84d55f51ef 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 bfa3ad3834..c19a53619f 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 70f155cebf..b6a2849569 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 d9f369a640..750906af83 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 3a946a2229..45e48d8ad3 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 ee74ca2750..ee87b78aa9 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 04941b7627..9ae52b9c79 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 13d8dc69fd..7d76bcc9ed 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 705bea205c..6f9ab3bac1 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 6d73fbba8d..736e9620ce 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 b346e92c21..ae6e6c8a61 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 75cf013e69..165d889dbd 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 8b56d89b74..52c30681ef 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 c89411168d..d7b2697d5e 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 d3ec784e3f..6b11fe3950 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 6ec527da6c..da5c3260f2 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 f7cfce0fd6..973ff695ac 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 6b02df2045..1476e8beb0 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 93194bdcab..0f8f81b443 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 a3f4861ea8..7ea083a366 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 d2e8c68d85..f4d06e8eca 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 0000000000..e64f7d1d38 --- /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 700a062b8c..f912b81f4c 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 0830995a6a..d00f3d0818 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 68651936a6..5cddc5b082 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 7e73d5873f..f698ad9287 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 536a3a137c..81b0f9c8b7 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 b3841ba87c..177fd72067 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 60a6a26957..74d1e6981b 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 a84b260dbf..f04c585bd2 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 2f8562da23..2eaad31971 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 d018a59eba..5464e03424 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 94b0b467c8..47139616e9 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 f31cff7d74..012ac2ae56 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 0000000000..1f0b269562 --- /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 5b72d9a201..35cd266854 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 dd91b04bed..929281f736 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 0000000000..f4b110f857 --- /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 0000000000..2447be7ee6 --- /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 0000000000..a5808a43f1 --- /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 0000000000..1b614a752d --- /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 d524e1a770..5d23794c07 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 def09ea4b6..41a155b147 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 525b5b00fa..25006b481b 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 3b835faa2b..1533e58651 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 baec16255e..17d259ad1d 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 959621e364..73918a9e8a 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 c208eb3295..11cce45dcd 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 8b1beebdc7..6ccdae6437 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 6128361f85..f26e799856 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 266315f660..27b3fd1cbd 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 703a675f28..1ce0a275f1 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 b0b21e3c2d..4b5fea8f31 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 3d73199cbf..07cc2f56ed 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 aaaee5d1ad..8eea281729 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 c2190ceba5..b81fe14497 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 c554b06241..5ab4b0145b 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 2360e81a4a..3b8cbf12ea 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 55bd70077c..c938db307d 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 0ae08cf66b..9677642266 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 929ded46fb..e09ec648ee 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 b6e3120f36..4a4776dc82 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 1c1f80cc6e..6ff9546167 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 134771d6c9..d26ca0726b 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 5cd75240de..c493a15b05 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 2d28462243..158bb08b25 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 0dedcaa8b0..3c87781d2c 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 6b6b326756..a22b01f948 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 7a9716f76c..6c253be785 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 a6188bb18c..6d7e4e99e2 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 53b6fcd6b3..bb396d8329 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 b7550430aa..89d80216fd 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 6abc49e8aa..77f87a19e0 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 4d941d7361..ebb09f2ded 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 4d408ef525..c4f7834ff8 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 dd7fef44ef..284285af65 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 790819bbe3..4152b732a7 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 859b9e72f9..7e8691ebf2 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 5181c87f3b..b3e40ae29b 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 2a2e2ec651..92ecaad74c 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 d52cd1906a..9e6e01c427 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 846425ec42..5b4ce86e96 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 fe95bee061..f95723b6d4 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 399ecfc045..7c7f26b432 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 3e6a5820ed..d960e2d93b 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 552ec1b7da..faba0c7f6e 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 d3abe40bf9..5e86cd92b4 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 4a828e919e..4082c2a24a 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 274cd02bf7..451ab397ea 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 a52c2e0300..83e99a166c 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 d83a34ba9d..bdfd4e5593 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 77a9bbf2c0..25dd4fab31 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 c7036e9316..35ad238969 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 8da0aad273..bb79fca2c9 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 ffe8501b58..69f3650405 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 2bf02b8cdf..ab6cc91324 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 0e86684c61..1c2af9e8d7 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 4161597a7e..72001c7de8 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 f62821fbf0..4504ca6a74 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 c340035226..00d2840e2f 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 08154069b3..d03ee6889c 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 882cd328f8..f27d6a35c4 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 3a6be91a99..e8d19233bb 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 317c4932e1..8aa3b52e9c 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 8e4944772c..816f2c8608 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 0f35269d00..f3909591be 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 7f765d5a93..de605d6b52 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 a5066e0ca3..fe1dc22d92 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 98ff43014f..d86a5376d0 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 0000000000..17a9898a6a --- /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 0000000000..3e24c371eb --- /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 0000000000..64231ae849 --- /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 0000000000..50c6d29772 --- /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 0000000000..3cab1ead06 --- /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 0000000000..10115f789a --- /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 0000000000..10115f789a --- /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 0000000000..10115f789a --- /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 0000000000..0a7edb3fc4 --- /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 0000000000..10115f789a --- /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 0000000000..50c6d29772 --- /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 0000000000..50c6d29772 --- /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 0000000000..1e1b86c727 --- /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 0000000000..5c6dc94faa --- /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 0000000000..017a0a475f --- /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 0000000000..eb19d67df3 --- /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 0000000000..b274386c76 --- /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 0000000000..124f9bc98c --- /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 0000000000..3cab1ead06 --- /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 0000000000..360c50904c --- /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 0000000000..53fdb6259e --- /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 0000000000..ae23fa734b --- /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 0000000000..63a76067d8 --- /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 0000000000..50c6d29772 --- /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 0000000000..c610af6a48 --- /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 0000000000..1aef1ab0e9 --- /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 0000000000..035a864fd7 --- /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 0000000000..50c6d29772 --- /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 0000000000..d8a4c45301 --- /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 0000000000..17a9898a6a --- /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 0000000000..10115f789a --- /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 0000000000..3cab1ead06 --- /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 0000000000..3e5f0c035b --- /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 0000000000..3e5f0c035b --- /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 0000000000..f35a370b2c --- /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 0000000000..c4925cda1d --- /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 0000000000..3cab1ead06 --- /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 0000000000..97bbbf11ef --- /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 0000000000..c3b0c189d7 --- /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 0000000000..10115f789a --- /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 0000000000..166b76408d --- /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 0000000000..6cf6b85da6 --- /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 0000000000..b8dcc73c97 --- /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 0000000000..877ae81ffc --- /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 0000000000..504c447610 --- /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 0000000000..93c00b920e --- /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 8a217c57a6..d8339e1100 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 005175c5bf..a0e610e452 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 5114b578c3..88b047a2a4 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 5c104c9399..ec4c3b87d9 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 5a41facb50..42d37f042f 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 40cca942a8..96dae84b85 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 af1305b00e..e52a80be98 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 849913b40b..79ea8c05b4 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 03963cb15a..b1ab00551e 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 5d769289d2..2c6235cf17 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 1591d0f311..4cb94a81a7 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 441fbef41d..5bded3676d 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 0ae305c76e..4d46fb9265 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 c0abea57bc..4f771b7b96 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 a902c3d4d0..4edc54e357 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 1d6ebea298..d03486ceb3 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 b74ad36365..2e6e876e89 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 85d744b252..63707d54c6 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 8c2fc19bdb..e349d5fba2 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 f07766c88d..4ad08ae680 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 0000000000..dc3b3e99d4 --- /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 0000000000..269f050ca4 --- /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 0000000000..6d46e23214 --- /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 0000000000..febaa038f6 --- /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 0000000000..9a3593e079 --- /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 0000000000..8248f17c18 --- /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 0000000000..93c8d3fea8 --- /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 0000000000..b882d5b95a --- /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 0000000000..27e6172cd5 --- /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 0000000000..781ae4a383 --- /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 0000000000..41e2c9387b --- /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 0000000000..9a3593e079 --- /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 0000000000..9a3593e079 --- /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 0000000000..cc5b0927e5 --- /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 0000000000..c371e20d82 --- /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 0000000000..285be78528 --- /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 0000000000..b882d5b95a --- /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 0000000000..27e6172cd5 --- /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 0000000000..5604e8e8ec --- /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 0000000000..febaa038f6 --- /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 0000000000..46523c8159 --- /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 0000000000..903ba4609d --- /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 0000000000..8e80040716 --- /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 0000000000..9a3593e079 --- /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 0000000000..783b2fc3a0 --- /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 0000000000..89db16e8af --- /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 0000000000..78fda836cb --- /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 0000000000..98a9a93b1c --- /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 0000000000..b882d5b95a --- /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 0000000000..dc3b3e99d4 --- /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 0000000000..b882d5b95a --- /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 0000000000..6c3395eac4 --- /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 0000000000..9a3593e079 --- /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 0000000000..9a3593e079 --- /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 0000000000..8429efc173 --- /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 0000000000..6d46e23214 --- /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 0000000000..11dc6de703 --- /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 0000000000..dc3b3e99d4 --- /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 0000000000..0133f89319 --- /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 0000000000..73e0b31dbe --- /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 0000000000..b0abb2165c --- /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 0000000000..7f8902dbf7 --- /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 0000000000..df25afb9fd --- /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 0000000000..310b7f9cc7 --- /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 0000000000..5842ec092e --- /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 0000000000..5842ec092e --- /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 ee2534fa77..fabb44dc9e 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 e11634c2d8..250f1a3b2f 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 5558a73aa7..06b40f1b1a 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 15b7a823a9..e8aea9921c 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 8383a6a349..731e95915c 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 dfddaf0274..8fa797aec8 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 6190c0a52a..b26c6a4b38 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 edbbe2d4d9..6950a0de17 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 cdf95c7017..5296b208e7 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 5db92410f1..503cfcbd11 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 47d5bfcf9c..1c8e51f9f1 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 94b0d55afb..563d228205 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 21235032c3..6938bdea5f 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 1e3285a628..f3743bd0ff 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 f3a9bbbc7d..53f80db934 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 d28ee5a2e4..44de2e3955 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 a208aa3fda..3ae1885e76 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 d8f5e4be15..ba35af1b32 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 27e7cd47e0..da8f675a65 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 a67d242398..9a52ca8ad5 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 e834de8ae0..6ff775a8a0 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 c39cec0c73..f9c802c261 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 8692c4c02c..4530705a8b 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 53b2f2f664..b505df4ec2 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 c53605865f..e55bb54da4 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 fec1cb0b40..2b6e51ba4a 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 7488d527ec..0589f7c846 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 eda0c666b6..75f7a25210 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 e6a90325e0..d63879b3b5 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 507b423314..62225188d8 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 1b54d0ca3b..1f8ca1cc10 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 3090a8cb16..9262a271fb 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 bc107a24a9..a257ba3e11 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 85e383be71..e275d0f231 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 0aad75fc4f..d13d320154 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 99d65227b2..5816f1a0bc 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 ea087c1af7..609209738e 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 fb49b3e7fb..972a232036 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 7f97ee23f9..2fd65bb972 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 26c208ef9a..f7050c2c25 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 9ce14cc2ff..ecefc3b656 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 5de5978979..0337dad22e 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 4909384626..f2a598770a 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 4e032a7095..f5317e3046 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 ec46be861b..378abf486a 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 9e98e4a949..0489feb270 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 376e875150..d7e0c759bb 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 dbbaf1c372..09d103c6f6 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 43c3560df9..7922a11845 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 8be90459f7..9f1e0670d6 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 7f5b3e3820..0c105f2616 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 cfe47b199f..4f5f75dc64 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 0000000000..122d8bcfd0 --- /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 8e80584957..91bb4b6180 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 0000000000..b53d6013fa --- /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 0000000000..ed1cef3d9f --- /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 0000000000..ee1630232e --- /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 0000000000..0981324d79 --- /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 0000000000..cd24bb9b58 --- /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 0000000000..a7b2b73ad2 --- /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 0000000000..5f1a1c66de --- /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 0000000000..bad36c8d19 --- /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 0000000000..4561b1ff41 --- /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 0000000000..e748094177 --- /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 0000000000..3a5a4259f5 --- /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 0000000000..3ed10dfad9 --- /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 0000000000..3ed10dfad9 --- /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 0000000000..aef8891a16 --- /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 0000000000..ab40939b84 --- /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 0000000000..7b79875970 --- /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 0000000000..97bbf34c7d --- /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 0000000000..1e840a5f52 --- /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 0000000000..e8ffb63317 --- /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 0000000000..0a64f65abd --- /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 0000000000..1e80961119 --- /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 0000000000..f243ae9516 --- /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 0000000000..0b0eddc0f7 --- /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 0000000000..dd8036a9ec --- /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 0000000000..5ea121f977 --- /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 0000000000..ef881ed0af --- /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 0000000000..a27e9b4039 --- /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 0000000000..54bd5b092f --- /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 0000000000..7c47e31401 --- /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 0000000000..2712cef60f --- /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 0000000000..011c91def7 --- /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 0000000000..1e3280d0ca --- /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 0000000000..d051dc791a --- /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 0000000000..d051dc791a --- /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 0000000000..ce4664e8c4 --- /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 0000000000..7e2fb36b69 --- /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 0000000000..96f9e25282 --- /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 0000000000..b7977354c8 --- /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 0000000000..a737307424 --- /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 0000000000..935a5a4a4f --- /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 0000000000..a23d1446e8 --- /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 0000000000..dca2f176b5 --- /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 0000000000..2090978108 --- /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 0000000000..ec3b08eab1 --- /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 0000000000..962f435cc3 --- /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 0000000000..1cc79a1656 --- /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 78a52d9087..7d453374b9 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 a00f8930d5..09b41d0058 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 31c9485115..d61911f012 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 2b97431b1a..353edb079a 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 53c357fa8f..73fe6e8926 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 242fbfe890..a7c67304a7 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 340d4742ba..eabbc340cc 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 45af82bfb8..d9d410b11d 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 0ce8b77e7e..ca152e727c 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 4b25ffa005..7513b5be12 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 a9afe10984..dc73362280 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 23f58ad5bd..7285ffb97b 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 9cb8c51d98..4295422780 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 3f239306ec..9b010ce288 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 d8a7fb3022..a9b44db373 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 b56efa60ac..cd9b80175a 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 e9d7481bb6..f13c5b00bb 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 ceab0e65a3..593ecd19f9 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 774e6a2695..9250f5a375 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 3d0fbad5b5..f2a85e2c3e 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 f28083fd72..13dfc6c214 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 da01088462..3ed8a3765f 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 beba04478d..2ffe2fb805 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 53660148d6..821cb0ed05 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 5d98c83708..80efe98c4b 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 9e3e805339..a96fa3b584 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 341fb1afca..8e3e9b68e4 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 0dac2ae5dc..7716dab8ad 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 396082c057..ee7192f6f8 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 cd97e4aaa3..84f2fddcb8 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 d9b547e8fe..35ac17a8bb 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 32871a64c3..d176bc4ab6 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 04cb6dc6ee..d27b78615c 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 e8911d78e9..4a2f4440a2 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 0000000000..c6765575c0 --- /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 e31ee2373a..7203356ab6 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 d638cf5e54..8d4f9aa724 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 523e2fc025..f3545c119a 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 d02d1a45d1..364ca15b03 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 05c291e9d1..ee7bdfeb26 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 ea2b760cb9..2278c7d3e1 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 96d6cec104..5a9c7618b0 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 373a30c435..1c3c8120d3 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 b2abd3fb20..1fbe2c7c15 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 06fe7d4117..84872e8943 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 789893b597..9d68b88d01 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 6d51f68a4d..fce3d6d3a1 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 f7a6b7ea62..a7febddee0 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 ac162b546f..59e5115e2e 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 6aecb4703d..a31785cad0 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 f21909d21c..37d842355c 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 010dc5ca95..2b63decf0c 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 3fd8027fab..a9b2fcedd2 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 385fae5edd..35cd1d1bbf 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 a753548a77..aabe3d3529 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 7930698520..73da8c7c1d 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 8375483af0..0767c509bf 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 b5918917e3..34c769faac 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 fda712f0ba..8f5b985bfe 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 a8f1a65a36..5ec522c9c2 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 121d885c9f..30d7fc1097 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 6debf4ffb8..fe0b3bc009 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 2f6e4e14bf..545d0ded46 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 7e36e6dd4f..bc80cdedb3 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 01e43f011c..8ea3ab6dbc 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 1654b40f9b..8b78ef25eb 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 6dc636f9af..3bd58fccc2 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 229db9e6b1..cd5e3d85d5 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 ae13a03b08..e34b14b2a9 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 985f2cbfce..a41d65fd09 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 ac2a895f7b..e7171ca286 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 9c27fa443a..d6c022cd5c 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 0000000000..f09523e443 --- /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 0000000000..be3fa50d1a --- /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 0000000000..a2c9757076 --- /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 0000000000..4ba22a7ea8 --- /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 0000000000..6435b122f0 --- /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 0000000000..57b03d5753 --- /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 0000000000..f353bce2db --- /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 0000000000..57ff854936 --- /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 0000000000..ae5de70d89 --- /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 0000000000..3432169145 --- /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 0000000000..3e199a8d15 --- /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 0000000000..cca90650a6 --- /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 0000000000..cca90650a6 --- /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 0000000000..a66a0f1b24 --- /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 0000000000..2fc0fdcf3f --- /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 0000000000..ce40f1ee1f --- /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 0000000000..3764168ba2 --- /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 0000000000..f9d426a199 --- /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 0000000000..50a8171d5c --- /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 0000000000..b0226f8670 --- /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 0000000000..4ba22a7ea8 --- /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 0000000000..e18f1aa768 --- /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 0000000000..6a7c57de12 --- /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 0000000000..b16c336d26 --- /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 0000000000..689006c699 --- /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 0000000000..1ff748a07a --- /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 0000000000..ba60376430 --- /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 0000000000..3764168ba2 --- /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 0000000000..504763d0b1 --- /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 0000000000..ad3dec70b8 --- /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 0000000000..fe18f264f7 --- /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 0000000000..ad3dec70b8 --- /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 0000000000..2bb901f003 --- /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 0000000000..cca90650a6 --- /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 0000000000..cca90650a6 --- /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 0000000000..8fbd1e5bf0 --- /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 0000000000..189ff4a1c7 --- /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 0000000000..ece8b289ff --- /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 0000000000..09ff45911e --- /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 0000000000..1779baf7a0 --- /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 0000000000..b61dddc900 --- /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 0000000000..ef3632cfd7 --- /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 0000000000..8158c0b8fb --- /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 0000000000..969bc6825b --- /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 0000000000..189ff4a1c7 --- /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 0000000000..94a0d38c1b --- /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 0000000000..6db6e92c47 --- /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 0000000000..842392580a --- /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 77e8a7db60..bcd3bd43af 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 983bdf0a80..297e8b4037 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 ce7938ac70..70463961dd 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 b30711c49c..79323e41bb 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 e9133de022..0b5d31869c 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 bd53ba0d48..01bbd6587c 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 08d8ed78d2..fba6b94422 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 8ea4152034..a511f696f8 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 c894277abd..caf6d824d0 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 42267f3b8f..17b1edda6b 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 2091ed0b96..08919a0560 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 8bf764ef22..1a64f0268a 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 b44d707b47..319348aa8a 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 82d6644c44..aa3b383bbc 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 d69f926bb0..7a6ae4b2ad 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 a31cbc42b7..ecb09354f0 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 05b83631a9..b9a66540c3 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 4ea988465b..60382ca137 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 7f30d92a63..90b30dfafd 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 c3b79973c7..07414cc2b3 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 f6bc4cbd43..3f190d4133 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 073efa65f4..64c3abf5d1 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 710f8a003d..0192c848e0 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 b41e1a3d8b..7420611936 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 2130d13031..8674c6802b 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 e9254635a3..0f126e6dec 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 92e7bbd796..ba81c5b3e7 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 991882ac87..52a33805e6 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 ce43bbbcd2..fd442881b8 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 1dd9688b33..5b310b20b6 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 da9de46dc9..a133139a8e 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 1c85587acc..a1069936c3 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 5d6d520056..2a9dcc9973 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 2c51f1d15c..28539c8fd5 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 fa58cfde3c..042959a67c 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 5217518cdf..c145637a65 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 0000000000..b063d57eb3 --- /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 1ac6ad5996..2eaab685d2 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 0000000000..4b834d05fc --- /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 2caa4455a9..b06d7d53f2 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 0506560e61..1a0311d080 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 9b20b71155..ec83db6aab 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 5c8a491f6a..026f00a8cb 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 55fc24154f..53a5cd4d06 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 e23c5cdbba..fc997b4974 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 344110ed1a..e37b3104b1 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 5fd2f8b768..f6f09dab4e 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 6b4548ba4f..7b62a48e62 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 3ab32508ce..228c8b1f71 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 dfce3978ad..8e54495a1b 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 4b20490238..2760ec7a18 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 5218982315..9240842ff9 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 d0e2e0f617..1124b5335a 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 15e05bd376..ab1135498c 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 0de30aa5ff..f147edad4d 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 619dbf8dc8..ce75d775f1 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 fb9a6399c6..3246b83338 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 a44be6c5d7..ac440b1225 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 0000000000..c200e28660 --- /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 0000000000..c5f684d24c --- /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 0000000000..41f87cddbc --- /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 0000000000..5f89ee79ab --- /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 0000000000..744d02a54b --- /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 0000000000..b0c79f5227 --- /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 0000000000..5c3577c5ec --- /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 0000000000..827c0c81f3 --- /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 0000000000..2130b6acd8 --- /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 0000000000..8f639975a7 --- /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 0000000000..827c0c81f3 --- /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 0000000000..92aa6caa09 --- /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 0000000000..92aa6caa09 --- /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 0000000000..8f5f2b4ad5 --- /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 0000000000..cb6365c8bb --- /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 0000000000..de5c94387a --- /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 0000000000..7ad8bb6b9f --- /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 0000000000..3f93fa3519 --- /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 0000000000..2130b6acd8 --- /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 0000000000..569260601d --- /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 0000000000..daf2ad0558 --- /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 0000000000..5f89ee79ab --- /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 0000000000..11082f7da4 --- /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 0000000000..61c147c065 --- /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 0000000000..65f2adf732 --- /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 0000000000..e52751789e --- /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 0000000000..5f89ee79ab --- /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 0000000000..a5e3ad2248 --- /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 0000000000..8fdfc4c97f --- /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 0000000000..e2d73434c3 --- /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 0000000000..827c0c81f3 --- /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 0000000000..3f93fa3519 --- /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 0000000000..827c0c81f3 --- /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 0000000000..5f89ee79ab --- /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 0000000000..372fcc493b --- /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 0000000000..372fcc493b --- /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 0000000000..c9251c3ad2 --- /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 0000000000..41f87cddbc --- /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 0000000000..b0c79f5227 --- /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 0000000000..5f89ee79ab --- /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 0000000000..15a1f9b154 --- /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 0000000000..9669feac11 --- /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 0000000000..ec57d75411 --- /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 0000000000..493d0700ee --- /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 0000000000..05cedace90 --- /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 0000000000..41f87cddbc --- /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 0000000000..74aadbed71 --- /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 0000000000..07f890d41d --- /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 0000000000..b05878668a --- /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 0000000000..af1125a367 --- /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 0000000000..9caee96422 --- /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 0000000000..986bddec99 --- /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 0000000000..a884d82d26 --- /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 0000000000..7035228278 --- /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 0000000000..5a85cb524a --- /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 0000000000..181420eb11 --- /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 0000000000..caeaf751b8 --- /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 0000000000..5a85cb524a --- /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 0000000000..ebc54ba093 --- /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 0000000000..caeaf751b8 --- /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 0000000000..caeaf751b8 --- /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 0000000000..caeaf751b8 --- /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 0000000000..5a85cb524a --- /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 0000000000..caeaf751b8 --- /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 0000000000..43eab1daf8 --- /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 0000000000..9ec9fbec9f --- /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 0000000000..caeaf751b8 --- /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 0000000000..5a85cb524a --- /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 0000000000..6ea4199b38 --- /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 0000000000..06ec52a4c0 --- /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 0000000000..a884d82d26 --- /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 0000000000..72bd266fcf --- /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 0000000000..48d4e047f0 --- /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 0000000000..af1125a367 --- /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 0000000000..15ff39db1d --- /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 0000000000..caeaf751b8 --- /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 0000000000..635c0cd831 --- /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 0000000000..6325d0c475 --- /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 0000000000..caeaf751b8 --- /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 0000000000..70a0ee5757 --- /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 0000000000..5a85cb524a --- /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 0000000000..caeaf751b8 --- /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 0000000000..5a85cb524a --- /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 0000000000..18e80a08f7 --- /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 0000000000..caeaf751b8 --- /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 0000000000..caeaf751b8 --- /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 0000000000..c15efcf2c0 --- /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 0000000000..3a0ec79137 --- /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 0000000000..5a85cb524a --- /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 0000000000..a884d82d26 --- /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 0000000000..5a85cb524a --- /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 0000000000..f36754b197 --- /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 0000000000..4ea1d180c5 --- /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 0000000000..741c377a84 --- /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 0000000000..05cedace90 --- /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 0000000000..23ef9b1243 --- /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 0000000000..cdc7006794 --- /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 0000000000..ae63e4f89e --- /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 0000000000..97d4c5820e --- /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 c9e0b2fd48..4b1035607d 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 c448010e5b..de9e6877f2 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 fd4b1f4af3..a5915ae2ce 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 057596e5cb..f80a5da1d4 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 73cf00b355..1175988010 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 c0760337f0..2320eef1a9 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 d97d32c896..154094ae97 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 fd4c937301..3627eb72da 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 798048479c..fdddc6de82 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 d1d527c030..163af6cb51 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 5fcf42caab..8720f80a2c 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 5b3b13f9b6..474634692e 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 0000000000..4caec1811a --- /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 0000000000..315e854058 --- /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 fec7080348..d77c6bc105 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 0000000000..67b14f6ce8 --- /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 94d95e7ddf..5057bf6e27 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 1b2dbad1a4..ada081f4d5 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 0000000000..5612ae88a9 --- /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 3febed8ac0..4992516ac0 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 0680bab7b4..5962e6e133 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 0000000000..6896e08393 --- /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 07411b885b..2025754e0e 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 0000000000..4caec1811a --- /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 3c957c715d..ae0f51132f 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 0000000000..edccbf2498 --- /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 0000000000..9e8213f6e2 --- /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 0000000000..9414fee722 --- /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 0000000000..a4ef0bdade --- /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 cc35f93cb5..1d6dcb072e 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 0000000000..4caec1811a --- /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 0000000000..d4853732bc --- /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 0000000000..37033396da --- /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 0000000000..67b14f6ce8 --- /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 a83db67b3e..1bbdb6e01d 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 0000000000..552e130db7 --- /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 0000000000..4caec1811a --- /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 0000000000..3fa2ac3862 --- /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 0a1b0d13cb..8683b6c0a4 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 0000000000..54d8d581d5 --- /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 7716cc016c..1213d5dbcb 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 f999e3c16f..331317e628 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 0000000000..d49a5a889b --- /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 0000000000..d8a4c45301 --- /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 03eff2a7f6..829392289a 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 0000000000..4caec1811a --- /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 7ef982e0d1..62b5e39e03 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 0000000000..4caec1811a --- /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 032d88e02d..8c4525e7db 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 0000000000..67b14f6ce8 --- /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 0f2c1bc0e4..61b0790dee 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 0000000000..67b14f6ce8 --- /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 3f29b62e66..bbaf85cd53 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 90001148f1..25fd376eca 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 0000000000..65e6eda7f4 --- /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 0000000000..9c887e8da7 --- /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 0000000000..95806a0533 --- /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 0000000000..12b7e8eac3 --- /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 0000000000..96cee87c35 --- /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 0000000000..f66041ad6e --- /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 12059aa6b1..aef79f766c 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 9bf8abc823..d17cdbcf7d 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 ec498ebe3b..7db651b6b9 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 2121153a60..43302714b9 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 ecd3d4d252..c84a80d0cc 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 956c640379..5d6e27bd73 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 74ec441a24..13387488ea 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 965453fe40..445d756624 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 9d58589d7f..fce57ec4b9 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 c472cc5806..d79de976a8 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 03cecbfb34..44090de0b6 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 48b3ddb048..7e60891e16 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 1c0988cee3..92baa5502d 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 3eb2582b61..a3aae13823 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 83f2a11a8b..26a469ce34 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 1115cc97ab..e9bf022b12 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 7b7a840b94..29ae44ca9e 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 6306e1ab2f..114eaa6c9f 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 135779d690..1d07a82818 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 4a2c446f3d..277bff66dc 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 7b1e2a3f35..9d9f60d309 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 34d86a4b46..32ff418a7b 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 793de99a32..c2bc5447d1 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 862ca6f28e..eca91f39a4 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 c48ca23d27..2c5a0d0971 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 d753a54b69..1cbaeffe95 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 34b0f198b5..135e9f843e 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 84d0bf9e84..8ffd687b22 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 471a6a0cf6..4454c82c8f 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 3345d7882c..95331d8c8d 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 1ab01c14b4..c30d967d01 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 9db028011d..97da5ac4e8 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 3c0c165aa5..8e460289ef 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 8c9da14a60..0aeb9cb1d9 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 7ba23b7b0c..8fcc86ffb8 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 d278c5d6f1..6bfc6ce603 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 a732debc04..800ac719ca 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 097c6fe3b7..d5234ea301 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 a84e80f9d0..7046b0992b 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 7e116f6292..4f0b9bf4ee 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 81be13f879..5b10cd9680 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 81c7db754c..48744428b1 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 5014ee44be..721ce3a94f 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 dcb235d247..975c863d95 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 bdbea8983e..9def747bbb 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 9b1d0cc00b..d41236a7f5 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 f0d55c50b2..60a0ba0e15 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 636943d119..ccddbe6cef 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 dfe406db41..95cd3aee0f 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 9c1b9ae624..ded899ad4a 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 1ff1554fa2..d544677370 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 59c2f79d85..148fb6dfc1 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 1fd32fd1be..8e0acaaaa0 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 adebe4b8a7..5cb63393be 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 56c29638be..d71e29e017 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 a4148036eb..248ea85eb3 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 804cce8486..9c57347651 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 2fb6b10a77..e04c296dc8 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 2ba0e1f346..7e65645928 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 051fcb5e6d..7f843bfd7d 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 7bbce69927..0b6f347873 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 dba578def9..a28daf34ac 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 0b8a9f88e8..9f2ed5a4b9 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 19051f906f..5087506fc8 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 ea7c3b8012..b2959577ad 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 5cf7b43851..a02483baa4 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 7acf1e3431..849d69d55e 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 b6164bcd3b..8a8735a807 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 2167553ce6..85ccdf9abc 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 0ee1284a34..11fe5675d5 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 1e4ccb6794..437c2105e7 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 66e56e73bf..979f4b0f7b 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 dc12b0b2ae..d17d577bfe 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 725e95cee0..904ade6ef0 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 e4524f4dcc..3db65a34ad 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 5cfefc8079..d9902ba7d0 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 bd0ad02661..ec53509034 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 bd39f4cff7..425cf92763 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 b3b4155a55..b45b60babf 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 3e3ab1e2ac..dac6c9018b 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 b70a3059be..9444569c4a 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 7227ff139b..06ce8442ad 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 223150f2cd..952e98b648 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 5bfd1d487f..612d12e771 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 6e888f6d5c..0bc966fdd6 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 3272cd0090..c23a33b6e1 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 0ed6fd4d14..0261289fd3 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 6096d9b7f9..35c182455d 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 3dc7f769cd..91fe7d8375 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 f79a283143..b6afc479b7 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 964bb4942e..b2ddc3aa1d 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 281726861a..a37d47cd15 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 4115473253..72f1ad2a4c 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 84b05f3a26..56e1633e3a 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 978bacfbec..ed452d2c9a 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 f75a9af1b6..236ff724a0 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 d9345e42fd..75ce6f5361 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 458ba0436a..f3a97d29f5 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 f2d4e623fc..b03a29ad2e 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 22d7727637..ed18267170 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 483edab97b..eeac06cee2 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 ff2e4b1e97..be49825c8f 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 76d928833a..eec29815f6 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 15cf27984b..4b46821841 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 6f41bfe0a2..f2c380ca30 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 53370bac08..afef3401ca 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 491072a841..1dadfbf94e 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 4ac26d670b..3f6e78fd3b 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 42a2c21705..01c52eb7fb 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 f380296324..a63485cf30 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 7c730cbba4..bf4d97de50 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 699eebac65..a159dd1f6e 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 2930048d59..1c4afe2666 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 1ce3bc44de..8d02a79a5a 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 621bd13ee1..8b10d00e53 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 136ef6fe14..72c1acf7bd 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 4e171b99df..fcf2b0c58b 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 d9a6a482e8..2de03d82c3 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 81ac10aad5..046faae52f 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 64c56cb37d..058f9ac9a9 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 5d835341b6..e0008dcb4c 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 36ccf94c22..8ccf5e626c 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 5963c62bd4..5b7f2e43e3 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 00d2f264b2..a61257b6d1 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 5f9497d48f..ecaaee01ae 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 8024236963..8f2682b3fb 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 9942533798..5522840f18 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 580418df94..435b7564bc 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 064da5cedf..bfdebd385a 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 b08beffb16..3d79c8d744 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 b13fb51aa5..2f582b0826 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 75a19c6a20..79cd15df3b 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 46b2f34b7a..6f28ee53ae 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 420cf8fbb4..008404df59 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 69f98c1850..b0a287b170 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 9c63ecc366..357ff2ac17 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 6bd93ee7bf..0119fca738 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 4a1cca9e53..ff241531ec 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 b484d5925a..af48b1ab8c 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 823ee6c753..fad7efdf39 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 43109352df..e71dd3c4ea 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 c77ebb5369..8d83b05e73 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 cb9786da23..119bd828c6 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 c8ea225175..4b68d5dd42 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 ece81ba345..e71d816b41 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 e3882a4fc2..1665930404 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 043f37e52f..f115865a2b 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 4c917794ca..d3e2f7b16a 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 0cd23e6a11..be7d8e9419 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 9db0ccb350..b2f27a8fcc 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 54c6e3b833..da7890f959 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 ce2614b998..bbb1cedad9 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 70cf906841..5df01fe951 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 b9dad43c44..a601eb2b9b 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 0c0ccf25a1..7e1a15cbde 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 1ce59e3dbc..a77d66c02f 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 8ed84338a1..f34c07efd0 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 4d764b0dab..b0afb6ef16 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 3a28194f6e..64bd20acf9 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 d9a7fd5307..0f062f65fa 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 2f3a55fc91..81c0de81e7 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 8b9244c5d9..cc1fe4c17d 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 cc8be93034..b86ea9b33c 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 4fa8975523..6f3d15206e 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 1fbff59337..b5875aaf08 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 c1f87cd9a7..0c9d9a8d8e 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 ef651375e5..683149c6fd 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 945519c859..9f87f719b5 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 20cb32c9c0..5c8c3cdeb3 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 423684442e..b08900034e 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 14f85bae32..69b8bd6c3b 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 b260aa2108..ba75032342 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 4a1321bfda..296dc3f222 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 a98a23c7f0..0e652624ef 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 5891a80dfc..d15390fdcf 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 51e4c11394..609cc3747b 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 835f113ba2..213ae1e4bc 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 5c85ca2594..771f48d1d9 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 f9ba72d201..b5b421d2d7 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 60c93f7b42..1307f4cfe7 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 8bf0b347b9..8ae4c30e15 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 d39a4d544f..f2c1675a14 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 d47b564853..5efd65b1c7 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 a3540b0e29..cb08944d26 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 32780cecfb..5e6560a294 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 2ebe0e5d3f..56a0e6d534 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 c761b08c60..77e2c75540 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 7296efb687..765d580367 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 c2e4899b5d..338539bf25 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 5389beaec7..fd5f3f6ef0 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 e4fb004456..b3d4cc352f 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 439e9aca79..789c9b84a6 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 5ff26dea49..b047e636ee 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 4a29360e2c..7ea329dc90 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 d118212e77..3b56f9ece6 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 c4aacd2700..887d3b7236 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 7e0f58ad78..10c58c119a 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 b9cf4cb2ef..1b6611c4cb 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 8d16fbf7f9..ff17a3ada8 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 6400bfcd7d..c869d06cab 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 6da10f785f..78b71486b7 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 7fa73eb02c..d4adbe155f 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 a51a4fb258..48ebf35a97 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 893d33225f..c3bfaa47f3 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 9ebb4c70d8..ce1bba1bb5 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 556c5d559b..fedaff526a 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 357d307bc2..82b2551200 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 4dc334c6bd..35b3e4c45f 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 339f86f80a..ca93393c77 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 d0985024f1..aa14f15830 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 c1067de1d6..5a996e4754 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 525ebde7c6..25daba13b8 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 f8f224d2cd..29641464f5 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 688f406a67..33efd72a6d 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 d2ae496f35..1f3fb32b8e 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 b6d7d072e5..d8c7685648 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 3be1164d19..d891baee82 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 1c845e1c59..5788b570eb 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 f93f6d3ff4..cf71829bf2 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 9263a8c3ff..6df1cdf8f0 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 8854ec470d..3720cf1021 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 54d000ff61..9d544eb033 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 6828cffbf7..01364b9c3c 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 8dcd652686..6d9e06c5a3 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 6a917bb17b..dce368d62d 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 c5d7905c5b..e92372f3d8 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 cb69fa9c8d..c682de447b 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 c7e3a1fee3..e17bd9ad95 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 f0b94eef38..5e5a293fc8 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 5555158828..156f7fb826 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 a2e3728ea7..e73585c2e0 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 205088154d..36d627645c 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 f6b7ba8330..d1635d0bc2 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 0000000000..b608241352 --- /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 0000000000..73db65d91c --- /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 0000000000..80ac8acf1f --- /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 0000000000..fd8ab8bd9b --- /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 0000000000..de709024d2 --- /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 0000000000..0fe94354e4 --- /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 0000000000..2f45910186 --- /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 0000000000..de709024d2 --- /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 0000000000..e0b7194b1a --- /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 0000000000..5714f19ac8 --- /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 0000000000..f83cf683d4 --- /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 0000000000..de709024d2 --- /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 0000000000..de709024d2 --- /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 0000000000..3f34ffd9a6 --- /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 0000000000..118e1c11ec --- /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 0000000000..6728f87733 --- /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 0000000000..f62abeeb2d --- /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 0000000000..5ebfae8e5a --- /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 0000000000..95dceb8a09 --- /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 0000000000..e100747234 --- /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 0000000000..1f2784bb5e --- /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 0000000000..fd8ab8bd9b --- /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 0000000000..fa6cfbafc5 --- /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 0000000000..3efc652926 --- /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 0000000000..fad79695ef --- /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 0000000000..0322b9a930 --- /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 0000000000..23122478d1 --- /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 0000000000..53c53fca03 --- /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 0000000000..062a7be486 --- /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 0000000000..c2881207f1 --- /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 0000000000..52d78df421 --- /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 0000000000..de709024d2 --- /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 0000000000..5878a8e9d2 --- /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 0000000000..de709024d2 --- /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 0000000000..258be2c252 --- /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 0000000000..de709024d2 --- /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 0000000000..de709024d2 --- /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 0000000000..cfe2dcec50 --- /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 0000000000..64fb11610b --- /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 0000000000..fb7ea87ecf --- /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 0000000000..8620ef5082 --- /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 0000000000..de709024d2 --- /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 0000000000..b36e176b29 --- /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 0000000000..d3f1f5b2cd --- /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 0000000000..646aa5fde8 --- /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 0000000000..8d990cfcc2 --- /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 0000000000..746b44763c --- /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 0000000000..7aaf05058a --- /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 0000000000..8bcf83d8c3 --- /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 0000000000..53c53fca03 --- /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 0000000000..9991aa0b50 --- /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 0000000000..de7bc64f9e --- /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 19a853dba9..db6e105584 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 0000000000..d9e1638a44 --- /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 0f1101eca7..607acd07cf 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 0000000000..ac76f94ff7 --- /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 0000000000..3f5bd81e83 --- /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 eefa1e8bb6..0690811d2c 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 76496da6dc..e28718a317 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 0000000000..75fd8d7d5d --- /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 3f37de5331..22b1436a40 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 b42b2ce56f..2491d701ab 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 c679061918..7e27a969b1 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 0000000000..96ffc87e9e --- /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 0000000000..b48601ced7 --- /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 0000000000..15e59d0543 --- /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 adc91477a2..c6c95c1f16 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 0000000000..9d853c4bd9 --- /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 0000000000..cdeba216a9 --- /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 0000000000..0778d0435f --- /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 0000000000..d9e1638a44 --- /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 3fba61a484..cbea232428 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 0000000000..ea492ee159 --- /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 0000000000..1cf5d2d9a5 --- /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 0000000000..3828c6435a --- /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 32f479b8b5..39d630bbaa 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 0000000000..a41b3d1ad4 --- /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 b923fdb210..8f80a81e64 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 a7f807e8dc..3035e88374 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 7668dfa5ac..b5b1f9df38 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 0000000000..261ac09a48 --- /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 905ad41309..9c1906baa2 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 0000000000..e773f3454b --- /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 930694de8c..8b65ed602d 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 0000000000..e027676dce --- /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 0000000000..e027676dce --- /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 0000000000..b1e3ec7b1b --- /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 8ca964606a..49b7d22ca5 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 0000000000..0b61989889 --- /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 bef4f1583b..472ca85382 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 ed5367e001..bb92b37fd5 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 0000000000..f97ed0d09d --- /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 0000000000..4f7a2ab5b9 --- /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 0000000000..0f13bad4a0 --- /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 0000000000..fbac402530 --- /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 0000000000..ed53fcf510 --- /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 0000000000..e5160fb873 --- /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 0000000000..71a7e0a920 --- /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 d8bda90de8..42612eaba9 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 1e3f7b573c..18080db554 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 c9b127fecf..70a2bf7e49 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 f3ffdb997e..10bdb14870 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 80b55da4b6..f5e4094839 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 3caf51812b..828d7feeb5 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 98a78e17d8..18e87d7c70 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 6d73cc6fc9..86b0db95c7 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 cc5343589a..8c8844797c 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 f5fe2bc17a..3859617fbb 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 998080b1ca..4778c51d52 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 a850db0f73..5dabd3a0d2 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 0000000000..97cf89463c --- /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 f7e1a9d223..f86c4268e0 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 0000000000..3f92fabd3d --- /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 0000000000..d7b359e0d6 --- /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 0000000000..80cddceda2 --- /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 0000000000..4bc9bb8858 --- /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 0000000000..11f8a8d2f0 --- /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 0000000000..5eddff89b5 --- /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 0000000000..607a7eaa8c --- /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 0000000000..e0c4c7043f --- /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 0000000000..1c75d04a71 --- /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 0000000000..ada0964a35 --- /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 0000000000..11ee35782b --- /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 0000000000..e517d9331a --- /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 0000000000..5f21851b67 --- /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 0000000000..c91e442617 --- /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 0000000000..576e66ba6b --- /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 0000000000..819c35ac3d --- /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 0000000000..2c46fb48c7 --- /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 0000000000..5aed0b8925 --- /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 0000000000..721dce2501 --- /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 0000000000..a8de004c3a --- /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 0000000000..5d798b7cd8 --- /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 0000000000..38c65ccd8f --- /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 0000000000..09ddfeaf5c --- /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 0000000000..3424269bfb --- /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 0000000000..f9982152d8 --- /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 0000000000..1f10e34d6f --- /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 0000000000..e0e6b2fb22 --- /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 0000000000..3da64e71c1 --- /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 0000000000..e0e6b2fb22 --- /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 0000000000..f6fdab9cc8 --- /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 0000000000..eb6f66e878 --- /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 0000000000..15f9774cb1 --- /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 0000000000..538cdd3cbd --- /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 0000000000..e9169fedf5 --- /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 0000000000..726f9d917a --- /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 0000000000..96c2bfe660 --- /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 0000000000..9d0ff4c10e --- /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 0000000000..ffe94d5646 --- /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 0000000000..1ff2347820 --- /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 0000000000..267fcb83a6 --- /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 0000000000..fb787ad6a0 --- /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 0000000000..8bd2f9f041 --- /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 0000000000..fc4734b2f3 --- /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 0000000000..4dcac2924a --- /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 0acac0df43..96a39ea4de 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 4eb4d59e64..d6f28c43cb 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 68178af768..fec4e44818 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 6fbabbc13b..775ef702b8 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 5d2a003e5e..594084c657 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 a2ae32f5aa..04d1a0d954 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 0000000000..061e511eb5 --- /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 054c446492..911520065f 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 96beb3141c..eef994a608 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 933ad3cf7d..7a467844c7 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 c85251a0e1..2ceb78b6bd 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 e58c699317..7d2ab21d81 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 601c83d31e..fb7a76de10 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 3b8cdff398..36b358192b 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 b760f25a47..37b1c15f89 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 f5c7efb4cd..236f682184 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 823b50fa86..ace432f6a3 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 414286efdb..7776c23dba 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 5790bc6d7a..7851f9d64b 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 3437a73f6a..f9191fe786 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 905653b701..d17637e7c2 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 854b7fb562..9eb459e53e 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 5565fb2111..3ee83236d7 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 e0066a271d..a1114965a4 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 e4f8bf0556..549fa40625 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 71204c8860..2fb298f781 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 0ee0c4b6ac..0775e47f69 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 a7692f2a68..1a8affa7c3 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 a9449ad999..f28bb62b10 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 959e174408..0901d927a2 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 ad1ae6935d..35169f7024 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 a6036e4798..da4d71058b 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 4c458f06bc..c6c2bc115f 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 67d91759e2..34fdb66c09 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 465d766898..e0f5f81e5a 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 9712f1f780..638557f103 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 976de89687..0b9dbbf06a 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 dc7350982e..3a77ce669e 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 4879d5ce9f..24cb45a5c4 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 9d5e030900..4d8fde97ea 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 618ec93820..02bbd32e41 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 e46a184ac4..1593319c8e 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 eac0ef7743..b961d12e5a 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 c8a1b1bd24..c06b4fabf9 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 4dd852403d..dae30a669b 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 6260a5bcb2..76890e749d 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 ec2763d01f..5eebeef155 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 f302a4fdb9..522b42dd50 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 1875957243..0108f532d6 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 3830c13165..1ff63331f5 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 fe588e0143..73d18f2291 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 938b86add1..0c4aee8cdb 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 c43e8079ec..8d8b837e98 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 800e9a1a18..6fa63e591a 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 e37995b0aa..737cc1d061 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 d711a2edfc..9da12e7aea 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 3793aa7640..62f4031660 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 079f6eddb6..6940f8ca33 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 4bf599b598..57837479d4 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 32df227007..bcced85e29 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 0dcee9de58..b9bb31d468 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 aa65b65dc8..a41438b332 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 bdc98c5e2c..c3d783a903 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 1b81905627..3e6829f659 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 ebec0df356..a4b601f789 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 e9f1b91968..afa7346747 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 8de052d911..f86289d5a0 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 b38d0fb8f8..bb1c89e1e3 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 8880159739..618a3a5fd0 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 0000000000..19106050c6 --- /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 6a34670b9d..d3130bd7e8 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 797bf3c55a..3486d42ae3 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 361e22534c..18b45f390b 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 f4d91ccc35..455b8a7967 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 1f04e41499..f93f2cc474 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 0000000000..de29ebd048 --- /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 8eecf7a087..b2ccada9e6 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 0000000000..80127b053d --- /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 dfc201734e..0424db3cdc 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 8ee618ee6e..288ae9de67 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 3beb6170ca..41470c2bd6 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 12b54c61ff..bc9be34a83 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 6a81b59c43..fa55b4ff92 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 d96ea151ce..bd391ed762 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 339c0bf6e6..49c7f40d4a 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 51de23bec3..c349c39573 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 4559384383..6fa2fd5fd1 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 87e3f72036..b67464cb97 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 b8a8c59f58..f947ce8793 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 0d591c0850..fd46e40d33 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 c442ad2387..0d4f83366d 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 3a40495a18..740b1684d6 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 6fdce954a9..0d6ace9da7 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 12b54c61ff..bc9be34a83 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 38578dafc8..f2ba208591 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 40839e8f4c..33b963e981 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 ce12d35086..f86d5d5b2a 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 12b54c61ff..27c9fd6fbb 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 b22057ca71..5797fb63bd 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 3f35a24605..9bbf88cae1 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 6ab2cf93a9..c60162e6e3 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 81f264ce16..22ff788e9b 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 d8ff1e9776..08a4779e59 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 68c2b1d11a..19faba8464 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 52d5b776d5..2fa9369055 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 2159542b80..e836d84aea 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 6cf78485ad..b4488c854f 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 99bfc2f0ef..1e6b286def 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 294ffd96be..b0b65a10c8 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 0fea457b5b..faf64359f0 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 ce56480f01..54e46e8d31 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 07199c7cff..4d4282dc4c 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 156fdcc6c4..a4d1da866e 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 61295f3d90..fd238b09bd 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 f9ae3236a1..41a05ac1c6 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 85527af7d6..5b1ad10c74 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 b7ad0024d6..2a7afb3826 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 e1d7aa0839..a2979379e1 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 c6cdc90aa4..016f3bbbeb 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 8a67cb2db0..ce32171eba 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 f1f50d8473..7d044949a6 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 adb7da378d..c469020aef 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 74abca0ce0..c9732c24fe 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 ee5e2de904..cee54ccca7 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 f7270ed944..e4c328c302 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 bf6bcb094e..6f68e6a6a7 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 7b38a1ca34..181631047e 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 b66cfb8d44..f1ee9b9238 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 6387813915..9ab753bab3 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 151f7e8fd2..1c66cca87b 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 4f8c260885..ebafa93b07 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 6d704b37d8..f173157981 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 38a496e40d..bb242ca60f 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 158524d932..8be065fe79 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 d10183877a..0671b162e1 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 6a1d26cb75..4fe9b2a7c9 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 f551eff524..a7fe2522c7 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 0acf3a310a..c86016fa0b 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 951a8419dd..1d0453704d 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 e60a9efa5e..2d02081f6b 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 ebbe5da487..aed5dd1032 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 caa4291b88..379a554e0c 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 0ba666cee1..b1c853f5f2 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 f4ea781799..e4cf0e9787 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 bc5444e7b0..9641c63dfa 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 90902691e1..03077907aa 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 7b3e1fc2de..47714ea31b 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 4959b35d89..69d7f7ba3c 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 f98e4d2ea6..85c9d4251e 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 cac431bd45..adbb0e148f 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 6a04b7a166..d817129e11 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 ba0b48429e..837766ba6e 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 4b9712967c..469c9ba6ff 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 716e4ad239..4d2b3d6acd 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 9f9a3e4230..702fda2dcd 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 b6b4423f62..9626b5bd86 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 f63c0a3ee5..3e5c87b796 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 b20145b7c4..7c19cf4bc0 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 fa1582daa7..b82e80a342 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 a32c2e539d..e1301cd2df 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 5268514252..3f6fba583c 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 413fe69560..33bd4d3bff 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 0805a5a7ff..20b4f8e55a 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 1e927c081b..92921d3451 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 b0445528e4..17868c1e39 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 da77960f28..90ae364c97 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 da20997d73..84023ea7c9 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 b05e458f5c..b8b30ab415 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 2ef1a75001..bff7e40f8c 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 caadb8b4da..4c5e1ffeee 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 2d60ef39d8..23dfbb372e 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 e01a5a40ff..8a1bf40394 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 a747845c18..bc48832db9 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 c615663128..ed333bb9b5 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 7402843f7a..d336c5ec10 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 6f45ff67fe..bbdd8f92d7 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 6fb69db042..a429a565be 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 1a9c683614..1f3359ca18 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 186f6f687d..8af5df35f1 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 c376709b62..32177d590f 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 c615663128..ed333bb9b5 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 e9e341c8b0..84fe87eda0 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 0025a9a995..bfa38f9ef8 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 15590dabc3..127f0241a3 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 6d975fc203..4f470da838 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 3ccf19e22f..00c8a01e3b 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 edbd77699f..f3a60a56c9 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 46685b2b74..7ee372b14d 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 5cc940b6d9..0bf90ce427 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 e945154a92..591124fda2 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 da50d02bf8..073aab126c 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 4c3e69c3d8..0e89342bb0 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 5c69717cdf..0786045675 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 cfc522ba8e..32df9de104 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 81721c85bd..f277238310 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 2538787891..943a91fa7e 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 869520ee95..2144fdd1d4 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 26e66e7d58..92e797917e 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 80b740b62d..b50d82bfeb 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 b42fcbf4e2..63859a000d 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 c1329c0aee..8f74140905 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 b0b021be45..0af84ebb17 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 3da622c7f5..98b2575d69 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 7191eba4a5..8d2f02ade2 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 f715e1d571..0b377b5ab2 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 8327206773..27f0f3d488 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 34fdd4145d..cdb9377cd9 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 9da6470144..a0ce124c69 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 b3863083cf..47c7bc15be 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 35ccf1ecfb..0f769fecb5 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 c5ffa00dd5..8cb926fe25 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 527b1a7a37..f99f5ed67e 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 786bd871ff..6d8b395f2b 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 0d7da884ab..c28ca26919 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 8f2f33868e..a15d25a283 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 db7cf1b6ab..0683f3da59 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 4b83deb174..289e0a6dac 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 515e5fbe96..ac50051b6c 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 87b64e7809..9776f893e1 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 71930db04f..007f06b1c8 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 6a5f30913a..49bab5225d 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 d959589644..87ebe6dbf9 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 730f11189f..020a5807f3 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 b82c0036c7..f6e9a6c2c4 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 7e03a1314a..e55ae8fd49 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 5085372747..c0913a097d 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 b02484e182..bc7466a32d 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 d60b4b5275..6372ed941d 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 6044aa4fa6..3c1bfdbd8b 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 8b1c55af08..090aeab1a7 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 2850f91efb..de3bc97e2a 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 6606175b9d..ec5a186942 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 c1ea81e01d..a41503b5ea 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 8685585996..402d8277bc 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 df4ecc4a05..c8d48dc506 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 0000000000..bf9cb9c98f --- /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 0000000000..9aecb4b83d --- /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 0000000000..ce1bddc104 --- /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 0000000000..43859eedc5 --- /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 0000000000..419215d32b --- /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 0000000000..9d25158400 --- /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 0000000000..b3ef0dcb85 --- /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 0000000000..bc9b108c3e --- /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 0000000000..43859eedc5 --- /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 0000000000..b3ae655e02 --- /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 0000000000..43859eedc5 --- /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 0000000000..a822ffbd0a --- /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 0000000000..a822ffbd0a --- /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 0000000000..8d36316f01 --- /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 0000000000..cec08736ba --- /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 0000000000..d32b1e212c --- /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 0000000000..48f9aa81b7 --- /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 0000000000..228912f95a --- /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 0000000000..43859eedc5 --- /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 0000000000..de8c2468f9 --- /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 0000000000..21d0438f9c --- /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 0000000000..52b2c97255 --- /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 0000000000..78c67fb895 --- /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 0000000000..1ab6aa5894 --- /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 0000000000..e0f7536fd1 --- /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 0000000000..539f0bb429 --- /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 0000000000..2a34917b90 --- /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 0000000000..14137569e1 --- /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 0000000000..375f8fa7bc --- /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 0000000000..15d29e35a0 --- /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 0000000000..e98d60ab4f --- /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 0000000000..43859eedc5 --- /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 0000000000..7eb98bdd2c --- /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 0000000000..21a3703bba --- /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 0000000000..7d07ec8da0 --- /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 0000000000..7d07ec8da0 --- /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 0000000000..43859eedc5 --- /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 0000000000..a2ee79efd1 --- /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 0000000000..9d25158400 --- /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 0000000000..ac2a2cab3f --- /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 0000000000..78ef7d2df2 --- /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 0000000000..74f9398fbc --- /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 0000000000..43859eedc5 --- /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 0000000000..d825a885d6 --- /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 0000000000..7034ef0d79 --- /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 0000000000..e98d67fc20 --- /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 0000000000..0e2783d6f2 --- /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 0000000000..154ab2b812 --- /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 0000000000..31188faa13 --- /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 66847b1a6c..d99458ca4e 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 7d75b14814..f58069ea90 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 8f5a1a2cfc..745b136bd5 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 334641b305..7f75272b24 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 c195c8a7c7..6dc104d71d 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 a913ee054c..a23a0fc746 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 e8098013fb..00d4322172 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 eb8695eb8e..cf07aac4bd 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 91834ec81b..bfbd213729 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 da06ae0793..8b46143bed 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 a4caa11a0e..e44afa53a6 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 99c9cd2366..06c40aa95a 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 4ce12cfbe3..4cf59263fe 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 4304a5e795..3e9ef97585 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 522a42ec17..f86eb49e0c 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 ed6238dd83..b947ce87ff 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 9b45ea7965..3004ab40ee 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 084ecfa137..a4370672a9 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 443bb93390..25804bab98 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 f05f025ff8..1dbbc34ab0 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 406d1e964f..7c8401569f 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 358f589dd4..2e8a3ac3b4 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 38fd6134ba..2ff0acc208 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 c5232db59d..67584ed2f3 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 3a0942e915..2c367a3e88 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 490b0c218d..74911d92d0 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 0000000000..7a312d1dcf --- /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 0000000000..885c520860 --- /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 1ab7fce7ab..7c72d55540 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 b3cdbb2f6c..5157fecbbe 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 0000000000..d9d58baff0 --- /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 fac748ca46..4213f53262 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 3fe2d57eb0..62238436eb 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 0000000000..02ad200a96 --- /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 3feb8eada7..0c47bbbe66 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 0000000000..0b4a5a74c1 --- /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 376058faaf..c7e657e690 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 0000000000..2bdf5b9033 --- /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 0000000000..fb018340d9 --- /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 0000000000..1d91c657c5 --- /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 0000000000..513ba245c5 --- /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 84d5e17bda..6df6eed17d 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 0000000000..9465fe5594 --- /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 0000000000..a14c77f686 --- /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 0000000000..7a312d1dcf --- /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 81a39802c5..eecd3a2ba3 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 0000000000..277929cc2e --- /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 0000000000..ba14508ad0 --- /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 0000000000..1fc83dd075 --- /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 32ecd1e037..b589d8f5d4 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 0197329abd..5f9d6ca462 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 d6776ccd61..478f97f2b6 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 0000000000..f4fee01aef --- /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 0000000000..e1edf6878f --- /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 8ef0588796..cee2c501b7 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 0000000000..0fb34a8633 --- /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 09eef23ac9..287b95e51e 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 0000000000..38a0b869b3 --- /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 15b8ac3fd1..83a9328e4a 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 0000000000..22b48f1e37 --- /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 c42f0310fa..08067272d7 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 0000000000..554fc68624 --- /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 c594c4f1bd..4b0806b531 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 38b7f72ab9..cf1356a362 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 0000000000..4ecaec4748 --- /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 0000000000..2cbb7ebf35 --- /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 0000000000..63eb940dec --- /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 0000000000..846b3b7f1d --- /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 b676cc7be9..f9ef4339e0 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 b108a2a6a4..5b51028772 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 283a24ea22..b22803cfb2 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 3a9be7d213..4738e236ff 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 6d70f7c3d6..6bb58f5871 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 48f23aa0cf..8b0a2ab6c9 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 b28088efa6..ab45544289 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 197bff064b..1bde7176ea 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 197bff064b..1bde7176ea 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 95987d48a3..ab2e8d756e 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 d1b74e9ec2..bf24ff1133 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 06ca9a058e..0d8e003472 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 b902843ae4..5bb18bc5fa 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 03d9798275..81991bfff0 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 99a3706cf1..0cc2f47582 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 a412d583fa..c3f06b312f 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 ab07c0f618..e88f6209ee 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 2e1cf68cf2..311919186e 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 528c614327..e7a56c52cd 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 5916b339dd..48f9ef5919 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 9749a468b0..ff972c7053 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 c10e24321e..16230142fb 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 898c533f1e..18b8c64f52 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 347fb5ce56..8acd0d0f61 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 56d69efe36..875e32fbb0 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 4ebd3f804a..6572570916 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 c3c769ef7b..c78ab909b9 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 0000000000..dbc6bca136 --- /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 6dece462ef..99095dffdf 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 0000000000..01e5234bc7 --- /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 521b3fb9eb..0d4b067c5a 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 95cc2f4406..612b2028b3 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 96f991c056..6dbf41d9ef 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 69f8b74529..2fe09c5186 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 3573094481..3db70384d8 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 664721c2fd..c109a81aa2 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 2ed046a815..7c6f344104 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 a11d7b0a12..9eac2f6155 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 4382525752..6db0922e68 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 1d59a36e6a..42e5b1bb1e 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 2d6cbb5202..20672e018f 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 7fb25b5885..a3793c66f8 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 c47e27f22c..3624fd2b3f 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 f97fee03c5..75cfb04b9d 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 62c2807480..aa5d4dc587 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 47fb6fc504..4b18d353aa 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 02307dd7e5..f766224af1 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 64f413a78b..3845e194bf 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 72b340ec88..cd7cc7ea91 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 522a2db1a9..5b8c12bab6 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 2ff2ad7f97..0ef9c619c9 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 b36990d9a5..d4b68d04c9 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 1941c399b7..49a9441440 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 f555647e8a..97f4b8d417 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 3c6643bf0e..272711789d 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 d7d9b1695d..0368349f75 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 2ea2434ac8..2f39499260 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 c5b66f8739..f0b96eb77b 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 a02cd1362a..88964aedc9 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 c7c30ca0fd..1901be6fd1 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 840098abd6..36c6e79989 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 6868f1f790..4cff9fb6fe 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 1863076baf..372c975041 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 84ccb05ece..c815698099 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 5e2b3a1f6e..7192f91ee1 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 7ad772ae89..f3fec441d4 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 bdc14bb4f9..665474e2d7 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 fc103b7342..d2f3ed3dd7 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 83e5c363f4..6de25c240d 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 97cddfb44b..b5e8a5acc6 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 7e8ab70570..d160356cb0 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 44c732e494..f6cf42ebe9 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 81e38391a1..043a33734d 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 e47abb0d57..37ef8b3740 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 5b19b4ed66..3bfc872f0e 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 48c91c86a1..16ad188429 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 6301e8f186..3cd7c1526e 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 c16c99a455..e1789347bf 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 0f79faa0e1..16a8c6c392 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 ebd99d0882..392ae0f47f 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 5dcf65435a..62b75b4714 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 bf38cdb24e..e64c3b6cc8 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 a435fc1fc6..5c5a25dd12 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 ed40c4105d..db2f4ca944 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 0c853a79a3..19f2121f42 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 f27fc576dc..36ce615379 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 72b322178c..d2192d85f4 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 b9c4d698da..a0d4465796 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 fa785558c6..ef86613ea7 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 196d1833ba..3010cfed63 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 5f4664dae9..c8c45bb108 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 444d4b93c1..47b7d0e6b7 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 0974a312f9..a14a47a459 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 ece4f091b0..52f4ba34e3 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 cc2cce56d0..8602a1adcb 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 86e0418be3..dc40fd0d66 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 e9bdca8ffe..afce1415ba 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 9e6edf3b8a..1aecf403a4 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 18161cb7d9..c1c7d9746d 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 0a6c90a15b..a4fb8960af 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 d220fa7fb6..5f5c438058 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 ccd298e262..8f754b309b 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 f39ee5e11e..8476f17077 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 a7680b6771..b3845e0df5 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 4994ffddbb..de34abbeed 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 7c72068b93..3b2ee2eff9 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 57ae3d10fc..bee4c6b975 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 c214bd3215..d217640e44 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 668927f280..734a23bc5e 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 3fe3b06bf9..4fc2dec0ac 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 b2ec33e67c..19376d363c 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 d201fe70ab..d9941443f1 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 177662c6f1..ed0cc9cdc1 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 edc03010a5..f1d4541698 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 5e4287caa6..f15cfc1a2d 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 ed2c1a7d82..38bd29b96e 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 286550aafb..0fe8153cbe 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 0ec8d9d854..0922f1b334 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 1b3c2a17d8..a45141ff50 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 ddbf61d9e3..f99071a261 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 8c204171e5..0b1ef34bf7 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 02f627e07b..c5b6b0fdda 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 b4eca4629b..ac644d2641 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 52a707a050..8e091a7eac 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 6e5a8c9293..a9107341e3 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 305684b3f1..ac47147207 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 bd6feaf101..739a9befa8 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 421ade3592..697fa1acf5 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 6e5a8c9293..a9107341e3 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 74d981fa2e..7c63779d5a 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 c1bfc9596b..b597363837 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 a39efca5fa..ded950bdf6 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 d179d63414..45f939cb85 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 97cf128fc3..60a896c34d 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 6e5a8c9293..a9107341e3 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 cb70263e07..b811023e88 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 acd10f5794..13cfb7bc91 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6258ab61cf..5b78cbd791 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 e3edb991fb..a9107341e3 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 252b87e1e1..34c645e980 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 94c4f91abe..8e4d8cec49 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 6e5a8c9293..a9107341e3 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 996f5823a5..356c842839 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 6e5a8c9293..a9107341e3 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 4fc85c4010..21b5282eb6 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 6e5a8c9293..a9107341e3 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 3eaf52e8a8..e0f4b187e5 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 4b2af95ccc..a348c0d557 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 6e5a8c9293..a9107341e3 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 311a6fc2c6..1b3b3f9fb2 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 b7effeac9a..cd39935f17 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 28772b25c4..b6e915aa35 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 7127066c12..f9c36f4e72 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 6370a98d6f..b87d9af14f 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 f16a8cc405..2f59ea2d38 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 c62cccaf49..936c64c2a7 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 6b753642e8..1732a5b43b 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 ebee314c56..16b3b461ad 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 06439ef5cf..d4fad7f016 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 6d4d31e013..43af25b904 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 0e4ef86407..4193ccab89 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 db7dd9852c..5ddf4f0518 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 6fab542137..dcdc2becf0 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 af00e027a8..442420b1c5 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 00704aad52..4ce9b99b73 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 5ba66970d3..04071c31cb 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 f948b11007..9119d281dd 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 ad4b78ae56..007704bf40 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 a001deee54..55712fd859 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 ad738c2131..22a91d7dfc 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 3e13c944a3..5346a777cd 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 47180cf070..7b4bfaa1c0 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 634e1f3b6d..ec7bad9997 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 2b4edb07c2..7102410aed 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 60f9c60e8b..43477e1189 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 d61ab9ce43..c5ef6071dd 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 803d058e0c..d8db817507 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 eb02c27d74..81803aa8cf 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 32aa48328b..19767b7662 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 3e22c7cba5..d3ca58546f 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 df10e978d7..0f1d398592 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 70ab49a801..05d429701f 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 2ea67ece4a..ecd936975b 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 b447c2e44b..3c84a7e6d5 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 64a6d760d4..c82271a9ff 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 d5a8a89ff6..2e607435b7 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 096164e729..c36bd66304 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 fc5b04e103..164d1b1a73 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 02db7d6082..60d9f681be 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 4883c76432..42221f7ae8 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 54ed72d674..acf619e79b 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 2d6c9c687d..bfaf0757ea 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 e9887441c0..84ae9155b3 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 22a0152b73..72756d78a6 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 6f04234540..6171f68a08 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 77ec3bc45d..6b9691723a 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 cb6c71f06e..dde9a2e9ae 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 90aad3286b..4e9044f24c 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 52ba1fe06f..bf7641d6bf 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 c245e010de..df745a1ab2 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 bb35af6337..8afa9b632f 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 5e44c2612d..474c194c06 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 bef69802ba..e9f3dbc988 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 7f4ba7ac89..a16deae968 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 e067002ca8..a4d0986bdd 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 2e73c109e5..22720fa8d7 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 93d8e43553..c453d6ea60 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 0747ed4514..4a9463ff00 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 db03b4af23..12781109ed 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 98d65a2d24..ebd9d44796 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 bc890e9715..bbb03d853b 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 de31220ac5..9f2252f4f8 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 b069a5f0f8..3a467eee12 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 4b82173125..1e8aa31b62 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 79f6b98625..cf7d63007f 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 50b4e4bc70..96b69da67e 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 cb718668da..6b7545c183 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 9296127a38..251823db3d 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 9299689412..ab9995610d 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 c7ef7f6587..29719129e8 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 57e23bee9d..805000b2e9 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 ae50e14d40..56ab439aee 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 7cb0ffc5f8..c1e7d6b6f2 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 bdf3bbbbe5..070aafd42d 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 26a5c0095e..2fe375fb1d 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 d7298b2abe..c0350353b4 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 81d77b27a3..5979caa37d 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 32474881a8..7d1c3d1b1b 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 7caf60b7ed..a5345f4145 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 fd278d3df2..5c29be09d9 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 1c52c55702..a8c7932449 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 5229881fbf..fb75ba9cae 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 e250da7627..c80074459e 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 8187765474..0c90c29f4c 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 498a960583..c912e9f7f0 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 7678712db5..1f6abf1056 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 51f00ad98b..eac6df85f4 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 b5b1053475..3cb22a2254 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 14e6e6b406..d888b30a3b 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 b98522feb4..99563ca65d 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 6458553894..0c6887288b 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 864d131d28..3f4944fafa 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 c5aa74706a..3f2eaf698b 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 a58bcd6fa7..0a5ba84cdb 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 2e82ecb4f6..2777d21cac 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 0547e35f06..a0b7d865a1 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 7cd4accf59..ce58b1780c 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 92351e4010..789c23f21d 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 ad334f848b..d78947f313 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 cfb4637a6c..84085f8711 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 91531a9ee3..3c80147423 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 cc777b8ad7..5ea7647273 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 ad160a1ba8..cb5d1f4499 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 6b826d8c29..34e0231d75 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 7947ba5cce..d10dad43d7 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 33ca626555..634952dcfd 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 5c6fbf7173..946e40b7e2 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 3c5c70b2bd..baaf3d44eb 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 c96e6e549c..419e4df755 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 21cd6aaa97..27b6445a4c 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 02e3fd7fce..2f701a2e14 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 78cb21bc88..5bdf9a07f0 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 b6bab17496..8eb993ab6f 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 eac6df85f4..379f6c48ac 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 e3d09977c1..43605de67a 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 3cb22a2254..0c057ba1a7 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 d9a79d6555..7fb96fdf7c 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 17caa1f747..897367619e 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 9e1bf043f5..31b26bbd51 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 5d52f13f39..d2a1410166 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 ce58b1780c..3cf11736cf 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 789c23f21d..8f07c7bf6a 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 c80074459e..553dc5bac8 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 ab52f2b23a..b617022532 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 3cf11736cf..ccf443d086 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 be94f8dd27..a8c3022063 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 00fd30b527..aec1fd34b1 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 a03bc3ebd0..e90a08f69f 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 f55e793ad9..1287e82885 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 289e0a6dac..618c393b7a 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 e9f534360d..e3225a2d21 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 781fcdeae8..78389c6a2d 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 4acf75fbdd..803a892647 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 3f4944fafa..f2fd576047 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 3f2eaf698b..5e50a75409 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 2777d21cac..0eff1eeea3 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 40f4e1f500..f436a86c6b 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 644b0856bb..a30dc21854 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 3366ec1641..09b16440f9 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 84085f8711..c204c75a12 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 4479e269e8..67a3bb0a49 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 4d55ff328b..118c3bf7f8 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 ad0330b56a..34a396758c 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 9989b9d530..5f80813d10 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 e5fbcf4d42..5cfd9c3696 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 2cdc8fe027..a9155c7b62 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 be3bc4c52c..8c475a114e 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 e4ec6a004f..97a5d00a30 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 ccf443d086..f25a7b2550 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 8f07c7bf6a..aa49dc935e 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 d9cd62313b..814e59e557 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 31eb43fc61..5fe796bae2 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 8e6004d362..d8734ab731 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 92650715e5..ea2b3c3252 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 89a3065bce..700240bf62 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 d8734ab731..0000000000 --- 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 5ec14e9ab6..e491637ea6 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 663d5dd89e..a52927ed49 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 ab50e6dcc4..c3600da405 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 2a67cf5348..788e6d4981 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 9a595ab7a9..122f00f7b5 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 d99be94aaf..c26e42a22d 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 a58330ad22..f09d4d1a4d 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 f25a7b2550..5ca56644ce 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 aa49dc935e..39ce112765 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 805000b2e9..7d8d127e64 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 3d9126610a..ddb753ef1c 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 ad415481e8..2cc7dfff68 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 a588f68ea4..d3d81a6a7a 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 ecb0241c72..9637b0fb37 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 a6b4113e31..052228e7aa 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 ec100733a5..3d21fbae96 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 5ca56644ce..4fb558c1c8 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 39ce112765..c4717c45c6 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 3171b8e953..241cf44324 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 fa33b0315c..dc6197c8c8 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 4fb558c1c8..1d047db6c7 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 c4717c45c6..7af6798563 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 2553dbea74..c8c5fc4d49 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 3500a3a4e3..363d33b14e 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 ea20d8c921..11663672bb 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 7a3e1e8d52..738b49f4c5 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 76c2cb9889..4c30457b62 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 7a352b4e8d..77c436d212 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 b6c59604b7..06bbf10a8e 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 "