diff --git a/homeassistant/components/daikin/config_flow.py b/homeassistant/components/daikin/config_flow.py index ea0709e5557..43d169e3440 100644 --- a/homeassistant/components/daikin/config_flow.py +++ b/homeassistant/components/daikin/config_flow.py @@ -75,7 +75,8 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): uuid=uuid, password=password, ) - except asyncio.TimeoutError: + except (asyncio.TimeoutError, ClientError): + self.host = None return self.async_show_form( step_id="user", data_schema=self.schema, @@ -87,13 +88,6 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): data_schema=self.schema, errors={"base": "invalid_auth"}, ) - except ClientError: - _LOGGER.exception("ClientError") - return self.async_show_form( - step_id="user", - data_schema=self.schema, - errors={"base": "unknown"}, - ) except Exception: # pylint: disable=broad-except _LOGGER.exception("Unexpected error creating device") return self.async_show_form( @@ -109,6 +103,13 @@ class FlowHandler(config_entries.ConfigFlow, domain=DOMAIN): """User initiated config flow.""" if user_input is None: return self.async_show_form(step_id="user", data_schema=self.schema) + if user_input.get(CONF_API_KEY) and user_input.get(CONF_PASSWORD): + self.host = user_input.get(CONF_HOST) + return self.async_show_form( + step_id="user", + data_schema=self.schema, + errors={"base": "api_password"}, + ) return await self._create_device( user_input[CONF_HOST], user_input.get(CONF_API_KEY), diff --git a/homeassistant/components/daikin/strings.json b/homeassistant/components/daikin/strings.json index fc2b6e79a5e..5c759384795 100644 --- a/homeassistant/components/daikin/strings.json +++ b/homeassistant/components/daikin/strings.json @@ -18,6 +18,7 @@ "error": { "unknown": "[%key:common::config_flow::error::unknown%]", "invalid_auth": "[%key:common::config_flow::error::invalid_auth%]", + "api_password": "[%key:common::config_flow::error::invalid_auth%], use either API Key or Password.", "cannot_connect": "[%key:common::config_flow::error::cannot_connect%]" } } diff --git a/homeassistant/components/daikin/translations/en.json b/homeassistant/components/daikin/translations/en.json index d1db170d769..84843ba8211 100644 --- a/homeassistant/components/daikin/translations/en.json +++ b/homeassistant/components/daikin/translations/en.json @@ -5,6 +5,7 @@ "cannot_connect": "Failed to connect" }, "error": { + "api_password": "Invalid authentication, use either API Key or Password.", "cannot_connect": "Failed to connect", "invalid_auth": "Invalid authentication", "unknown": "Unexpected error" diff --git a/tests/components/daikin/test_config_flow.py b/tests/components/daikin/test_config_flow.py index 624268d7ee3..91ea79f4aa7 100644 --- a/tests/components/daikin/test_config_flow.py +++ b/tests/components/daikin/test_config_flow.py @@ -3,13 +3,12 @@ import asyncio from unittest.mock import PropertyMock, patch -from aiohttp import ClientError -from aiohttp.web_exceptions import HTTPForbidden +from aiohttp import ClientError, web_exceptions import pytest from homeassistant.components.daikin.const import KEY_MAC from homeassistant.config_entries import SOURCE_USER, SOURCE_ZEROCONF -from homeassistant.const import CONF_HOST +from homeassistant.const import CONF_API_KEY, CONF_HOST, CONF_PASSWORD from homeassistant.data_entry_flow import ( RESULT_TYPE_ABORT, RESULT_TYPE_CREATE_ENTRY, @@ -84,8 +83,8 @@ async def test_abort_if_already_setup(hass, mock_daikin): "s_effect,reason", [ (asyncio.TimeoutError, "cannot_connect"), - (HTTPForbidden, "invalid_auth"), - (ClientError, "unknown"), + (ClientError, "cannot_connect"), + (web_exceptions.HTTPForbidden, "invalid_auth"), (Exception, "unknown"), ], ) @@ -103,6 +102,18 @@ async def test_device_abort(hass, mock_daikin, s_effect, reason): assert result["step_id"] == "user" +async def test_api_password_abort(hass): + """Test device abort.""" + result = await hass.config_entries.flow.async_init( + "daikin", + context={"source": SOURCE_USER}, + data={CONF_HOST: HOST, CONF_API_KEY: "aa", CONF_PASSWORD: "aa"}, + ) + assert result["type"] == RESULT_TYPE_FORM + assert result["errors"] == {"base": "api_password"} + assert result["step_id"] == "user" + + @pytest.mark.parametrize( "source, data, unique_id", [