Skip to content

Commit

Permalink
Ensure ZHA setup works with container installs (home-assistant#130470)
Browse files Browse the repository at this point in the history
  • Loading branch information
puddly authored Nov 14, 2024
1 parent 58fd917 commit 245fc24
Show file tree
Hide file tree
Showing 2 changed files with 53 additions and 26 deletions.
36 changes: 19 additions & 17 deletions homeassistant/components/zha/config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -33,6 +33,7 @@
from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.selector import FileSelector, FileSelectorConfig
from homeassistant.util import dt as dt_util

Expand Down Expand Up @@ -104,25 +105,26 @@ async def list_serial_ports(hass: HomeAssistant) -> list[ListPortInfo]:
yellow_radio.description = "Yellow Zigbee module"
yellow_radio.manufacturer = "Nabu Casa"

# Present the multi-PAN addon as a setup option, if it's available
multipan_manager = await silabs_multiprotocol_addon.get_multiprotocol_addon_manager(
hass
)

try:
addon_info = await multipan_manager.async_get_addon_info()
except (AddonError, KeyError):
addon_info = None

if addon_info is not None and addon_info.state != AddonState.NOT_INSTALLED:
addon_port = ListPortInfo(
device=silabs_multiprotocol_addon.get_zigbee_socket(),
skip_link_detection=True,
if is_hassio(hass):
# Present the multi-PAN addon as a setup option, if it's available
multipan_manager = (
await silabs_multiprotocol_addon.get_multiprotocol_addon_manager(hass)
)

addon_port.description = "Multiprotocol add-on"
addon_port.manufacturer = "Nabu Casa"
ports.append(addon_port)
try:
addon_info = await multipan_manager.async_get_addon_info()
except (AddonError, KeyError):
addon_info = None

if addon_info is not None and addon_info.state != AddonState.NOT_INSTALLED:
addon_port = ListPortInfo(
device=silabs_multiprotocol_addon.get_zigbee_socket(),
skip_link_detection=True,
)

addon_port.description = "Multiprotocol add-on"
addon_port.manufacturer = "Nabu Casa"
ports.append(addon_port)

return ports

Expand Down
43 changes: 34 additions & 9 deletions tests/components/zha/test_config_flow.py
Original file line number Diff line number Diff line change
Expand Up @@ -21,7 +21,7 @@

from homeassistant import config_entries
from homeassistant.components import ssdp, usb, zeroconf
from homeassistant.components.hassio import AddonState
from homeassistant.components.hassio import AddonError, AddonState
from homeassistant.components.ssdp import ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_SERIAL
from homeassistant.components.zha import config_flow, radio_manager
from homeassistant.components.zha.const import (
Expand Down Expand Up @@ -1878,27 +1878,52 @@ async def test_config_flow_port_yellow_port_name(hass: HomeAssistant) -> None:
)


async def test_config_flow_ports_no_hassio(hass: HomeAssistant) -> None:
"""Test config flow serial port name when this is not a hassio install."""

with (
patch("homeassistant.components.zha.config_flow.is_hassio", return_value=False),
patch("serial.tools.list_ports.comports", MagicMock(return_value=[])),
):
ports = await config_flow.list_serial_ports(hass)

assert ports == []


async def test_config_flow_port_multiprotocol_port_name(hass: HomeAssistant) -> None:
"""Test config flow serial port name for multiprotocol add-on."""

with (
patch("homeassistant.components.zha.config_flow.is_hassio", return_value=True),
patch(
"homeassistant.components.hassio.addon_manager.AddonManager.async_get_addon_info"
) as async_get_addon_info,
patch("serial.tools.list_ports.comports", MagicMock(return_value=[])),
):
async_get_addon_info.return_value.state = AddonState.RUNNING
async_get_addon_info.return_value.hostname = "core-silabs-multiprotocol"
ports = await config_flow.list_serial_ports(hass)

result = await hass.config_entries.flow.async_init(
DOMAIN,
context={CONF_SOURCE: SOURCE_USER},
)
assert len(ports) == 1
assert ports[0].description == "Multiprotocol add-on"
assert ports[0].manufacturer == "Nabu Casa"
assert ports[0].device == "socket://core-silabs-multiprotocol:9999"

assert (
result["data_schema"].schema["path"].container[0]
== "socket://core-silabs-multiprotocol:9999 - Multiprotocol add-on - Nabu Casa"
)

async def test_config_flow_port_no_multiprotocol(hass: HomeAssistant) -> None:
"""Test config flow serial port listing when addon info fails to load."""

with (
patch("homeassistant.components.zha.config_flow.is_hassio", return_value=True),
patch(
"homeassistant.components.hassio.addon_manager.AddonManager.async_get_addon_info",
side_effect=AddonError,
),
patch("serial.tools.list_ports.comports", MagicMock(return_value=[])),
):
ports = await config_flow.list_serial_ports(hass)

assert ports == []


@patch("serial.tools.list_ports.comports", MagicMock(return_value=[com_port()]))
Expand Down

0 comments on commit 245fc24

Please sign in to comment.