Fire Stick TV: Certaines sources ne fonctionnent pas

Bonjour,

Je ne sais pas si d’autres personnes sont ou ont été dans le même cas que moi mais je suis actuellement en train d’intégrer mon Fire TV Stick 4K MAX à Home Assistant. L’intégration proposé par Home Assistant via ADB (Android Debug Bridge) n’est pas folle mais on fait avec. Mais mon problème est tout autre. J’ai créer un input de type select ou je liste les différentes applications que je souhaite controller via HA. L’application sélectionnée dans la liste envoi donc une commande à mon Fire Stick qui s’occupe de me démarrer la dite application sur l’écran TV. Jusque là tout va bien mais j’ai testé Disney+, Netflix, le launcher (écran d’accueil). Ca fonctionne nikel ! En revanche, rien ne se passe quand je séléctionne Prime Vidéo ou MyCanal.

Je suppose que le problème vient de l’id de l’app qui est obsolète et je ne sais pas comment trouver le nouveau pour ces 2 apps. Une recherche sur internet ne m’a pas permis de trouver les ids (si c’est bien cela le problème). Donc pour le moment le contrôle de Prime Video et MyCANAL à distance c’est pas possible.

action: media_player.select_source
metadata: {}
data:
  source: |-
    {% set mapper = {
      'Launcher': 'com.amazon.tv.launcher',
       'Netflix': 'com.netflix.ninja',
       'Disney+': 'com.disney.disneyplus',
       'myCANAL': 'com.canal.android.canal',
       'Prime Video': 'com.amazon.avod.thirdpartyclient'
    } %}
    {{ mapper.get(option) }}
target:
  device_id: media_player.fire_tv_4k_max

Pour Prime Video j’ai également essayé com.amazon.amazonvideo.livingroom mais ça n’a pas non plus fonctionné. Pour myCANAL je n’ai rien trouvé non plus en source alternative :man_shrugging:

Salut,
tu devrais voir le ID de l’application lancer sur ton entité media_player.fire_tv_4k_max.
Regarde dans outils de dev, onglet état.
Lance l’application sur ton fire stick TV et tu devrais voir le ID.

Merci pour l’astuce. Malheureusement ça ne semble pas régler le problème. Pour myCANAL c’est indiqué app_id: com.canal.android.canal mais c’est ce que j’avais déjà renseigné et ça ne fonctionne pas. Pour Amazon c’est indiqué app_id: com.amazon.firebat et là aussi ça ne fonctionne pas. Pas de bascule vers les applications myCANAL et Prime Video sur le Fire Stick.

C’est quand même le comble que l’intégration ne puisse pas piloter l’application maitre de la clé :man_shrugging:

Je ne pourrais pas plus t’aider. Tu sais déjà comment récupérer les ID des applications lancer :wink:

Bon du coup j’ai essayé de faire autrement car en parcourant divers forum, je ne suis pas le seul à avoir ce problème avec certaines app du Fire TV qui ne peuvent pas être appelées via leur id. Donc la solution est d’envoyer directement la commande ADB complète au Fire TV (Android Debug Bridge - Home Assistant) qui fourni aussi des clés de commandes (POWER, SLEEP, HOME) pouvant être directement utilisées telles quelles.

J’ai ainsi crée 3 input helpers. L’un qui stock l’id des app, l’autre qui stocke des commandes ADB. Et le 3ème c’est un input de type select qui représente en quelques sortes les boutons de ma télécommande qui fera le mapping avec les 2 autres inputs. Quand je choisi une option dans ce select, ça met à jour la valeur, soit de l’input qui stock les id, soit de l’input qui stock les commandes. Mieux vaut une image que des maux, sans jeu de mots :

L’input select :



Et le yaml associé qui donne l’action effectué en fonction de l’option choisi dans la liste déroulante qui détermine si c’est une commande ADB qu’on souhaite envoyée ou juste transmettre l’id de l’app à lancer :

