Start | Migration | Scanning Issues | Troubleshooting | FAQ | Acknowledgements

Table of Contents

Scanning does not find any devices

Please see this page on scanning issues.

No PIN code is displayed when I try to pair with AirPlay

First check that you’ve got Apple TV assigned to a “room” in the correct HomeKit home. Go to Settings, Airplay and Homekit, and make sure that “Room” has a valid value assigned. Then retry pairing.

If no screen is displayed with the PIN code, try navigating to the AirPlay settings menu on your Apple TV. The code should be visible there.

The exception “pyatv.exceptions.DeviceAuthenticationError: pair start failed” is thrown when I try to pair with AirPlay

Make sure you have Allow Access set to Anyone on the Same Network for AirPlay on your Apple TV. For details, see issue [#377].

How do I get additional logs that I can attach when creating an issue?

You can pass --debug to atvremote to get extensive debug logs. For more details, see the atvremote page.

I do not receive updates in my listeners, e.g. when media state changes

From version 0.6.0 of pyatv, weak references are kept to all listeners. This means that if a listener is not “reachable” from outside of pyatv, it will be garbage collected the next time the garbage collector runs. A typical situation when this would happen looks like this:

class DummyPushListener:
    @staticmethod
    def playstatus_update(updater, playstatus):
        pass

    @staticmethod
    def playstatus_error(updater, exception):
        pass

self.atv.push_updater.listener = DummyPushListener()
self.atv.push_updater.start()

In this case, no one else has a reference to the instance of DummyPushListener (other than pyatv), so it will be freed when the garbage collector runs (which can be at any given time). Changing the code into this would work better:

listener = DummyPushListener()
self.atv.push_updater.listener = listener
self.atv.push_updater.start()

Here a local reference is kept to the listener. Beware that the same issue will arise when listener goes out of scope, so make sure all your listeners live at least as long as they are used in pyatv.

← Scanning Issues | FAQ →