diff --git a/homeassistant/components/hassio/__init__.py b/homeassistant/components/hassio/__init__.py index d424722b4db..0f8ff5441f3 100644 --- a/homeassistant/components/hassio/__init__.py +++ b/homeassistant/components/hassio/__init__.py @@ -661,6 +661,7 @@ def async_register_addons_in_dev_reg( sw_version=addon[ATTR_VERSION], name=addon[ATTR_NAME], entry_type=ATTR_SERVICE, + configuration_url=f"homeassistant://hassio/addon/{addon[ATTR_SLUG]}", ) if manufacturer := addon.get(ATTR_REPOSITORY) or addon.get(ATTR_URL): params[ATTR_MANUFACTURER] = manufacturer diff --git a/homeassistant/helpers/entity_platform.py b/homeassistant/helpers/entity_platform.py index ccc9b1663a8..1864111c0ed 100644 --- a/homeassistant/helpers/entity_platform.py +++ b/homeassistant/helpers/entity_platform.py @@ -8,6 +8,7 @@ from datetime import datetime, timedelta from logging import Logger, getLogger from types import ModuleType from typing import TYPE_CHECKING, Any, Protocol +from urllib.parse import urlparse import voluptuous as vol @@ -476,14 +477,17 @@ class EntityPlatform: processed_dev_info[key] = device_info[key] # type: ignore[misc] if "configuration_url" in device_info: - try: - processed_dev_info["configuration_url"] = cv.url( - device_info["configuration_url"] - ) - except vol.Invalid: + configuration_url = str(device_info["configuration_url"]) + if urlparse(configuration_url).scheme in [ + "http", + "https", + "homeassistant", + ]: + processed_dev_info["configuration_url"] = configuration_url + else: _LOGGER.warning( "Ignoring invalid device configuration_url '%s'", - device_info["configuration_url"], + configuration_url, ) try: diff --git a/tests/helpers/test_entity_platform.py b/tests/helpers/test_entity_platform.py index 9f213801355..636ce7a764b 100644 --- a/tests/helpers/test_entity_platform.py +++ b/tests/helpers/test_entity_platform.py @@ -967,6 +967,50 @@ async def test_device_info_invalid_url(hass, caplog): ) +async def test_device_info_homeassistant_url(hass, caplog): + """Test device info with homeassistant URL.""" + registry = dr.async_get(hass) + registry.async_get_or_create( + config_entry_id="123", + connections=set(), + identifiers={("mqtt", "via-id")}, + manufacturer="manufacturer", + model="via", + ) + + async def async_setup_entry(hass, config_entry, async_add_entities): + """Mock setup entry method.""" + async_add_entities( + [ + # Valid device info, with homeassistant url + MockEntity( + unique_id="qwer", + device_info={ + "identifiers": {("mqtt", "1234")}, + "configuration_url": "homeassistant://config/mqtt", + }, + ), + ] + ) + return True + + platform = MockPlatform(async_setup_entry=async_setup_entry) + config_entry = MockConfigEntry(entry_id="super-mock-id") + entity_platform = MockEntityPlatform( + hass, platform_name=config_entry.domain, platform=platform + ) + + assert await entity_platform.async_setup_entry(config_entry) + await hass.async_block_till_done() + + assert len(hass.states.async_entity_ids()) == 1 + + device = registry.async_get_device({("mqtt", "1234")}) + assert device is not None + assert device.identifiers == {("mqtt", "1234")} + assert device.configuration_url == "homeassistant://config/mqtt" + + async def test_entity_disabled_by_integration(hass): """Test entity disabled by integration.""" component = EntityComponent(_LOGGER, DOMAIN, hass, timedelta(seconds=20))