async def async_setup(hass: HomeAssistant, config: ConfigType) -> bool: """Set up Zeroconf and make Home Assistant discoverable.""" zc_args: dict = {"ip_version": IPVersion.V4Only} adapters = await network.async_get_adapters(hass) ipv6 = False if _async_zc_has_functional_dual_stack(): if any(adapter["enabled"] and adapter["ipv6"] for adapter in adapters): ipv6 = True zc_args["ip_version"] = IPVersion.All elif not any(adapter["enabled"] and adapter["ipv4"] for adapter in adapters): zc_args["ip_version"] = IPVersion.V6Only ipv6 = True if not ipv6 and network.async_only_default_interface_enabled(adapters): zc_args["interfaces"] = InterfaceChoice.Default else: zc_args["interfaces"] = [ str(source_ip) for source_ip in await network.async_get_enabled_source_ips(hass) if not source_ip.is_loopback and not (isinstance(source_ip, IPv6Address) and source_ip.is_global) and not ( isinstance(source_ip, IPv6Address) and zc_args["ip_version"] == IPVersion.V4Only ) and not ( isinstance(source_ip, IPv4Address) and zc_args["ip_version"] == IPVersion.V6Only ) ] aio_zc = await _async_get_instance(hass, **zc_args) zeroconf = cast(HaZeroconf, aio_zc.zeroconf) zeroconf_types, homekit_models = await asyncio.gather( async_get_zeroconf(hass), async_get_homekit(hass) ) discovery = ZeroconfDiscovery(hass, zeroconf, zeroconf_types, homekit_models, ipv6) await discovery.async_setup() async def _async_zeroconf_hass_start(_event: Event) -> None: """Expose Home Assistant on zeroconf when it starts. Wait till started or otherwise HTTP is not up and running. """ uuid = await hass.helpers.instance_id.async_get() await _async_register_hass_zc_service(hass, aio_zc, uuid) async def _async_zeroconf_hass_stop(_event: Event) -> None: await discovery.async_stop() hass.bus.async_listen_once(EVENT_HOMEASSISTANT_STOP, _async_zeroconf_hass_stop) hass.bus.async_listen_once(EVENT_HOMEASSISTANT_START, _async_zeroconf_hass_start) return True
if not adapter["enabled"]: continue if ipv4s := adapter["ipv4"]: interfaces.append(ipv4s[0]["address"]) elif ipv6s := adapter["ipv6"]: interfaces.append(ipv6s[0]["scope_id"]) ipv6 = True if not any(adapter["enabled"] and adapter["ipv6"] for adapter in adapters): ipv6 = False zc_args["ip_version"] = IPVersion.V4Only aio_zc = await _async_get_instance(hass, **zc_args) zeroconf = cast(HaZeroconf, aio_zc.zeroconf) zeroconf_types, homekit_models = await asyncio.gather( async_get_zeroconf(hass), async_get_homekit(hass)) discovery = ZeroconfDiscovery(hass, zeroconf, zeroconf_types, homekit_models, ipv6) await discovery.async_setup() async def _async_zeroconf_hass_start(_event: Event) -> None: """Expose Home Assistant on zeroconf when it starts. Wait till started or otherwise HTTP is not up and running. """ uuid = await hass.helpers.instance_id.async_get() await _async_register_hass_zc_service(hass, aio_zc, uuid) @callback def _async_start_discovery(_event: Event) -> None: """Start processing flows."""