diff --git a/homeassistant/components/mikrotik/device_tracker.py b/homeassistant/components/mikrotik/device_tracker.py index e7c5e5655a0..01075a5f2d8 100644 --- a/homeassistant/components/mikrotik/device_tracker.py +++ b/homeassistant/components/mikrotik/device_tracker.py @@ -12,7 +12,7 @@ from homeassistant.helpers.device_registry import CONNECTION_NETWORK_MAC from homeassistant.helpers.dispatcher import async_dispatcher_connect import homeassistant.util.dt as dt_util -from .const import ATTR_MANUFACTURER, DOMAIN +from .const import DOMAIN _LOGGER = logging.getLogger(__name__) @@ -115,10 +115,10 @@ class MikrotikHubTracker(ScannerEntity): """Return a client description for device registry.""" info = { "connections": {(CONNECTION_NETWORK_MAC, self.device.mac)}, - "manufacturer": ATTR_MANUFACTURER, "identifiers": {(DOMAIN, self.device.mac)}, - "name": self.name, - "via_device": (DOMAIN, self.hub.serial_num), + # We only get generic info from device discovery and so don't want + # to override API specific info that integrations can provide + "default_name": self.name, } return info diff --git a/homeassistant/helpers/device_registry.py b/homeassistant/helpers/device_registry.py index b2e3bfd7a32..a52a3837868 100644 --- a/homeassistant/helpers/device_registry.py +++ b/homeassistant/helpers/device_registry.py @@ -209,6 +209,9 @@ class DeviceRegistry: manufacturer=_UNDEF, model=_UNDEF, name=_UNDEF, + default_manufacturer=_UNDEF, + default_model=_UNDEF, + default_name=_UNDEF, sw_version=_UNDEF, entry_type=_UNDEF, via_device=None, @@ -236,6 +239,16 @@ class DeviceRegistry: device = deleted_device.to_device_entry() self._add_device(device) + else: + if default_manufacturer and not device.manufacturer: + manufacturer = default_manufacturer + + if default_model and not device.model: + model = default_model + + if default_name and not device.name: + name = default_name + if via_device is not None: via = self.async_get_device({via_device}, set()) via_device_id = via.id if via else _UNDEF diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index 90e3cdb2f4d..0ca2010df48 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -378,6 +378,9 @@ class EntityPlatform: "manufacturer", "model", "name", + "default_manufacturer", + "default_model", + "default_name", "sw_version", "entry_type", "via_device", diff --git a/tests/helpers/test_device_registry.py b/tests/helpers/test_device_registry.py index 181a012807a..5b671dce134 100644 --- a/tests/helpers/test_device_registry.py +++ b/tests/helpers/test_device_registry.py @@ -839,3 +839,35 @@ async def test_restore_simple_device(hass, registry, update_events): assert update_events[2]["device_id"] == entry2.id assert update_events[3]["action"] == "create" assert update_events[3]["device_id"] == entry3.id + + +async def test_get_or_create_sets_default_values(hass, registry): + """Make sure we do not duplicate entries.""" + entry = registry.async_get_or_create( + identifiers={("bridgeid", "0123")}, config_entry_id="1234" + ) + assert entry.name is None + assert entry.model is None + assert entry.manufacturer is None + + entry = registry.async_get_or_create( + config_entry_id="1234", + identifiers={("bridgeid", "0123")}, + default_name="default name 1", + default_model="default model 1", + default_manufacturer="default manufacturer 1", + ) + assert entry.name == "default name 1" + assert entry.model == "default model 1" + assert entry.manufacturer == "default manufacturer 1" + + entry = registry.async_get_or_create( + config_entry_id="1234", + identifiers={("bridgeid", "0123")}, + default_name="default name 2", + default_model="default model 2", + default_manufacturer="default manufacturer 2", + ) + assert entry.name == "default name 1" + assert entry.model == "default model 1" + assert entry.manufacturer == "default manufacturer 1" diff --git a/tests/helpers/test_entity_platform.py b/tests/helpers/test_entity_platform.py index 6d03b087151..43939f44e7e 100644 --- a/tests/helpers/test_entity_platform.py +++ b/tests/helpers/test_entity_platform.py @@ -777,7 +777,13 @@ async def test_device_info_not_overrides(hass): async_add_entities( [ MockEntity( - unique_id="qwer", device_info={"connections": {("mac", "abcd")}} + unique_id="qwer", + device_info={ + "connections": {("mac", "abcd")}, + "default_name": "default name 1", + "default_model": "default model 1", + "default_manufacturer": "default manufacturer 1", + }, ) ] )