Thanks for the analysis ![]()
In that case, the external integration shouldnât work even when they are on the same network?
Unless when you are on the same network it sends unicast requests and the explanation could hold up
Thanks for the analysis ![]()
In that case, the external integration shouldnât work even when they are on the same network?
Unless when you are on the same network it sends unicast requests and the explanation could hold up
Itâs strange that during the second scan, one fewer device is found when I unplug my Apple TV
[2026-08-16T18:35:13.529Z] [INFO] [apple-tv] Gladys captured 5 AirPlay announcement(s)
[2026-08-16T18:35:13.529Z] [INFO] [apple-tv] Verifying 5 candidate address(es) with pyatv
[2026-08-16T18:35:21.531Z] [INFO] [apple-tv] Found 0 Apple TV(s)
[2026-08-16T18:35:55.134Z] [INFO] [apple-tv] Scan requested
[2026-08-16T18:36:03.139Z] [INFO] [apple-tv] Gladys captured 4 AirPlay announcement(s)
[2026-08-16T18:36:03.139Z] [INFO] [apple-tv] Verifying 4 candidate address(es) with pyatv
[2026-08-16T18:36:11.141Z] [INFO] [apple-tv] Found 0 Apple TV(s)
Is there a way to have a debug mode to see which device it sees and potentially find out why it doesnât add them to the discovery? ![]()
Thanks, this test is very useful: the transition from 5 to 4 after unplugging the Apple TV confirms that Gladys sees its AirPlay announcement and retrieves its IP (at least I think so). The issue then occurs when pyatv attempts to complete the information with a direct mDNS request, which is ignored between subnets.
Version `1.1.0` of the integration is currently being built; it now details the name, host, IP, and port of each announcement/candidate in the logs. This will clearly confirm which address corresponds to the Apple TV, even if the network fix remains necessary to retrieve the other required services.
Thank you ![]()
Here is the result:
[2026-08-17T18:15:52.654Z] [INFO] [apple-tv] AirPlay announcement 3/5: {"name":"Chambre._airplay._tcp.local","host":"Chambre.local","addresses":["fe80::7:3db5:2499:xxx","fdfd:9ce7:d5fe:4961:c02:da41:da37:xxxx","192.168.xx.10","fdfd:9ce7:d5fe:4961:6:fda9:17a6:xxxx"],"ipv4":["192.168.xx.10"],"port":7000}
[2026-08-17T18:15:52.655Z] [INFO] [apple-tv] Candidate address 3/5: {"address":"192.168.xx.10","sources":["AirPlay announcement","manual configuration"]}
[2026-08-17T18:15:52.655Z] [INFO] [apple-tv] Verifying 5 candidate address(es) with pyatv
[2026-08-17T18:16:00.657Z] [WARN] [apple-tv] No candidate answered pyatv's direct mDNS query: 192.168.xx.12, 192.168.xx.9, 192.168.xx.10, 192.168.xx.7, 192.168.xx.8. On routed networks or separate VLANs, Apple devices normally ignore direct mDNS queries whose source is outside their local subnet.
[2026-08-17T18:16:00.658Z] [INFO] [apple-tv] Found 0 Apple TV(s)
Strange that we only see Chambre._airplay._tcp.local
And not Chambre._companion-link._tcp
Thanks for the feedback, the logs confirm the diagnosis: Gladys receives the AirPlay announcement and the correct IP, but the direct pyatv check gets no response between the VLANs.
The absence of _companion-link._tcp is currently normal: only _airplay._tcp is declared, and Gladys so far only scans the first mDNS service of an integration.
@pierre-gilles I proposed a fix on the Gladys side: PR #2951 that allows retrieving and merging all declared mDNS services.
@prohand In principle, if this change is integrated into Gladys, we can plan a new version of the Apple TV integration that will directly use these announcements instead of making another mDNS request from its container. The 1.1.0 improves the diagnosis, but inter-VLAN support will require this next version.
Perfect, thank you ![]()
Thanks, Iâve added my feedback ![]()
Thanks, I ran Claude on it ![]()
Hello @valentinhttr
Since the PR is merged, could you please look into releasing a new version? ![]()
Thanks
Hello, yes itâs planned but when I get back, probably next week ![]()
No problem ![]()
Thanks
Hello @prohand
I found some time to look, version 1.2.0 will be available in 5 minutes!
Let me know if it works this time, please.
Thanks ![]()
I just tested it and it finds 4 Apple TVs when I only have 2:

Here is the mapping of IPs and devices:
192.168.30.7 Apple HomePod Mini Entrée
192.168.30.8 Apple HomePod Mini Cuisine
192.168.30.9 Apple TV Salon
192.168.30.10 Apple TV Chambre
I should normally only have 2 (192.168.30.9 and 192.168.30.10)
Either the mDNS request forwarding works between my networks with Gladysâs correction and it ignores this field, or it does not take into account the « Manual IPv4 Addresses » field because I had only put 192.168.30.10 in this field:

