{"record":{"id":"f13ccd9b5a27e6c6","repo":"home-assistant/core","slug":"protocol-s-missing-protocols-str-not-yet-found","errorCode":null,"errorMessage":"Protocol(s) {missing_protocols_str} not yet found for {name}, waiting for discovery.","messagePattern":"Protocol\\(s\\) (.+?) not yet found for (.+?), waiting for discovery\\.","errorType":"exception","errorClass":"ConfigEntryNotReady","httpStatus":null,"severity":"warning","filePath":"homeassistant/components/apple_tv/__init__.py","lineNumber":327,"sourceCode":"        return None\n\n    async def _connect(self, conf: AppleTV, raise_missing_credentials: bool) -> None:\n        \"\"\"Connect to device.\"\"\"\n        config_entry = self.config_entry\n        credentials: dict[int, str | None] = config_entry.data[CONF_CREDENTIALS]\n        name: str = config_entry.data[CONF_NAME]\n        missing_protocols = []\n        for protocol_int, creds in credentials.items():\n            protocol = Protocol(int(protocol_int))\n            if conf.get_service(protocol) is not None:\n                conf.set_credentials(protocol, creds)  # type: ignore[arg-type]\n            else:\n                missing_protocols.append(protocol.name)\n\n        if missing_protocols:\n            missing_protocols_str = \", \".join(missing_protocols)\n            if raise_missing_credentials:\n                raise ConfigEntryNotReady(\n                    f\"Protocol(s) {missing_protocols_str} not yet found for {name},\"\n                    \" waiting for discovery.\"\n                )\n            _LOGGER.debug(\n                \"Protocol(s) %s not yet found for %s, trying later\",\n                missing_protocols_str,\n                name,\n            )\n            return\n\n        _LOGGER.debug(\"Connecting to device %s\", self.config_entry.data[CONF_NAME])\n        session = async_get_clientsession(self.hass)\n        self.atv = await connect(conf, self.hass.loop, session=session)\n        self.atv.listener = self\n\n        self._dispatch_send(SIGNAL_CONNECTED, self.atv)\n        self._address_updated(str(conf.address))\n","sourceCodeStart":309,"sourceCodeEnd":345,"githubUrl":"https://github.com/home-assistant/core/blob/58a3fdb3ea0538617f0a07efcfba6294de64fd59/homeassistant/components/apple_tv/__init__.py#L309-L345","documentation":"ConfigEntryNotReady raised when the config entry stores credentials for protocols (e.g. Companion, AirPlay) that were not yet found on the device at the time of connection setup. Credentials in the entry are keyed by protocol; if the device's discovered services (conf.get_service(protocol)) do not include one of them and raise_missing_credentials is set, setup aborts as not-ready so discovery can run again later.","triggerScenarios":"async_first_connect -> connect path where entry.data credentials include a protocol whose service is missing from the pyatv conf: device discovered via one interface but credentials captured on another, mDNS records incomplete, or the Apple TV exposes the protocol only intermittently (sleep/Bonjour sleep proxy).","commonSituations":"Mixed wired/wireless Apple TV presence in mDNS; sleep proxy advertising stale records; entry migrated from an older apple_tv integration version that stored credentials for protocols the device no longer exposes; VLANs where only some service types are forwarded.","solutions":["Wake the Apple TV so it advertises all services, then reload the integration (discovery will retry and complete)","Verify 'atvremote --scan' shows all expected services (MAP, Companion, AirPlay/RAOP) from the HA host; fix mDNS reflection/repeat across VLANs if some are missing","Reconfigure the integration to re-discover the device and refresh the set of protocols"],"exampleFix":null,"handlingStrategy":"retry","validationCode":null,"typeGuard":null,"tryCatchPattern":null,"preventionTips":["Wake the device before reload so all Bonjour services are advertised","Fix mDNS reflector/repeater config across VLANs","Re-run discovery after network changes instead of forcing setup"],"tags":["home-assistant","apple-tv","discovery","mdns","retry"],"backgroundTag":null,"analyzedSha":"58a3fdb3ea0538617f0a07efcfba6294de64fd59","analyzedAt":"2026-08-14T20:54:38.818Z","schemaVersion":2},"datasetVersion":"2026-08-15T22:17:37.221Z"}