diff --git a/homeassistant/components/asuswrt.py b/homeassistant/components/asuswrt.py index 719e857c751..959d39038e2 100644 --- a/homeassistant/components/asuswrt.py +++ b/homeassistant/components/asuswrt.py @@ -14,7 +14,7 @@ from homeassistant.const import ( from homeassistant.helpers import config_validation as cv from homeassistant.helpers.discovery import async_load_platform -REQUIREMENTS = ['aioasuswrt==1.1.13'] +REQUIREMENTS = ['aioasuswrt==1.1.15'] _LOGGER = logging.getLogger(__name__) diff --git a/homeassistant/components/binary_sensor/xiaomi_aqara.py b/homeassistant/components/binary_sensor/xiaomi_aqara.py index 550bdaac172..becbfe38163 100644 --- a/homeassistant/components/binary_sensor/xiaomi_aqara.py +++ b/homeassistant/components/binary_sensor/xiaomi_aqara.py @@ -423,9 +423,7 @@ class XiaomiButton(XiaomiBinarySensor): }) self._last_action = click_type - if value in ['long_click_press', 'long_click_release']: - return True - return False + return True class XiaomiCube(XiaomiBinarySensor): diff --git a/homeassistant/components/config/entity_registry.py b/homeassistant/components/config/entity_registry.py index 1ede76d0fd8..71833a2e42d 100644 --- a/homeassistant/components/config/entity_registry.py +++ b/homeassistant/components/config/entity_registry.py @@ -88,7 +88,7 @@ async def websocket_get_entity(hass, connection, msg): @async_response async def websocket_update_entity(hass, connection, msg): - """Handle get camera thumbnail websocket command. + """Handle update entity websocket command. Async friendly. """ @@ -106,6 +106,10 @@ async def websocket_update_entity(hass, connection, msg): if 'new_entity_id' in msg: changes['new_entity_id'] = msg['new_entity_id'] + if hass.states.get(msg['new_entity_id']) is not None: + connection.send_message(websocket_api.error_message( + msg['id'], 'invalid_info', 'Entity is already registered')) + return try: if changes: diff --git a/homeassistant/components/light/lutron.py b/homeassistant/components/light/lutron.py index ee08e532ce7..359ef0114c5 100644 --- a/homeassistant/components/light/lutron.py +++ b/homeassistant/components/light/lutron.py @@ -42,7 +42,7 @@ class LutronLight(LutronDevice, Light): def __init__(self, area_name, lutron_device, controller): """Initialize the light.""" self._prev_brightness = None - super().__init__(self, area_name, lutron_device, controller) + super().__init__(area_name, lutron_device, controller) @property def supported_features(self): @@ -75,8 +75,7 @@ class LutronLight(LutronDevice, Light): @property def device_state_attributes(self): """Return the state attributes.""" - attr = {} - attr['lutron_integration_id'] = self._lutron_device.id + attr = {'lutron_integration_id': self._lutron_device.id} return attr @property diff --git a/homeassistant/components/logbook.py b/homeassistant/components/logbook.py index 79ee728ddd7..0c6608e3572 100644 --- a/homeassistant/components/logbook.py +++ b/homeassistant/components/logbook.py @@ -469,6 +469,14 @@ def _exclude_events(events, entities_filter): domain = event.data.get(ATTR_DOMAIN) entity_id = event.data.get(ATTR_ENTITY_ID) + elif event.event_type == EVENT_AUTOMATION_TRIGGERED: + domain = 'automation' + entity_id = event.data.get(ATTR_ENTITY_ID) + + elif event.event_type == EVENT_SCRIPT_STARTED: + domain = 'script' + entity_id = event.data.get(ATTR_ENTITY_ID) + elif event.event_type == EVENT_ALEXA_SMART_HOME: domain = 'alexa' diff --git a/homeassistant/components/owntracks/__init__.py b/homeassistant/components/owntracks/__init__.py index 5e6a99741e8..d0ba27aeddd 100644 --- a/homeassistant/components/owntracks/__init__.py +++ b/homeassistant/components/owntracks/__init__.py @@ -18,7 +18,7 @@ from .config_flow import CONF_SECRET DOMAIN = "owntracks" REQUIREMENTS = ['libnacl==1.6.1'] -DEPENDENCIES = ['device_tracker', 'webhook'] +DEPENDENCIES = ['webhook'] CONF_MAX_GPS_ACCURACY = 'max_gps_accuracy' CONF_WAYPOINT_IMPORT = 'waypoints' diff --git a/homeassistant/components/tts/amazon_polly.py b/homeassistant/components/tts/amazon_polly.py index e3f5b7407cd..1dfb741bb42 100644 --- a/homeassistant/components/tts/amazon_polly.py +++ b/homeassistant/components/tts/amazon_polly.py @@ -5,6 +5,7 @@ For more details about this component, please refer to the documentation at https://home-assistant.io/components/tts.amazon_polly/ """ import logging + import voluptuous as vol from homeassistant.components.tts import Provider, PLATFORM_SCHEMA @@ -56,7 +57,7 @@ SUPPORTED_VOICES = [ 'Cristiano', 'Ines', # Portuguese, European 'Carmen', # Romanian 'Maxim', 'Tatyana', # Russian - 'Enrique', 'Conchita', 'Lucia' # Spanish European + 'Enrique', 'Conchita', 'Lucia', # Spanish European 'Mia', # Spanish Mexican 'Miguel', 'Penelope', # Spanish US 'Astrid', # Swedish diff --git a/homeassistant/components/zha/entities/entity.py b/homeassistant/components/zha/entities/entity.py index da8f615a665..25b98255048 100644 --- a/homeassistant/components/zha/entities/entity.py +++ b/homeassistant/components/zha/entities/entity.py @@ -100,6 +100,6 @@ class ZhaEntity(entity.Entity): 'identifiers': {(DOMAIN, ieee)}, 'manufacturer': self._endpoint.manufacturer, 'model': self._endpoint.model, - 'name': self._device_state_attributes['friendly_name'], + 'name': self._device_state_attributes.get('friendly_name', ieee), 'via_hub': (DOMAIN, self.hass.data[DATA_ZHA][DATA_ZHA_BRIDGE_ID]), } diff --git a/homeassistant/const.py b/homeassistant/const.py index 21494691a46..133df0fdf88 100644 --- a/homeassistant/const.py +++ b/homeassistant/const.py @@ -2,7 +2,7 @@ """Constants used by Home Assistant components.""" MAJOR_VERSION = 0 MINOR_VERSION = 84 -PATCH_VERSION = '1' +PATCH_VERSION = '2' __short_version__ = '{}.{}'.format(MAJOR_VERSION, MINOR_VERSION) __version__ = '{}.{}'.format(__short_version__, PATCH_VERSION) REQUIRED_PYTHON_VER = (3, 5, 3) diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index ece0fbd071a..9c76d244138 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -297,7 +297,8 @@ class EntityPlatform: self.domain, self.platform_name, entity.unique_id, suggested_object_id=suggested_object_id, config_entry_id=config_entry_id, - device_id=device_id) + device_id=device_id, + known_object_ids=self.entities.keys()) if entry.disabled: self.logger.info( diff --git a/homeassistant/helpers/entity_registry.py b/homeassistant/helpers/entity_registry.py index 57c8bcf0af8..8216681496b 100644 --- a/homeassistant/helpers/entity_registry.py +++ b/homeassistant/helpers/entity_registry.py @@ -117,7 +117,7 @@ class EntityRegistry: @callback def async_get_or_create(self, domain, platform, unique_id, *, suggested_object_id=None, config_entry_id=None, - device_id=None): + device_id=None, known_object_ids=None): """Get entity. Create if it doesn't exist.""" entity_id = self.async_get_entity_id(domain, platform, unique_id) if entity_id: @@ -126,7 +126,8 @@ class EntityRegistry: device_id=device_id) entity_id = self.async_generate_entity_id( - domain, suggested_object_id or '{}_{}'.format(platform, unique_id)) + domain, suggested_object_id or '{}_{}'.format(platform, unique_id), + known_object_ids) entity = RegistryEntry( entity_id=entity_id, diff --git a/requirements_all.txt b/requirements_all.txt index ee749157a7a..d1c3f266e01 100644 --- a/requirements_all.txt +++ b/requirements_all.txt @@ -87,7 +87,7 @@ abodepy==0.14.0 afsapi==0.0.4 # homeassistant.components.asuswrt -aioasuswrt==1.1.13 +aioasuswrt==1.1.15 # homeassistant.components.device_tracker.automatic aioautomatic==0.6.5 diff --git a/tests/components/device_tracker/test_owntracks.py b/tests/components/device_tracker/test_owntracks.py index 6f457f30ed0..68c1f1e8766 100644 --- a/tests/components/device_tracker/test_owntracks.py +++ b/tests/components/device_tracker/test_owntracks.py @@ -277,6 +277,8 @@ def setup_comp(hass): """Initialize components.""" mock_component(hass, 'group') mock_component(hass, 'zone') + hass.loop.run_until_complete(async_setup_component( + hass, 'device_tracker', {})) hass.loop.run_until_complete(async_mock_mqtt_component(hass)) hass.states.async_set( diff --git a/tests/components/test_logbook.py b/tests/components/test_logbook.py index 321a16ae64e..c8ade907dd3 100644 --- a/tests/components/test_logbook.py +++ b/tests/components/test_logbook.py @@ -265,22 +265,50 @@ class TestComponentLogbook(unittest.TestCase): def test_exclude_automation_events(self): """Test if automation entries can be excluded by entity_id.""" name = 'My Automation Rule' - message = 'has been triggered' domain = 'automation' entity_id = 'automation.my_automation_rule' entity_id2 = 'automation.my_automation_rule_2' entity_id2 = 'sensor.blu' - eventA = ha.Event(logbook.EVENT_LOGBOOK_ENTRY, { + eventA = ha.Event(logbook.EVENT_AUTOMATION_TRIGGERED, { logbook.ATTR_NAME: name, - logbook.ATTR_MESSAGE: message, - logbook.ATTR_DOMAIN: domain, logbook.ATTR_ENTITY_ID: entity_id, }) - eventB = ha.Event(logbook.EVENT_LOGBOOK_ENTRY, { + eventB = ha.Event(logbook.EVENT_AUTOMATION_TRIGGERED, { + logbook.ATTR_NAME: name, + logbook.ATTR_ENTITY_ID: entity_id2, + }) + + config = logbook.CONFIG_SCHEMA({ + ha.DOMAIN: {}, + logbook.DOMAIN: {logbook.CONF_EXCLUDE: { + logbook.CONF_ENTITIES: [entity_id, ]}}}) + events = logbook._exclude_events( + (ha.Event(EVENT_HOMEASSISTANT_STOP), eventA, eventB), + logbook._generate_filter_from_config(config[logbook.DOMAIN])) + entries = list(logbook.humanify(self.hass, events)) + + assert 2 == len(entries) + self.assert_entry( + entries[0], name='Home Assistant', message='stopped', + domain=ha.DOMAIN) + self.assert_entry( + entries[1], name=name, domain=domain, entity_id=entity_id2) + + def test_exclude_script_events(self): + """Test if script start can be excluded by entity_id.""" + name = 'My Script Rule' + domain = 'script' + entity_id = 'script.my_script' + entity_id2 = 'script.my_script_2' + entity_id2 = 'sensor.blu' + + eventA = ha.Event(logbook.EVENT_SCRIPT_STARTED, { + logbook.ATTR_NAME: name, + logbook.ATTR_ENTITY_ID: entity_id, + }) + eventB = ha.Event(logbook.EVENT_SCRIPT_STARTED, { logbook.ATTR_NAME: name, - logbook.ATTR_MESSAGE: message, - logbook.ATTR_DOMAIN: domain, logbook.ATTR_ENTITY_ID: entity_id2, })