Ensure ZHA setup works with container installs (#130470)

This commit is contained in:
puddly 2024-11-14 04:13:29 -05:00 committed by GitHub
parent 58fd917cb7
commit 245fc246d8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
2 changed files with 53 additions and 26 deletions

View file

@ -33,6 +33,7 @@ from homeassistant.config_entries import (
from homeassistant.const import CONF_NAME from homeassistant.const import CONF_NAME
from homeassistant.core import HomeAssistant, callback from homeassistant.core import HomeAssistant, callback
from homeassistant.exceptions import HomeAssistantError from homeassistant.exceptions import HomeAssistantError
from homeassistant.helpers.hassio import is_hassio
from homeassistant.helpers.selector import FileSelector, FileSelectorConfig from homeassistant.helpers.selector import FileSelector, FileSelectorConfig
from homeassistant.util import dt as dt_util from homeassistant.util import dt as dt_util
@ -104,25 +105,26 @@ async def list_serial_ports(hass: HomeAssistant) -> list[ListPortInfo]:
yellow_radio.description = "Yellow Zigbee module" yellow_radio.description = "Yellow Zigbee module"
yellow_radio.manufacturer = "Nabu Casa" yellow_radio.manufacturer = "Nabu Casa"
# Present the multi-PAN addon as a setup option, if it's available if is_hassio(hass):
multipan_manager = await silabs_multiprotocol_addon.get_multiprotocol_addon_manager( # Present the multi-PAN addon as a setup option, if it's available
hass 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,
) )
addon_port.description = "Multiprotocol add-on" try:
addon_port.manufacturer = "Nabu Casa" addon_info = await multipan_manager.async_get_addon_info()
ports.append(addon_port) 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 return ports

View file

@ -21,7 +21,7 @@ import zigpy.types
from homeassistant import config_entries from homeassistant import config_entries
from homeassistant.components import ssdp, usb, zeroconf 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.ssdp import ATTR_UPNP_MANUFACTURER_URL, ATTR_UPNP_SERIAL
from homeassistant.components.zha import config_flow, radio_manager from homeassistant.components.zha import config_flow, radio_manager
from homeassistant.components.zha.const import ( from homeassistant.components.zha.const import (
@ -1878,10 +1878,23 @@ 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: async def test_config_flow_port_multiprotocol_port_name(hass: HomeAssistant) -> None:
"""Test config flow serial port name for multiprotocol add-on.""" """Test config flow serial port name for multiprotocol add-on."""
with ( with (
patch("homeassistant.components.zha.config_flow.is_hassio", return_value=True),
patch( patch(
"homeassistant.components.hassio.addon_manager.AddonManager.async_get_addon_info" "homeassistant.components.hassio.addon_manager.AddonManager.async_get_addon_info"
) as async_get_addon_info, ) as async_get_addon_info,
@ -1889,16 +1902,28 @@ async def test_config_flow_port_multiprotocol_port_name(hass: HomeAssistant) ->
): ):
async_get_addon_info.return_value.state = AddonState.RUNNING async_get_addon_info.return_value.state = AddonState.RUNNING
async_get_addon_info.return_value.hostname = "core-silabs-multiprotocol" 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( assert len(ports) == 1
DOMAIN, assert ports[0].description == "Multiprotocol add-on"
context={CONF_SOURCE: SOURCE_USER}, assert ports[0].manufacturer == "Nabu Casa"
) assert ports[0].device == "socket://core-silabs-multiprotocol:9999"
assert (
result["data_schema"].schema["path"].container[0] async def test_config_flow_port_no_multiprotocol(hass: HomeAssistant) -> None:
== "socket://core-silabs-multiprotocol:9999 - Multiprotocol add-on - Nabu Casa" """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()])) @patch("serial.tools.list_ports.comports", MagicMock(return_value=[com_port()]))