From 604cd46ec90266f188fe25c6f46aa555a5e016d2 Mon Sep 17 00:00:00 2001 From: puddly <32534428+puddly@users.noreply.github.com> Date: Mon, 7 Nov 2022 11:26:16 -0500 Subject: [PATCH] Enable SkyConnect config flow and use correct case in USB matching (#81522) * Ensure `USBCallbackMatcher` uses the appropriate case for each field * Enable the config flow for the SkyConnect integration * Update unit test --- .../homeassistant_sky_connect/__init__.py | 20 ++++++++++++---- .../homeassistant_sky_connect/manifest.json | 2 +- homeassistant/generated/config_flows.py | 1 + homeassistant/generated/usb.py | 6 +++++ .../homeassistant_sky_connect/test_init.py | 23 ++++++++++++------- 5 files changed, 38 insertions(+), 14 deletions(-) diff --git a/homeassistant/components/homeassistant_sky_connect/__init__.py b/homeassistant/components/homeassistant_sky_connect/__init__.py index dd4cf013fab..cb00f0e32ec 100644 --- a/homeassistant/components/homeassistant_sky_connect/__init__.py +++ b/homeassistant/components/homeassistant_sky_connect/__init__.py @@ -1,16 +1,29 @@ """The Home Assistant Sky Connect integration.""" from __future__ import annotations -from typing import cast - from homeassistant.components import usb from homeassistant.config_entries import ConfigEntry from homeassistant.core import HomeAssistant from homeassistant.exceptions import ConfigEntryNotReady +from .const import DOMAIN + async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: """Set up a Home Assistant Sky Connect config entry.""" + matcher = usb.USBCallbackMatcher( + domain=DOMAIN, + vid=entry.data["vid"].upper(), + pid=entry.data["pid"].upper(), + serial_number=entry.data["serial_number"].lower(), + manufacturer=entry.data["manufacturer"].lower(), + description=entry.data["description"].lower(), + ) + + if not usb.async_is_plugged_in(hass, matcher): + # The USB dongle is not plugged in + raise ConfigEntryNotReady + usb_info = usb.UsbServiceInfo( device=entry.data["device"], vid=entry.data["vid"], @@ -19,9 +32,6 @@ async def async_setup_entry(hass: HomeAssistant, entry: ConfigEntry) -> bool: manufacturer=entry.data["manufacturer"], description=entry.data["description"], ) - if not usb.async_is_plugged_in(hass, cast(usb.USBCallbackMatcher, entry.data)): - # The USB dongle is not plugged in - raise ConfigEntryNotReady await hass.config_entries.flow.async_init( "zha", diff --git a/homeassistant/components/homeassistant_sky_connect/manifest.json b/homeassistant/components/homeassistant_sky_connect/manifest.json index 5ccb8bd5331..8fdc1d3c1d1 100644 --- a/homeassistant/components/homeassistant_sky_connect/manifest.json +++ b/homeassistant/components/homeassistant_sky_connect/manifest.json @@ -1,7 +1,7 @@ { "domain": "homeassistant_sky_connect", "name": "Home Assistant Sky Connect", - "config_flow": false, + "config_flow": true, "documentation": "https://www.home-assistant.io/integrations/homeassistant_sky_connect", "dependencies": ["hardware", "usb"], "codeowners": ["@home-assistant/core"], diff --git a/homeassistant/generated/config_flows.py b/homeassistant/generated/config_flows.py index 22dd4f491e0..05e352ab2b7 100644 --- a/homeassistant/generated/config_flows.py +++ b/homeassistant/generated/config_flows.py @@ -161,6 +161,7 @@ FLOWS = { "hlk_sw16", "home_connect", "home_plus_control", + "homeassistant_sky_connect", "homekit", "homekit_controller", "homematicip_cloud", diff --git a/homeassistant/generated/usb.py b/homeassistant/generated/usb.py index 901f9f72da5..59b59bb7604 100644 --- a/homeassistant/generated/usb.py +++ b/homeassistant/generated/usb.py @@ -4,6 +4,12 @@ To update, run python3 -m script.hassfest """ USB = [ + { + "domain": "homeassistant_sky_connect", + "vid": "10C4", + "pid": "EA60", + "description": "*skyconnect v1.0*", + }, { "domain": "insteon", "vid": "10BF", diff --git a/tests/components/homeassistant_sky_connect/test_init.py b/tests/components/homeassistant_sky_connect/test_init.py index 05b883a9726..179a0eff8da 100644 --- a/tests/components/homeassistant_sky_connect/test_init.py +++ b/tests/components/homeassistant_sky_connect/test_init.py @@ -13,12 +13,12 @@ from homeassistant.core import HomeAssistant from tests.common import MockConfigEntry CONFIG_ENTRY_DATA = { - "device": "bla_device", - "vid": "bla_vid", - "pid": "bla_pid", - "serial_number": "bla_serial_number", - "manufacturer": "bla_manufacturer", - "description": "bla_description", + "device": "/dev/serial/by-id/usb-Nabu_Casa_SkyConnect_v1.0_9e2adbd75b8beb119fe564a0f320645d-if00-port0", + "vid": "10C4", + "pid": "EA60", + "serial_number": "3c0ed67c628beb11b1cd64a0f320645d", + "manufacturer": "Nabu Casa", + "description": "SkyConnect v1.0", } @@ -67,6 +67,13 @@ async def test_setup_entry( await hass.async_block_till_done() assert len(mock_is_plugged_in.mock_calls) == 1 + matcher = mock_is_plugged_in.mock_calls[0].args[1] + assert matcher["vid"].isupper() + assert matcher["pid"].isupper() + assert matcher["serial_number"].islower() + assert matcher["manufacturer"].islower() + assert matcher["description"].islower() + # Finish setting up ZHA if num_entries > 0: zha_flows = hass.config_entries.flow.async_progress_by_handler("zha") @@ -119,12 +126,12 @@ async def test_setup_zha(mock_zha_config_flow_setup, hass: HomeAssistant) -> Non "device": { "baudrate": 115200, "flow_control": "software", - "path": "bla_device", + "path": CONFIG_ENTRY_DATA["device"], }, "radio_type": "ezsp", } assert config_entry.options == {} - assert config_entry.title == "bla_description" + assert config_entry.title == CONFIG_ENTRY_DATA["description"] async def test_setup_entry_wait_usb(hass: HomeAssistant) -> None: