Intégration externe - Apple TV

Bonjour à tous,

Après plus de dix ans à suivre ce projet (Gladys) sans vraiment prendre le temps de l’installer et de le configurer, me voilà enfin de retour avec une première intégration externe : Apple TV.

Elle s’appuie sur pyatv en Python (comme HA) et node-pyatv côté Node.js (wrapper).

Disclaimer : L’intégration a été fortement développée par GPT 5.6 Sol (Codex)

Bravo pour l’intégration, ça m’intéresse parce que j’ai une Apple TV chez moi :grin: je vais tester !

J’ai testé et j’ai cette erreur :

Codex est peut-être moins rigoureux que Claude aha, moi Claude pense toujours à faire tourner le validateur avant de publier :

La commande :

npx github:GladysAssistant/integration-store .

Aie ! Je regarde ça un peu plus tard… c’est étrange car j’ai fait une installation hier soir et ça fonctionnait :o

L’erreur c’est:

{
    "status": 422,
    "code": "UNPROCESSABLE_ENTITY",
    "properties": "actions[1].depends_on: unknown field ; actions[2].depends_on: unknown field"
}

Je vais rajouter l’erreur dans l’interface comme ça c’est plus facile à débug :slight_smile:

Nouvelle release dispo, réessaye et dis-moi s’il faut corriger quelque chose :slight_smile:

Cette fois-ci j’arrive à installer mais j’ai une erreur au scan :

J’ai demandé à Claude et c’est bien un bug de l’intégration, pas de Gladys :

