From ddb5ed9dc89f2645b473ab7aae66e00dce91696e Mon Sep 17 00:00:00 2001 From: Franck Nijhof Date: Fri, 15 May 2020 13:29:55 +0200 Subject: [PATCH] Add more information to discovery API (#35624) --- homeassistant/components/api/__init__.py | 43 ++++++++++++++++++------ 1 file changed, 32 insertions(+), 11 deletions(-) diff --git a/homeassistant/components/api/__init__.py b/homeassistant/components/api/__init__.py index 8d0cd44070c..001ce5d2a4e 100644 --- a/homeassistant/components/api/__init__.py +++ b/homeassistant/components/api/__init__.py @@ -35,14 +35,18 @@ import homeassistant.core as ha from homeassistant.exceptions import ServiceNotFound, TemplateError, Unauthorized from homeassistant.helpers import template from homeassistant.helpers.json import JSONEncoder +from homeassistant.helpers.network import NoURLAvailableError, get_url from homeassistant.helpers.service import async_get_all_descriptions from homeassistant.helpers.state import AsyncTrackStates _LOGGER = logging.getLogger(__name__) ATTR_BASE_URL = "base_url" +ATTR_EXTERNAL_URL = "external_url" +ATTR_INTERNAL_URL = "internal_url" ATTR_LOCATION_NAME = "location_name" ATTR_REQUIRES_API_PASSWORD = "requires_api_password" +ATTR_UUID = "uuid" ATTR_VERSION = "version" DOMAIN = "api" @@ -173,19 +177,36 @@ class APIDiscoveryView(HomeAssistantView): url = URL_API_DISCOVERY_INFO name = "api:discovery" - @ha.callback - def get(self, request): + async def get(self, request): """Get discovery information.""" hass = request.app["hass"] - return self.json( - { - ATTR_BASE_URL: hass.config.api.base_url, - ATTR_LOCATION_NAME: hass.config.location_name, - # always needs authentication - ATTR_REQUIRES_API_PASSWORD: True, - ATTR_VERSION: __version__, - } - ) + uuid = await hass.helpers.instance_id.async_get() + + data = { + ATTR_UUID: uuid, + ATTR_BASE_URL: None, + ATTR_EXTERNAL_URL: None, + ATTR_INTERNAL_URL: None, + ATTR_LOCATION_NAME: hass.config.location_name, + # always needs authentication + ATTR_REQUIRES_API_PASSWORD: True, + ATTR_VERSION: __version__, + } + + try: + data["external_url"] = get_url(hass, allow_internal=False) + except NoURLAvailableError: + pass + + try: + data["internal_url"] = get_url(hass, allow_external=False) + except NoURLAvailableError: + pass + + # Set old base URL based on external or internal + data["base_url"] = data["external_url"] or data["internal_url"] + + return self.json(data) class APIStatesView(HomeAssistantView):