alias: On envoi ID de application à lancer ou une commande ADB
choose:
  - alias: App ID
    conditions:
      - alias: SI ID application fournie
        condition: template
        value_template: >-
          {{ states('sensor.adb_appid') if has_value('sensor.adb_appid') else
          None }}
    sequence:
      - action: media_player.select_source
        data:
          source: |-
            {% set value = states('sensor.adb_appid') %}
            Netflix
        metadata: {}
        target:
          device_id: 1208b1c43ad320e98422de2df3777949
  - alias: Commande ADB
    conditions:
      - alias: SI commande ADB fournie
        condition: template
        value_template: >-
          {{ states('sensor.adb_commandes') if has_value('sensor.adb_commandes')
          else None }}
    sequence:
      - action: androidtv.adb_command
        data:
          command: |-
            {% set value = states('sensor.adb_commandes') %}
            {{ value }}
        metadata: {}
        target:
          device_id: 1208b1c43ad320e98422de2df3777949

Et mes 2 inputs qui font le mapping avec les valeurs du select:

l’input qui stocke les id des apps : (sensor.adb_appid)

{% set mapper = {
  'Launcher': 'com.amazon.tv.launcher',
  'Netflix': 'com.netflix.ninja',
  'Disney+': 'com.disney.disneyplus',
  'Prime Video': 'com.amazon.firebat',
  'myCANAL': 'com.canal.android.canal',
} %}
{% set value = states('select.fire_tv_remote_control_chambre_aurore') %}
{{ mapper[value] if value in mapper else None }}

l’input qui stocke les commandes ADB (sensor.adb_commandes)

{% set mapper = {
  'CMD:PowerOn': 'POWER',
  'CMD:Home': 'HOME',
  'CMD:Sleep': 'SLEEP',
} %}
{% set value = states('select.fire_tv_remote_control_chambre_aurore') %}
{{ mapper[value] if value in mapper else None }}

Le test :

  1. Dans l’input de type select je sélectionne Netflix
  2. l’input sensor.adb_appid se met à jour et prend la valeur com.netflix.ninja. C’est cette valeur qui est ensuite récupéré dans l’action du select pour indiquer la source à transmettre au Fire TV.

Autre test :

  1. Dans l’input de type select je sélectionne CMD:Home
  2. l’input sensor.adb_commandes se met à jour et prend la valeur POWER. C’est cette valeur qui est ensuite récupéré dans l’action du select pour indiquer la commande ADB à transmettre au Fire TV.

Dans ces 2 exemples ça ne fonctionne pas. Les 2 input sensor.adb_appid et sensor.adb_commandes ne se mettent pas à jour quand je change le select. J’ai l’impression que le problème se situe dés le départ dans le modèle de l’état du select (voir image 2 ci dessus). Comme si les 2 conditions has_value() ne retournaient pas true. Ce qui devrait être le cas mais je dois passer à côté de quelque chose.

Dans une carte télécommande j’ai ça et cela fonctionne :
Je ne sais plus où j’avais trouvé cette carte:

- type: picture
        image: >-
          https://upload.wikimedia.org/wikipedia/commons/thumb/1/11/Amazon_Prime_Video_logo.svg/450px-Amazon_Prime_Video_logo.svg.png
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://app.primevideo.com
          target:
            entity_id: remote.mibox3
        hold_action:
          action: none

Pour Canal ça ne fonctionne plus…

      - type: button
        icon: mdi:alpha-c-box
        name: My Canal
        tap_action:
          action: call-service
          service: remote.turn_on
          data:
            activity: https://www.canalplus.com
          target:
            entity_id: remote.mibox3
        hold_action:
          action: none

YouTube et Netfliw Ok aussi.
Bob

Merci @Bob mais j’avais pas envie de passer par une autre intégration mais plutôt tout faire moi-même. J’ai réussi à parvenir à la main. Dans mon problème précédent j’ai pas réussi à faire communiquer correctement mes inputs helpers pour une raison que j’ignore mais j’ai trouvé une meilleure façon de faire :

  1. création d’un input select avec en options toutes les commandes ADB et/ou IDs d’app pour contrôler le Fire Stick.
input_select:
  firetv_remote_chambre_aurore:
    name: Fire TV (Chambre Aurore)
    options:
      - CMD:PowerOn
      - CMD:Home
      - CMD:Sleep
      - Launcher
      - Netflix
      - Disney+
      - Prime Video
      - myCANAL
    initial: Launcher
    icon: mdi:panda

CMD:xxxx sont des labels que j’ai choisi pour des commandes ADB et le reste ce sont les lables d’applications que je souhaite commander.

  1. Chaque option de cette liste déroulante sera sélectionné depuis le dashboard de HA via son propre bouton. Par exemple un bouton Netflix sur le tableau de bord donnera :

    Pour expliquer rapidement, la 1ère carte c’est tout bêtement une carte Mushroom Media Player avec l’entité de la FireTV. La carte permet d’ajouter des options contrôles limités. Une fois l’intégration effectuée à 100% on pourra supprimer ces options de contrôles qui sont non seulement limitées mais deviendront inutiles. La seconde carte est mon input_select crée précédemment. Suivi des boutons pour contrôler cet input. Par exemple pour Netflix :
type: button
entity: input_select.firetv_remote_chambre_aurore
name: NETFLIX
hold_action:
  action: none
tap_action:
  action: perform-action
  perform_action: input_select.select_option
  target:
    entity_id:
      - input_select.firetv_remote_chambre_aurore
  data:
    option: Netflix

select_option est une action permettant de choisir une option de ma liste déroulante input_select lors d’un clic/tap sur le bouton. Ici j’ai dis que l’option de la liste déroulante a selectionner est Netflix. La valeur dans liste déroulante à gauche du bouton Netflix passer de Disney+ à Netflix comme voulu. La liste déroulante en mode production ne sera bien évidemment pas affiché sur le dashbord. Là c’est juste du débogage pour expliquer le fonctionnement.

  1. J’ai enfin crée un automatisation qui écoute les changements sur cette liste déroulante :
- id: '1747216834852'
  alias: FireTV Automation
  triggers:
  - alias: Changement d'option sur la liste déroulante
    trigger: state
    entity_id:
    - input_select.firetv_remote_chambre_aurore
  conditions: []
  actions:
  - variables:
      apps:
        Launcher: com.amazon.tv.launcher
        Netflix: com.netflix.ninja
        Disney+: com.disney.disneyplus
        Prime Video: com.amazon.firebat
        myCANAL: com.canal.android.canal
      commands:
        CMD:PowerOn: POWER
        CMD:Home: HOME
        CMD:Sleep: SLEEP
        CMD:WakeUp: WAKEUP
      option: '{{ states(''input_select.firetv_remote_chambre_aurore'') }}'
      appRequest: '{{ apps[option] if option in apps else None }}'
      commandRequest: '{{ commands[option] if option in commands else None }}'
  - alias: Si option FireTV reconnue
    choose:
    - conditions:
      - condition: template
        value_template: '{{ appRequest != none }}'
      sequence:
      - action: media_player.select_source
        metadata: {}
        data:
          source: '{{ appRequest }}'
        target:
          device_id: 1208b1c43ad320e98422de2df3777949
      alias: SI app ID trouvé
    - conditions:
      - condition: template
        value_template: '{{ commandRequest != none }}'
      sequence:
      - action: androidtv.adb_command
        metadata: {}
        data:
          command: '{{ commandRequest }}'
        target:
          device_id: 1208b1c43ad320e98422de2df3777949
      alias: SI commande ADB trouvée
  - alias: DEBUG MODE
    action: browser_mod.notification
    metadata: {}
    data:
      message: 'ID app : {{ appRequest }}

        ----------------

        Commande ADB : {{ commandRequest }}'
  mode: single

  • J’ai crée 2 variables pour mapper ma liste déroulante avec les commandes finales à envoyer au FireTV via ADB. La variable apps fait le mapping entre les appid et leur label dans la liste déroulante. La variable commands fait le mapping entre les commandes ADB et leur labels dans la liste déroulante (les labels de type CDM:xxx donc).

  • Si c’est une app qui est sélectionné dans la liste déroulante, je stock son ID dans une variable appRequest. Si c’est une commande ADB je stock cette commande une variable commandRequest.

  • Avec un if/elif je regarde laquelle des 2 variables appRequest ou commandRequest est différent de none (« unknown »). Il y a au moins une des 2 variables qui retourne un résultat (id d’app ou commande ADB). En fonction du résultat de cette condition :

    • Soit j’appelle l’action media_player.select_source (si on est dans la condition appRequest) à laquelle je lui passe l’id de l’app comme source de la FireTV (par exemple com.netflix.ninja).

    • Soit j’appelle l’action androidtv.adb_command (si on est dans la condition commandRequest) à laquelle je lui passe la commande ADB voulue (par exemple « POWER » pour allumer la FireTV).

Et le principal fonctionne comme je le souhaite. Et surtout cette automatisation me permet de piloter ma FireTV avec 2 méthodes selon les besoins : Soit via l’id de l’application soit directement avec une commande ADB au cas où l’id de l’application ne fonctionnerai pas comme c’est le cas pour l’id de l’app Prime Video. D’ailleurs la commande ADB pour Prime Video :

am start com.amazon.firebat/com.amazon.firebatcore.deeplink.DeepLinkRoutingActivity

Ressources :

  • Code source de l’intégration: core/homeassistant/components/androidtv at dev · home-assistant/core · GitHub

  • La documentation donnent des clés des commandes ADB prêtes à l’emploi pour piloter la FireTV (ou tout autre appareil de type Android TV) : Android Debug Bridge - Home Assistant ou pour aller plus loin : KeyEvent  |  API reference  |  Android Developers

  • Pour trouver les id d’applications → soit depuis le Play Store en ouvrant la page de l’application depuis un navigateur web et dans la barre d’adresse vous aurez un adresse de type play.google. com/store/apps/details?id=com.example.app123. Mais toutes les apps ne sont pas directement accessibles depuis le Play Store ou tout simplement la FireTV ne répondra pas en fournissant leurs ID. Comme l’a suggére @WarC0zes Vous pouvez aussi vérifier l’ID de l’application en allumant votre Fire TV ,vous lancez l’application dont vous voulez récupérer l’ID, et enfin depuis HA dans les options de développer dans la partie Etat vous pourrez retrouver l’ID associée à l’application en cours de lecture.

  • Si l’ID de l’application ne permet pas de lancer celle-ci depuis HA, ba faudra rechercher sur internet la commande ADB permettant de lancer l’application.

Voilà, c’est qu’un exemple d’implémentation parmi tant d’autres car il n’y a jamais qu’une seule façon de faire. En espérant que ça permette à d’autres de configurer rapidement la Fire TV sur leur instance de HA et d’adapter le code selon leurs besoins. :ok_hand:

Oh purée, l’usine, des petits boutons me suffisent :wink: mais chacun fait à son besoin, belle obstination :slight_smile:
Merci pour les ressources.

show_name: true
show_icon: true
type: button
tap_action:
  action: call-service
  service: remote.turn_on
  target:
    entity_id:
      - remote.mibox3
    device_id: []
    area_id: []
  data:
    activity: https://www.netflix.com/title
icon: mdi:netflix
name: Netflix

Bob

1 « J'aime »

Ce sujet a été automatiquement fermé après 2 jours. Aucune réponse n’est permise dorénavant.