Use IP Address (host) provided by mDNS on Elgato Key Light (#38539)

This commit is contained in:
Pedro Lamas 2020-08-05 10:26:17 +01:00 committed by GitHub
parent 5b234b80e8
commit e422274085
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
4 changed files with 41 additions and 44 deletions

View file

@ -55,21 +55,21 @@ class ElgatoFlowHandler(ConfigFlow, domain=DOMAIN):
if user_input is None:
return self.async_abort(reason="connection_error")
# Hostname is format: my-ke.local.
host = user_input["hostname"].rstrip(".")
try:
info = await self._get_elgato_info(host, user_input[CONF_PORT])
info = await self._get_elgato_info(
user_input[CONF_HOST], user_input[CONF_PORT]
)
except ElgatoError:
return self.async_abort(reason="connection_error")
# Check if already configured
await self.async_set_unique_id(info.serial_number)
self._abort_if_unique_id_configured()
self._abort_if_unique_id_configured(updates={CONF_HOST: user_input[CONF_HOST]})
# pylint: disable=no-member # https://github.com/PyCQA/pylint/issues/3167
self.context.update(
{
CONF_HOST: host,
CONF_HOST: user_input[CONF_HOST],
CONF_PORT: user_input[CONF_PORT],
CONF_SERIAL_NUMBER: info.serial_number,
"title_placeholders": {"serial_number": info.serial_number},

View file

@ -14,28 +14,34 @@ async def init_integration(
"""Set up the Elgato Key Light integration in Home Assistant."""
aioclient_mock.get(
"http://example.local:9123/elgato/accessory-info",
"http://1.2.3.4:9123/elgato/accessory-info",
text=load_fixture("elgato/info.json"),
headers={"Content-Type": "application/json"},
)
aioclient_mock.put(
"http://example.local:9123/elgato/lights",
"http://1.2.3.4:9123/elgato/lights",
text=load_fixture("elgato/state.json"),
headers={"Content-Type": "application/json"},
)
aioclient_mock.get(
"http://example.local:9123/elgato/lights",
"http://1.2.3.4:9123/elgato/lights",
text=load_fixture("elgato/state.json"),
headers={"Content-Type": "application/json"},
)
aioclient_mock.get(
"http://5.6.7.8:9123/elgato/accessory-info",
text=load_fixture("elgato/info.json"),
headers={"Content-Type": "application/json"},
)
entry = MockConfigEntry(
domain=DOMAIN,
unique_id="CN11A1A00001",
data={
CONF_HOST: "example.local",
CONF_HOST: "1.2.3.4",
CONF_PORT: 9123,
CONF_SERIAL_NUMBER: "CN11A1A00001",
},

View file

@ -41,7 +41,7 @@ async def test_show_zerconf_form(
) -> None:
"""Test that the zeroconf confirmation form is served."""
aioclient_mock.get(
"http://example.local:9123/elgato/accessory-info",
"http://1.2.3.4:9123/elgato/accessory-info",
text=load_fixture("elgato/info.json"),
headers={"Content-Type": "application/json"},
)
@ -49,11 +49,9 @@ async def test_show_zerconf_form(
flow = config_flow.ElgatoFlowHandler()
flow.hass = hass
flow.context = {"source": SOURCE_ZEROCONF}
result = await flow.async_step_zeroconf(
{"hostname": "example.local.", "port": 9123}
)
result = await flow.async_step_zeroconf({"host": "1.2.3.4", "port": 9123})
assert flow.context[CONF_HOST] == "example.local"
assert flow.context[CONF_HOST] == "1.2.3.4"
assert flow.context[CONF_PORT] == 9123
assert flow.context[CONF_SERIAL_NUMBER] == "CN11A1A00001"
assert result["description_placeholders"] == {CONF_SERIAL_NUMBER: "CN11A1A00001"}
@ -65,14 +63,12 @@ async def test_connection_error(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Test we show user form on Elgato Key Light connection error."""
aioclient_mock.get(
"http://example.local/elgato/accessory-info", exc=aiohttp.ClientError
)
aioclient_mock.get("http://1.2.3.4/elgato/accessory-info", exc=aiohttp.ClientError)
result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN,
context={"source": SOURCE_USER},
data={CONF_HOST: "example.local", CONF_PORT: 9123},
data={CONF_HOST: "1.2.3.4", CONF_PORT: 9123},
)
assert result["errors"] == {"base": "connection_error"}
@ -84,14 +80,12 @@ async def test_zeroconf_connection_error(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Test we abort zeroconf flow on Elgato Key Light connection error."""
aioclient_mock.get(
"http://example.local/elgato/accessory-info", exc=aiohttp.ClientError
)
aioclient_mock.get("http://1.2.3.4/elgato/accessory-info", exc=aiohttp.ClientError)
result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN,
context={"source": SOURCE_ZEROCONF},
data={"hostname": "example.local.", "port": 9123},
data={"host": "1.2.3.4", "port": 9123},
)
assert result["reason"] == "connection_error"
@ -102,19 +96,17 @@ async def test_zeroconf_confirm_connection_error(
hass: HomeAssistant, aioclient_mock: AiohttpClientMocker
) -> None:
"""Test we abort zeroconf flow on Elgato Key Light connection error."""
aioclient_mock.get(
"http://example.local/elgato/accessory-info", exc=aiohttp.ClientError
)
aioclient_mock.get("http://1.2.3.4/elgato/accessory-info", exc=aiohttp.ClientError)
flow = config_flow.ElgatoFlowHandler()
flow.hass = hass
flow.context = {
"source": SOURCE_ZEROCONF,
CONF_HOST: "example.local",
CONF_HOST: "1.2.3.4",
CONF_PORT: 9123,
}
result = await flow.async_step_zeroconf_confirm(
user_input={CONF_HOST: "example.local", CONF_PORT: 9123}
user_input={CONF_HOST: "1.2.3.4", CONF_PORT: 9123}
)
assert result["reason"] == "connection_error"
@ -142,7 +134,7 @@ async def test_user_device_exists_abort(
result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN,
context={"source": SOURCE_USER},
data={CONF_HOST: "example.local", CONF_PORT: 9123},
data={CONF_HOST: "1.2.3.4", CONF_PORT: 9123},
)
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
@ -157,7 +149,7 @@ async def test_zeroconf_device_exists_abort(
result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN,
context={"source": SOURCE_ZEROCONF},
data={"hostname": "example.local.", "port": 9123},
data={"host": "1.2.3.4", "port": 9123},
)
assert result["reason"] == "already_configured"
@ -165,20 +157,23 @@ async def test_zeroconf_device_exists_abort(
result = await hass.config_entries.flow.async_init(
config_flow.DOMAIN,
context={"source": SOURCE_ZEROCONF, CONF_HOST: "example.local", "port": 9123},
data={"hostname": "example.local.", "port": 9123},
context={"source": SOURCE_ZEROCONF, CONF_HOST: "1.2.3.4", "port": 9123},
data={"host": "5.6.7.8", "port": 9123},
)
assert result["reason"] == "already_configured"
assert result["type"] == data_entry_flow.RESULT_TYPE_ABORT
entries = hass.config_entries.async_entries(config_flow.DOMAIN)
assert entries[0].data[CONF_HOST] == "5.6.7.8"
async def test_full_user_flow_implementation(
hass: HomeAssistant, aioclient_mock
) -> None:
"""Test the full manual user flow from start to finish."""
aioclient_mock.get(
"http://example.local:9123/elgato/accessory-info",
"http://1.2.3.4:9123/elgato/accessory-info",
text=load_fixture("elgato/info.json"),
headers={"Content-Type": "application/json"},
)
@ -191,10 +186,10 @@ async def test_full_user_flow_implementation(
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
result = await hass.config_entries.flow.async_configure(
result["flow_id"], user_input={CONF_HOST: "example.local", CONF_PORT: 9123}
result["flow_id"], user_input={CONF_HOST: "1.2.3.4", CONF_PORT: 9123}
)
assert result["data"][CONF_HOST] == "example.local"
assert result["data"][CONF_HOST] == "1.2.3.4"
assert result["data"][CONF_PORT] == 9123
assert result["data"][CONF_SERIAL_NUMBER] == "CN11A1A00001"
assert result["title"] == "CN11A1A00001"
@ -209,7 +204,7 @@ async def test_full_zeroconf_flow_implementation(
) -> None:
"""Test the full manual user flow from start to finish."""
aioclient_mock.get(
"http://example.local:9123/elgato/accessory-info",
"http://1.2.3.4:9123/elgato/accessory-info",
text=load_fixture("elgato/info.json"),
headers={"Content-Type": "application/json"},
)
@ -217,21 +212,17 @@ async def test_full_zeroconf_flow_implementation(
flow = config_flow.ElgatoFlowHandler()
flow.hass = hass
flow.context = {"source": SOURCE_ZEROCONF}
result = await flow.async_step_zeroconf(
{"hostname": "example.local.", "port": 9123}
)
result = await flow.async_step_zeroconf({"host": "1.2.3.4", "port": 9123})
assert flow.context[CONF_HOST] == "example.local"
assert flow.context[CONF_HOST] == "1.2.3.4"
assert flow.context[CONF_PORT] == 9123
assert flow.context[CONF_SERIAL_NUMBER] == "CN11A1A00001"
assert result["description_placeholders"] == {CONF_SERIAL_NUMBER: "CN11A1A00001"}
assert result["step_id"] == "zeroconf_confirm"
assert result["type"] == data_entry_flow.RESULT_TYPE_FORM
result = await flow.async_step_zeroconf_confirm(
user_input={CONF_HOST: "example.local"}
)
assert result["data"][CONF_HOST] == "example.local"
result = await flow.async_step_zeroconf_confirm(user_input={CONF_HOST: "1.2.3.4"})
assert result["data"][CONF_HOST] == "1.2.3.4"
assert result["data"][CONF_PORT] == 9123
assert result["data"][CONF_SERIAL_NUMBER] == "CN11A1A00001"
assert result["title"] == "CN11A1A00001"

View file

@ -14,7 +14,7 @@ async def test_config_entry_not_ready(
) -> None:
"""Test the Elgato Key Light configuration entry not ready."""
aioclient_mock.get(
"http://example.local:9123/elgato/accessory-info", exc=aiohttp.ClientError
"http://1.2.3.4:9123/elgato/accessory-info", exc=aiohttp.ClientError
)
entry = await init_integration(hass, aioclient_mock)