mirror of
https://github.com/home-assistant/core.git
synced 2025-07-23 21:27:38 +00:00
Use zeroconf for scanning in apple_tv (#64528)
This commit is contained in:
parent
d47a25856b
commit
7112c5b52a
@ -7,6 +7,7 @@ from pyatv import connect, exceptions, scan
|
|||||||
from pyatv.const import DeviceModel, Protocol
|
from pyatv.const import DeviceModel, Protocol
|
||||||
from pyatv.convert import model_str
|
from pyatv.convert import model_str
|
||||||
|
|
||||||
|
from homeassistant.components import zeroconf
|
||||||
from homeassistant.config_entries import ConfigEntry
|
from homeassistant.config_entries import ConfigEntry
|
||||||
from homeassistant.const import (
|
from homeassistant.const import (
|
||||||
ATTR_CONNECTIONS,
|
ATTR_CONNECTIONS,
|
||||||
@ -269,8 +270,13 @@ class AppleTVManager:
|
|||||||
}
|
}
|
||||||
|
|
||||||
_LOGGER.debug("Discovering device %s", self.config_entry.title)
|
_LOGGER.debug("Discovering device %s", self.config_entry.title)
|
||||||
|
aiozc = await zeroconf.async_get_async_instance(self.hass)
|
||||||
atvs = await scan(
|
atvs = await scan(
|
||||||
self.hass.loop, identifier=identifiers, protocol=protocols, hosts=[address]
|
self.hass.loop,
|
||||||
|
identifier=identifiers,
|
||||||
|
protocol=protocols,
|
||||||
|
hosts=[address],
|
||||||
|
aiozc=aiozc,
|
||||||
)
|
)
|
||||||
if atvs:
|
if atvs:
|
||||||
return atvs[0]
|
return atvs[0]
|
||||||
|
@ -33,7 +33,7 @@ DEFAULT_START_OFF = False
|
|||||||
DISCOVERY_AGGREGATION_TIME = 15 # seconds
|
DISCOVERY_AGGREGATION_TIME = 15 # seconds
|
||||||
|
|
||||||
|
|
||||||
async def device_scan(identifier, loop):
|
async def device_scan(hass, identifier, loop):
|
||||||
"""Scan for a specific device using identifier as filter."""
|
"""Scan for a specific device using identifier as filter."""
|
||||||
|
|
||||||
def _filter_device(dev):
|
def _filter_device(dev):
|
||||||
@ -53,7 +53,8 @@ async def device_scan(identifier, loop):
|
|||||||
|
|
||||||
# If we have an address, only probe that address to avoid
|
# If we have an address, only probe that address to avoid
|
||||||
# broadcast traffic on the network
|
# broadcast traffic on the network
|
||||||
scan_result = await scan(loop, timeout=3, hosts=_host_filter())
|
aiozc = await zeroconf.async_get_async_instance(hass)
|
||||||
|
scan_result = await scan(loop, timeout=3, hosts=_host_filter(), aiozc=aiozc)
|
||||||
matches = [atv for atv in scan_result if _filter_device(atv)]
|
matches = [atv for atv in scan_result if _filter_device(atv)]
|
||||||
|
|
||||||
if matches:
|
if matches:
|
||||||
@ -180,6 +181,7 @@ class AppleTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
self._abort_if_unique_id_configured(updates={CONF_ADDRESS: host})
|
self._abort_if_unique_id_configured(updates={CONF_ADDRESS: host})
|
||||||
|
|
||||||
self._async_abort_entries_match({CONF_ADDRESS: host})
|
self._async_abort_entries_match({CONF_ADDRESS: host})
|
||||||
|
|
||||||
await self._async_aggregate_discoveries(host, unique_id)
|
await self._async_aggregate_discoveries(host, unique_id)
|
||||||
# Scan for the device in order to extract _all_ unique identifiers assigned to
|
# Scan for the device in order to extract _all_ unique identifiers assigned to
|
||||||
# it. Not doing it like this will yield multiple config flows for the same
|
# it. Not doing it like this will yield multiple config flows for the same
|
||||||
@ -279,7 +281,7 @@ class AppleTVConfigFlow(config_entries.ConfigFlow, domain=DOMAIN):
|
|||||||
async def async_find_device(self, allow_exist=False):
|
async def async_find_device(self, allow_exist=False):
|
||||||
"""Scan for the selected device to discover services."""
|
"""Scan for the selected device to discover services."""
|
||||||
self.atv, self.atv_identifiers = await device_scan(
|
self.atv, self.atv_identifiers = await device_scan(
|
||||||
self.scan_filter, self.hass.loop
|
self.hass, self.scan_filter, self.hass.loop
|
||||||
)
|
)
|
||||||
if not self.atv:
|
if not self.atv:
|
||||||
raise DeviceNotFound()
|
raise DeviceNotFound()
|
||||||
|
@ -3,9 +3,13 @@
|
|||||||
"name": "Apple TV",
|
"name": "Apple TV",
|
||||||
"config_flow": true,
|
"config_flow": true,
|
||||||
"documentation": "https://www.home-assistant.io/integrations/apple_tv",
|
"documentation": "https://www.home-assistant.io/integrations/apple_tv",
|
||||||
"requirements": ["pyatv==0.9.8"],
|
"requirements": ["pyatv==0.10.0"],
|
||||||
|
"dependencies": ["zeroconf"],
|
||||||
"zeroconf": [
|
"zeroconf": [
|
||||||
"_mediaremotetv._tcp.local.",
|
"_mediaremotetv._tcp.local.",
|
||||||
|
"_companion-link._tcp.local.",
|
||||||
|
"_airport._tcp.local.",
|
||||||
|
"_sleep-proxy._udp.local.",
|
||||||
"_touch-able._tcp.local.",
|
"_touch-able._tcp.local.",
|
||||||
"_appletv-v2._tcp.local.",
|
"_appletv-v2._tcp.local.",
|
||||||
"_hscp._tcp.local.",
|
"_hscp._tcp.local.",
|
||||||
|
@ -37,6 +37,11 @@ ZEROCONF = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"_airport._tcp.local.": [
|
||||||
|
{
|
||||||
|
"domain": "apple_tv"
|
||||||
|
}
|
||||||
|
],
|
||||||
"_api._udp.local.": [
|
"_api._udp.local.": [
|
||||||
{
|
{
|
||||||
"domain": "guardian"
|
"domain": "guardian"
|
||||||
@ -78,6 +83,11 @@ ZEROCONF = {
|
|||||||
"domain": "bond"
|
"domain": "bond"
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"_companion-link._tcp.local.": [
|
||||||
|
{
|
||||||
|
"domain": "apple_tv"
|
||||||
|
}
|
||||||
|
],
|
||||||
"_daap._tcp.local.": [
|
"_daap._tcp.local.": [
|
||||||
{
|
{
|
||||||
"domain": "forked_daapd"
|
"domain": "forked_daapd"
|
||||||
@ -302,6 +312,11 @@ ZEROCONF = {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
|
"_sleep-proxy._udp.local.": [
|
||||||
|
{
|
||||||
|
"domain": "apple_tv"
|
||||||
|
}
|
||||||
|
],
|
||||||
"_sonos._tcp.local.": [
|
"_sonos._tcp.local.": [
|
||||||
{
|
{
|
||||||
"domain": "sonos"
|
"domain": "sonos"
|
||||||
|
@ -1401,7 +1401,7 @@ pyatmo==6.2.2
|
|||||||
pyatome==0.1.1
|
pyatome==0.1.1
|
||||||
|
|
||||||
# homeassistant.components.apple_tv
|
# homeassistant.components.apple_tv
|
||||||
pyatv==0.9.8
|
pyatv==0.10.0
|
||||||
|
|
||||||
# homeassistant.components.aussie_broadband
|
# homeassistant.components.aussie_broadband
|
||||||
pyaussiebb==0.0.9
|
pyaussiebb==0.0.9
|
||||||
|
@ -875,7 +875,7 @@ pyatag==0.3.5.3
|
|||||||
pyatmo==6.2.2
|
pyatmo==6.2.2
|
||||||
|
|
||||||
# homeassistant.components.apple_tv
|
# homeassistant.components.apple_tv
|
||||||
pyatv==0.9.8
|
pyatv==0.10.0
|
||||||
|
|
||||||
# homeassistant.components.aussie_broadband
|
# homeassistant.components.aussie_broadband
|
||||||
pyaussiebb==0.0.9
|
pyaussiebb==0.0.9
|
||||||
|
@ -15,7 +15,9 @@ def mock_scan_fixture():
|
|||||||
"""Mock pyatv.scan."""
|
"""Mock pyatv.scan."""
|
||||||
with patch("homeassistant.components.apple_tv.config_flow.scan") as mock_scan:
|
with patch("homeassistant.components.apple_tv.config_flow.scan") as mock_scan:
|
||||||
|
|
||||||
async def _scan(loop, timeout=5, identifier=None, protocol=None, hosts=None):
|
async def _scan(
|
||||||
|
loop, timeout=5, identifier=None, protocol=None, hosts=None, aiozc=None
|
||||||
|
):
|
||||||
if not mock_scan.hosts:
|
if not mock_scan.hosts:
|
||||||
mock_scan.hosts = hosts
|
mock_scan.hosts = hosts
|
||||||
return mock_scan.result
|
return mock_scan.result
|
||||||
|
Loading…
x
Reference in New Issue
Block a user