[2026-08-03T12:51:38.091Z] [INFO] [apple-tv] Starting the Gladys Apple TV integration
[2026-08-03T12:51:38.288Z] [INFO] [gladys-sdk] connected to Gladys (http://172.30.0.1:80)
[2026-08-03T12:51:41.621Z] [INFO] [apple-tv] Starting mediated Apple TV discovery
[2026-08-03T12:51:42.339Z] [INFO] [apple-tv] Starting mediated Apple TV discovery
[2026-08-03T12:51:42.356Z] [ERROR] [apple-tv] Mediated mDNS discovery failed GladysApiError: Conflict
    at HttpClient.request (/app/node_modules/@gladysassistant/integration-sdk/lib/http-client.js:49:13)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async AppleTvIntegration.scan (file:///app/src/integration.js:76:29)
    at async GladysIntegration._runHandler (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1166:7)
    at async GladysIntegration._handleMessage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1022:9) {
  status: 409,
  code: 'CONFLICT'
}
[2026-08-03T12:51:50.977Z] [ERROR] [apple-tv] Apple TV probe failed for 3 candidate host(s) Error: Unable to find any devices, but received 1 error: [
  {
    "result": "failure",
    "datetime": "2026-08-03T14:51:50.763359+02:00",
    "exception": "Expected 4 octets in 'fd33:5f93:3f40:49cd:3:fd3b:c82a:7ced'",
    "stacktrace": "Traceback (most recent call last):\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 413, in appstart\n    args.output(await _handle_command(args, abort_sem, storage, loop)),\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 285, in _handle_command\n    return await _scan_devices(loop, storage, args.scan_hosts)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 231, in _scan_devices\n    for atv in await scan(loop, hosts=hosts, storage=storage):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/__init__.py\", line 68, in scan\n    scanner = UnicastMdnsScanner([IPv4Address(host) for host in hosts], loop)\n                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/__init__.py\", line 68, in <listcomp>\n    scanner = UnicastMdnsScanner([IPv4Address(host) for host in hosts], loop)\n                                  ^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/ipaddress.py\", line 1319, in __init__\n    self._ip = self._ip_int_from_string(addr_str)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/ipaddress.py\", line 1206, in _ip_int_from_string\n    raise AddressValueError(\"Expected 4 octets in %r\" % ip_str)\nipaddress.AddressValueError: Expected 4 octets in 'fd33:5f93:3f40:49cd:3:fd3b:c82a:7ced'\n"
  }
]
    at e.find (file:///app/node_modules/@sebbo2002/node-pyatv/dist/lib-DynU3Xla.mjs:7:8365)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async AppleTvIntegration.scan (file:///app/src/integration.js:95:15)
    at async GladysIntegration._runHandler (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1166:7)
    at async GladysIntegration._handleMessage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1022:9)
[2026-08-03T12:51:58.718Z] [INFO] [apple-tv] Starting mediated Apple TV discovery
[2026-08-03T12:52:07.997Z] [ERROR] [apple-tv] Apple TV probe failed for 3 candidate host(s) Error: Unable to find any devices, but received 1 error: [
  {
    "result": "failure",
    "datetime": "2026-08-03T14:52:07.795239+02:00",
    "exception": "Expected 4 octets in 'fd33:5f93:3f40:49cd:3:fd3b:c82a:7ced'",
    "stacktrace": "Traceback (most recent call last):\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 413, in appstart\n    args.output(await _handle_command(args, abort_sem, storage, loop)),\n                ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 285, in _handle_command\n    return await _scan_devices(loop, storage, args.scan_hosts)\n           ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/scripts/atvscript.py\", line 231, in _scan_devices\n    for atv in await scan(loop, hosts=hosts, storage=storage):\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/__init__.py\", line 68, in scan\n    scanner = UnicastMdnsScanner([IPv4Address(host) for host in hosts], loop)\n                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/opt/pyatv/lib/python3.11/site-packages/pyatv/__init__.py\", line 68, in <listcomp>\n    scanner = UnicastMdnsScanner([IPv4Address(host) for host in hosts], loop)\n                                  ^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/ipaddress.py\", line 1319, in __init__\n    self._ip = self._ip_int_from_string(addr_str)\n               ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^\n  File \"/usr/lib/python3.11/ipaddress.py\", line 1206, in _ip_int_from_string\n    raise AddressValueError(\"Expected 4 octets in %r\" % ip_str)\nipaddress.AddressValueError: Expected 4 octets in 'fd33:5f93:3f40:49cd:3:fd3b:c82a:7ced'\n"
  }
]
    at e.find (file:///app/node_modules/@sebbo2002/node-pyatv/dist/lib-DynU3Xla.mjs:7:8365)
    at process.processTicksAndRejections (node:internal/process/task_queues:104:5)
    at async AppleTvIntegration.scan (file:///app/src/integration.js:95:15)
    at async GladysIntegration._runHandler (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1166:7)
    at async GladysIntegration._handleMessage (/app/node_modules/@gladysassistant/integration-sdk/lib/gladys-integration.js:1022:9)

Décidément :joy: ! Je viens de faire une nouvelle release :+1: (en cours…)
Si ça ne fonctionne toujours pas, en attendant, tu peux déjà mettre l’IP de ton apple TV directement dans l’onglet config.

On avance, mais cette fois-ci j’ai une autre erreur :

Le selector pourrait-être un peu plus unique que ça ^^

Il a des progrès à faire Codex :joy:

J’ai peut être été un peu « radin » sur le raisonnement utilisé haha
Mais c’est vrai qu’il s’est pas embêté pour le coup :joy:

Nouvelle release disponible, je lui ai demandé de s’auto-review et de corriger d’autres potentiels problèmes du style !

Hésite pas à me dire si tu rencontres d’autres soucis si besoin

J’ai pu ajouter l’Apple TV cette fois-ci :slight_smile:

Par contre, le nom de l’appareil pourrait contenir « Apple TV », parce que là c’est juste le nom de la pièce (ça doit être le nom donné par Apple à mon Apple TV), et donc c’est pas très lisible :

Sinon, j’ai essayé d’allumer l’Apple TV avec le type « Power », mais ça ne fait rien :

Les logs rien de spécial :

[2026-08-03T15:22:33.784Z] [INFO] [apple-tv] Starting the Gladys Apple TV integration
[2026-08-03T15:22:33.982Z] [INFO] [gladys-sdk] connected to Gladys (http://172.30.0.1:80)
[2026-08-03T15:22:39.142Z] [INFO] [apple-tv] Starting mediated Apple TV discovery
[2026-08-03T15:22:48.502Z] [INFO] [apple-tv] Discovery completed: 1 Apple TV device(s) from 1 candidate host(s)
[2026-08-03T15:24:50.959Z] [WARN] [apple-tv] Apple TV real-time updates unavailable for Salon: Got pyatv Error: power_state is not supported; using polling
[2026-08-03T15:24:55.556Z] [WARN] [apple-tv] Apple TV real-time updates unavailable for Salon: Got pyatv Error: power_state is not supported; using polling

Ça marche chez toi ?

Attention, ton intégration a été listée sur le store des intégrations alors qu’elle n’est pas encore fonctionnelle. L’idée est de ne la publier qu’une fois qu’elle est opérationnelle. :wink:

En attendant que tout fonctionne, tu peux retirer le topic GitHub. Ça évitera que des utilisateurs la découvrent trop tôt et soient déçus lors de leurs tests. :slightly_smiling_face:

Oups… j’ai retiré ! Codex a mis le tag sans me prévenir ! Désolé

Je regarde pour corriger, mais oui Power fonctionnait chez moi hier soir.