Finding Devices

Finding an Apple TV device on the network is as easy as looking for a particular Zeroconf/Bonjour service on the network. It announces various kinds if services, but the one pyatv is looking for _appletv-v2._tcp.local.. It is announced if home sharing is enabled and contains, amongst other things, the HSGID required when connecting to the device.

A typical entry as found by the python-zeroconf library might look like this (some of the data replaced):

ServiceInfo(type='_appletv-v2._tcp.local.', name='1111111111111111._appletv-v2._tcp.local.', address=b'\n\x00\n\x16', port=3689, weight=0, priority=0, server='AppleTV-2.local.', properties={b'DFID': b'2', b'PrVs': b'65538', b'hG': b'00000000-1125-ff3b-7f12-111111111111', b'Name': b'Apple\xc2\xa0TV', b'txtvers': b'1', b'atSV': b'65541', b'MiTPV': b'196611', b'EiTS': b'1', b'fs': b'2', b'MniT': b'167845888'})

When doing a scan, the information is extracted from these records and that is basically all you need. Any client that can list Bonjour services can be used, so dns-sd on macOS is another alternativ:

$ dns-sd -B _appletv-v2._tcp
Browsing for _appletv-v2._tcp
DATE: ---Sat 28 Jan 2017---
12:07:51.222  ...STARTING...
Timestamp     A/R    Flags  if Domain               Service Type         Instance Name
12:07:51.223  Add        2   4 local.               _appletv-v2._tcp.    1111111111111111

But you can of course also use atvremote, see this page.

Code Example

Discovering devices is as easy as using pyatv.scan_for_apple_tvs, which is an async call. A simple example might look like this:

import pyatv
import asyncio

@asyncio.coroutine
def discover(loop):
    atvs = yield from pyatv.scan_for_apple_tvs(timeout=5)

    # Devices are now in atvs
    print(atvs)

loop = asyncio.get_event_loop()
loop.run_until_complete(discover(loop))