"""Zeroconf usage utility to warn about multiple instances.""" import logging import zeroconf from homeassistant.helpers.frame import ( MissingIntegrationFrame, get_integration_frame, report_integration, ) _LOGGER = logging.getLogger(__name__) def install_multiple_zeroconf_catcher(hass_zc) -> None: """Wrap the Zeroconf class to return the shared instance if multiple instances are detected.""" def new_zeroconf_new(self, *k, **kw): _report( "attempted to create another Zeroconf instance. Please use the shared Zeroconf via await homeassistant.components.zeroconf.async_get_instance(hass)", ) return hass_zc def new_zeroconf_init(self, *k, **kw): return zeroconf.Zeroconf.__new__ = new_zeroconf_new zeroconf.Zeroconf.__init__ = new_zeroconf_init def _report(what: str) -> None: """Report incorrect usage. Async friendly. """ integration_frame = None try: integration_frame = get_integration_frame(exclude_integrations={"zeroconf"}) except MissingIntegrationFrame: pass if not integration_frame: _LOGGER.warning( "Detected code that %s. Please report this issue.", what, stack_info=True ) return report_integration(what, integration_frame)