Here are the logs:
[2026-09-01T18:42:59.359Z] [INFO] [apple-tv] Starting the Gladys Apple TV integration
[2026-09-01T18:42:59.366Z] [INFO] [apple-tv:pyatv] Starting the pyatv worker (/opt/pyatv/bin/python3 /app/src/pyatv_bridge.py)
[2026-09-01T18:42:59.632Z] [INFO] [gladys-sdk] connected to Gladys (http://172.30.0.1:80)
2026-09-01 20:43:00,237 INFO [pyatv-bridge] pyatv 0.18.0 bridge ready (storage: /data/pyatv.json)
[2026-09-01T18:43:07.646Z] [INFO] [apple-tv] 14 mDNS announcement(s) captured by Gladys, 5 device configuration(s) available without a direct query
[2026-09-01T18:43:15.657Z] [INFO] [apple-tv] 8 mDNS announcement(s) captured by Gladys, 3 device configuration(s) available without a direct query
[2026-09-01T18:47:09.705Z] [INFO] [apple-tv] Configuration updated
[2026-09-01T18:47:52.379Z] [INFO] [apple-tv] Scan requested
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] Gladys captured 13 mDNS announcement(s) across 3 service(s): _airplay._tcp.local, _companion-link._tcp.local, _raop._tcp.local
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 1/13: {"name":"Salon._airplay._tcp.local","service":"_airplay._tcp.local","host":"Salon.local","addresses":["fe80::403:b392:d53f:d2b1","192.168.30.7","fdfd:9ce7:d5fe:4961:6:fdf2:b5c0:fcb3","fdfd:9ce7:d5fe:4961:883:9e7e:929c:90df"],"ipv4":["192.168.30.7"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 2/13: {"name":"Salle TV._airplay._tcp.local","service":"_airplay._tcp.local","host":"Sonos-542A1BD83454.local","addresses":["192.168.30.12","fe80::562a:1bff:fed8:3454"],"ipv4":["192.168.30.12"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 3/13: {"name":"Salon (2)._airplay._tcp.local","service":"_airplay._tcp.local","host":"Salon-2.local","addresses":["fe80::1875:c834:3f5:7967","192.168.30.8","fdfd:9ce7:d5fe:4961:2:fded:e94a:ea67","fdfd:9ce7:d5fe:4961:1c30:ec0:9248:2524"],"ipv4":["192.168.30.8"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 4/13: {"name":"Salon (3)._airplay._tcp.local","service":"_airplay._tcp.local","host":"Salon-3.local","addresses":["fe80::1c2e:7d28:59b9:4fa6","192.168.30.9","fdfd:9ce7:d5fe:4961:7:fdbc:e949:be74","fdfd:9ce7:d5fe:4961:148d:d648:7633:d52d"],"ipv4":["192.168.30.9"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 5/13: {"name":"Chambre._airplay._tcp.local","service":"_airplay._tcp.local","host":"Chambre.local","addresses":["fdfd:9ce7:d5fe:4961:c02:da41:da37:6ccb","fe80::8a3:1cd5:2be8:5d1d","192.168.30.10","fdfd:9ce7:d5fe:4961:9:fda9:17a6:dc08"],"ipv4":["192.168.30.10"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 6/13: {"name":"Salon._companion-link._tcp.local","service":"_companion-link._tcp.local","host":"Salon.local","addresses":["fe80::403:b392:d53f:d2b1","192.168.30.7","fdfd:9ce7:d5fe:4961:6:fdf2:b5c0:fcb3","fdfd:9ce7:d5fe:4961:883:9e7e:929c:90df"],"ipv4":["192.168.30.7"],"port":49153}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 7/13: {"name":"Salon (2)._companion-link._tcp.local","service":"_companion-link._tcp.local","host":"Salon-2.local","addresses":["fe80::1875:c834:3f5:7967","192.168.30.8","fdfd:9ce7:d5fe:4961:2:fded:e94a:ea67","fdfd:9ce7:d5fe:4961:1c30:ec0:9248:2524"],"ipv4":["192.168.30.8"],"port":49153}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 8/13: {"name":"Salon (3)._companion-link._tcp.local","service":"_companion-link._tcp.local","host":"Salon-3.local","addresses":["fe80::1c2e:7d28:59b9:4fa6","192.168.30.9","fdfd:9ce7:d5fe:4961:7:fdbc:e949:be74","fdfd:9ce7:d5fe:4961:148d:d648:7633:d52d"],"ipv4":["192.168.30.9"],"port":49153}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 9/13: {"name":"Chambre._companion-link._tcp.local","service":"_companion-link._tcp.local","host":"Chambre.local","addresses":["fdfd:9ce7:d5fe:4961:c02:da41:da37:6ccb","fe80::8a3:1cd5:2be8:5d1d","192.168.30.10","fdfd:9ce7:d5fe:4961:9:fda9:17a6:dc08"],"ipv4":["192.168.30.10"],"port":49153}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 10/13: {"name":"542A1BD83454@Salle TV._raop._tcp.local","service":"_raop._tcp.local","host":"Sonos-542A1BD83454.local","addresses":["192.168.30.12","fe80::562a:1bff:fed8:3454"],"ipv4":["192.168.30.12"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 11/13: {"name":"A6C0D2CF8B73@Salon (2)._raop._tcp.local","service":"_raop._tcp.local","host":"Salon-2.local","addresses":["fe80::1875:c834:3f5:7967","192.168.30.8","fdfd:9ce7:d5fe:4961:2:fded:e94a:ea67","fdfd:9ce7:d5fe:4961:1c30:ec0:9248:2524"],"ipv4":["192.168.30.8"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 12/13: {"name":"8E4D52BC66DD@Salon (3)._raop._tcp.local","service":"_raop._tcp.local","host":"Salon-3.local","addresses":["fe80::1c2e:7d28:59b9:4fa6","192.168.30.9","fdfd:9ce7:d5fe:4961:7:fdbc:e949:be74","fdfd:9ce7:d5fe:4961:148d:d648:7633:d52d"],"ipv4":["192.168.30.9"],"port":7000}
[2026-09-01T18:48:00.386Z] [INFO] [apple-tv] mDNS announcement 13/13: {"name":"DE0D0144E41D@Chambre._raop._tcp.local","service":"_raop._tcp.local","host":"Chambre.local","addresses":["fdfd:9ce7:d5fe:4961:c02:da41:da37:6ccb","fe80::8a3:1cd5:2be8:5d1d","192.168.30.10","fdfd:9ce7:d5fe:4961:9:fda9:17a6:dc08"],"ipv4":["192.168.30.10"],"port":7000}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Candidate address 1/5: {"address":"192.168.30.7","sources":["AirPlay announcement"]}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Candidate address 2/5: {"address":"192.168.30.12","sources":["AirPlay announcement"]}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Candidate address 3/5: {"address":"192.168.30.8","sources":["AirPlay announcement"]}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Candidate address 4/5: {"address":"192.168.30.9","sources":["AirPlay announcement"]}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Candidate address 5/5: {"address":"192.168.30.10","sources":["AirPlay announcement","manual configuration"]}
[2026-09-01T18:48:00.387Z] [INFO] [apple-tv] Verifying 5 candidate address(es) with pyatv
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] pyatv response 1/5: {"name":"Salon","address":"192.168.30.7","model":"HomePod Mini","operating_system":"tvos","is_apple_tv":true,"source":"announced"}
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] pyatv response 2/5: {"name":"Salle TV","address":"192.168.30.12","model":"Beam","operating_system":"unknown","is_apple_tv":false,"source":"announced"}
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] pyatv response 3/5: {"name":"Salon (2)","address":"192.168.30.8","model":"HomePod Mini","operating_system":"tvos","is_apple_tv":true,"source":"announced"}
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] pyatv response 4/5: {"name":"Salon (3)","address":"192.168.30.9","model":"Apple TV 4K (gen 3)","operating_system":"tvos","is_apple_tv":true,"source":"announced"}
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] pyatv response 5/5: {"name":"Chambre","address":"192.168.30.10","model":"Apple TV 4K (gen 3)","operating_system":"tvos","is_apple_tv":true,"source":"announced"}
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] 5 device(s) were rebuilt from the announcements Gladys captured, because they did not answer a direct query: Salon (192.168.30.7), Salle TV (192.168.30.12), Salon (2) (192.168.30.8), Salon (3) (192.168.30.9), Chambre (192.168.30.10). This is the expected path when Gladys and the Apple TV sit on different subnets.
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] 5 candidate address(es) did not answer a direct query: 192.168.30.7, 192.168.30.12, 192.168.30.8, 192.168.30.9, 192.168.30.10
[2026-09-01T18:48:08.391Z] [INFO] [apple-tv] Found 4 Apple TV(s)
Thanks @prohand, version 1.2.1 is available, it fixes the issue.
Your two HomePod minis were indeed listed as Apple TVs. The reason is
a bit sneaky: a HomePod runs on tvOS and advertises exactly the same
AirPlay and Companion services as an Apple TV. I was filtering on the
operating system⊠which is therefore « tvOS » for both. You can see this in your
logs, by the way:
{"name":"Salon","model":"HomePod Mini","operating_system":"tvos","is_apple_tv":true}
I now filter on the hardware model. I retested your exact configuration
(2 HomePod minis, 2 Apple TV 4K, the Sonos Beam): we correctly get 2 Apple TVs,
the Beam, and the HomePods are excluded.
For the « Manual IPv4 Addresses » field: it was indeed taken into account, your log
shows it: 192.168.30.10 appears there with both sources:
Candidate address 5/5: {"address":"192.168.30.10","sources":["AirPlay announcement","manual configuration"]}
This field adds addresses to those Gladys has captured, it does not replace
them: it is used to reach a device whose announcements do not reach Gladys, not to
choose which one to keep. In your case, it was useless in the good sense of the word: your
mDNS relay between your VLANs works, all 5 addresses came from the announcements. You can
clear the field. I have reworded its description, your reading was legitimate.
Can you update and restart a scan please? You should only see Salon (3) and Chambre. And if
pairing works well across your VLANs, I would be very interested to know: this is the use case
for version 1.2.0 and you are the first to test it in real life.
Thanks, thatâs okay for me ![]()