From 335a9181185959f9bce20bff73b76543cf00be31 Mon Sep 17 00:00:00 2001 From: Erik Montnemery Date: Fri, 11 Feb 2022 10:31:51 +0100 Subject: [PATCH] Create MQTT discovery flow when manual config is present (#66248) * Create MQTT discovery flow when manual config is present * Change to integration_discovery flow * Add test * Add default handler for integration_discovery --- homeassistant/components/mqtt/__init__.py | 9 +++++++ homeassistant/config_entries.py | 30 ++++++++++++++--------- tests/components/mqtt/test_config_flow.py | 20 +++++++++++++++ 3 files changed, 47 insertions(+), 12 deletions(-) diff --git a/homeassistant/components/mqtt/__init__.py b/homeassistant/components/mqtt/__init__.py index 6cb2eb41d9c..7c3bc63779b 100644 --- a/homeassistant/components/mqtt/__init__.py +++ b/homeassistant/components/mqtt/__init__.py @@ -21,6 +21,7 @@ import certifi import jinja2 import voluptuous as vol +from homeassistant import config_entries from homeassistant.components import websocket_api from homeassistant.config_entries import ConfigEntry from homeassistant.const import ( @@ -585,6 +586,14 @@ async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: conf = dict(conf) hass.data[DATA_MQTT_CONFIG] = conf + if not bool(hass.config_entries.async_entries(DOMAIN)): + hass.async_create_task( + hass.config_entries.flow.async_init( + DOMAIN, + context={"source": config_entries.SOURCE_INTEGRATION_DISCOVERY}, + data={}, + ) + ) return True diff --git a/homeassistant/config_entries.py b/homeassistant/config_entries.py index f5cef1e7484..a0017c36684 100644 --- a/homeassistant/config_entries.py +++ b/homeassistant/config_entries.py @@ -1393,12 +1393,24 @@ class ConfigFlow(data_entry_flow.FlowHandler): reason=reason, description_placeholders=description_placeholders ) + async def async_step_dhcp( + self, discovery_info: DhcpServiceInfo + ) -> data_entry_flow.FlowResult: + """Handle a flow initialized by DHCP discovery.""" + return await self.async_step_discovery(dataclasses.asdict(discovery_info)) + async def async_step_hassio( self, discovery_info: HassioServiceInfo ) -> data_entry_flow.FlowResult: """Handle a flow initialized by HASS IO discovery.""" return await self.async_step_discovery(discovery_info.config) + async def async_step_integration_discovery( + self, discovery_info: DiscoveryInfoType + ) -> data_entry_flow.FlowResult: + """Handle a flow initialized by integration specific discovery.""" + return await self.async_step_discovery(discovery_info) + async def async_step_homekit( self, discovery_info: ZeroconfServiceInfo ) -> data_entry_flow.FlowResult: @@ -1417,24 +1429,18 @@ class ConfigFlow(data_entry_flow.FlowHandler): """Handle a flow initialized by SSDP discovery.""" return await self.async_step_discovery(dataclasses.asdict(discovery_info)) - async def async_step_zeroconf( - self, discovery_info: ZeroconfServiceInfo - ) -> data_entry_flow.FlowResult: - """Handle a flow initialized by Zeroconf discovery.""" - return await self.async_step_discovery(dataclasses.asdict(discovery_info)) - - async def async_step_dhcp( - self, discovery_info: DhcpServiceInfo - ) -> data_entry_flow.FlowResult: - """Handle a flow initialized by DHCP discovery.""" - return await self.async_step_discovery(dataclasses.asdict(discovery_info)) - async def async_step_usb( self, discovery_info: UsbServiceInfo ) -> data_entry_flow.FlowResult: """Handle a flow initialized by USB discovery.""" return await self.async_step_discovery(dataclasses.asdict(discovery_info)) + async def async_step_zeroconf( + self, discovery_info: ZeroconfServiceInfo + ) -> data_entry_flow.FlowResult: + """Handle a flow initialized by Zeroconf discovery.""" + return await self.async_step_discovery(dataclasses.asdict(discovery_info)) + @callback def async_create_entry( # pylint: disable=arguments-differ self, diff --git a/tests/components/mqtt/test_config_flow.py b/tests/components/mqtt/test_config_flow.py index 83dafd6b436..f16a0e5e83a 100644 --- a/tests/components/mqtt/test_config_flow.py +++ b/tests/components/mqtt/test_config_flow.py @@ -79,6 +79,26 @@ async def test_user_connection_fails(hass, mock_try_connection, mock_finish_setu assert len(mock_finish_setup.mock_calls) == 0 +async def test_manual_config_starts_discovery_flow( + hass, mock_try_connection, mock_finish_setup, mqtt_client_mock +): + """Test manual config initiates a discovery flow.""" + # No flows in progress + assert hass.config_entries.flow.async_progress() == [] + + # MQTT config present in yaml config + assert await async_setup_component(hass, "mqtt", {"mqtt": {}}) + await hass.async_block_till_done() + assert len(mock_finish_setup.mock_calls) == 0 + + # There should now be a discovery flow + flows = hass.config_entries.flow.async_progress() + assert len(flows) == 1 + assert flows[0]["context"]["source"] == "integration_discovery" + assert flows[0]["handler"] == "mqtt" + assert flows[0]["step_id"] == "broker" + + async def test_manual_config_set( hass, mock_try_connection, mock_finish_setup, mqtt_client_mock ):