TTS sur sonos avec gestion de volume

Bonjour,

J’essaye de créer un script pour la gestion de TTS sur un sonos.
J’ai créé 4 variables sous forme de input_text (tts_piece, tts_msg, tts_volume, et tts_volume_old pour respectivement le lieu, le message, le volume du tts et le volume initial du sonos avant le tts)

Dans le principe, je stocke le volume actuel, je modifie le volume pour le tts, je lance le tts, et je remets le volume initial.

sequence: 
  - service: input_text.set_value
    data:
      value: '{{ state_attr("media_player.{{states("input_text.tts_piece")}}", "volume_level") }}'
    target:
      entity_id: input_text.tts_volume_old
  - service: media_player.volume_set
    data:
      volume_level: "{{ states("input_text.tts_volume") }}"
    target:
      entity_id: "media_player.{{states("input_text.tts_piece")}}“
  - service: tts.speak
    target:
      entity_id: tts.google_translate_en_com
    data:
      language: "fr"
      media_player_entity_id: "media_player.{{states("input_text.tts_piece")}}“
      message: "{{ states("input_text.tts_msg")}}"
  - service: media_player.volume_set
    data:
      volume_level: "{{ states("input_text.tts_volume_old") }}"
    target:
      entity_id: "media_player.{{states("input_text.tts_piece")}}“

impossible de sauvegarder … j’ai un message d’erreur que je ne comprends pas : Erreur lors de l’analyse du YAML : bad indentation of a mapping entry (ligne : 9, colonne : 33).

soit la ligne :
volume_level: "{{ states("input_text.tts_volume") }}"

J’ai essayé de revoir le code dans ‹ Outils de développement › - ‹ Modèle › et la je ne comprends plus rien …

{{states("input_text.tts_piece")}}
{{state_attr("media_player.bureau", "volume_level")}}
{{state_attr("media_player.{{states('input_text.tts_piece')}}", "volume_level")}}
media_player.{{states('input_text.tts_piece')}}

me renvoie comme réponse :

bureau
0.3
None
media_player.bureau

et le remplacement des ’ pour des "

{{state_attr("media_player.{{states("input_text.tts_piece")}}", "volume_level")}}

me renvoie une erreur de syntaxe …

Quelqu’un aurait il une piste pour moi ?

Merci d’avance !

Manu

Je me réponds à moi même …

ceci fonctionne :

action: tts.speak
target:
  entity_id: tts.google_translate_en_com
data:
  language: fr
  media_player_entity_id: media_player.{{states('input_text.tts_piece')}}
  message: "{{ states('input_text.tts_msg') }}"

c’est un début …

Pour le volume, je fais simplement comme cela si ça peut aider…

actions:
  - data:
      volume_level: 0.2
    target:
      entity_id: media_player.salon
    action: media_player.volume_set
  - data_template:
      cache: true
      media_player_entity_id: media_player.salon
      message: >-
        Bonjour, le temps aujourd'hui est {{    
        states('sensor.bain_de_bretagne_daily_original_condition')}}, la
        température     extérieure est de {{ states('sensor.exterieure') |
        round(0)}} degré et la     température salle est de {{
        states('sensor.sonde_salle_temperature') |     round(0)}} degré, bonne
        journée
    target:
      entity_id: tts.google_fr_fr
    action: tts.speak

merci pour ton aide !

En fait, après beaucoup d’essais, c’est l’entité :

  entity_id: media_player.{{states('input_text.tts_piece')}}

qui reviens toujours égale à ‹ none ›

Bonjour,
Pourquoi tu passes par un script avec des services et pas « action ».
Essaye par étape dans une automatisation comme je t’ai proposé.
J’ai fait un test avec un input_select et ca fonctionne très bien comme cela

data_template:
  cache: true
  media_player_entity_id: media_player.{{states('input_text.message_magic_mirror')}}
  message: >-
    Bonjour, le temps aujourd'hui est {{    
    states('sensor.bain_de_bretagne_daily_original_condition')}}, la
    température     extérieure est de {{ states('sensor.exterieure') |
    round(0)}} degré et la     température salle est de {{
    states('sensor.sonde_salle_temperature') |     round(0)}} degré, bonne
    journée
target:
  entity_id: tts.google_fr_fr
action: tts.speak
1 « J'aime »

Pour le TTS ca fonctionne !
merci beaucoup …

Mais je ne sais pas récupérer le volume initial du sonos dans une pièce renseignée en input_text :

  - action: input_text.set_value
    data:
      value: '{{ state_attr("media_player.{{states("input_text.tts_piece")}}", "volume_level") }}'
    target:
      entity_id: input_text.tts_volume_old

j’ai essayé de la passer en variable sans succes :

  - action: input_text.set_value
    variable:
      piece_id: "media_player.{{states('input_text.tts_piece')}}"
    data:
      value: "{{ state_attr('{{piece_id}}', 'volume_level') }}"
    target:
      entity_id: input_text.tts_volume_old

Peut être que quelqu’un connait une autre façon de récupérer un attribut ?

Bonjour @Manu_Joly
Tu n’as pas directement une entité ?
Pour mon ampli j’ai ça :
image
En plus de ça:
image
Recherche dans Outils de DEV → Etats
Bob

malheureusement non …

Je viens de faire un test dans les outils de DEV @Manu_Joly , en mettant le nom de mon ampli dans un json pour éviter de créer pour rien un imput_text:

{% set ampli = '{"stateampli": "media_player.denon_avc_x3700h"}'|from_json %}
{{ ampli.stateampli }}
{{ state_attr(ampli.stateampli, 'volume_level') }}

Donc je dirai peut être:

value: "{{ state_attr(piece_id, 'volume_level') }}"

Bob

Pour récupérer le volume initial

action: input_text.set_value
data:
  value: "{{ state_attr('media_player.salon','volume_level') | float(0) }}"
target:
  entity_id: input_text.message_magic_mirror

Pour remettre le volume initial avec la valeur récupérée

action: media_player.volume_set
data:
  volume_level: "{{states('input_text.message_magic_mirror')}}"
target:
  entity_id: media_player.salon

Tu peux utiliser l’onglet action et modèle pour tester dans la vue outils de développement à partir de la barre latérale

Encore merci pur votre aide ! Et du temps que vous passer pour moi !!

@ Bob :
J’ai essayé sans succes … les virables dans l’action ou en dehors …

@ Jeffodilo, plus que de récupérer le volume initial du sonos, mon problème est de le récupérer sur « un » des sonos, qui doit être envoyé en variable par son nom :
Je ne peux donc pas écrire : value: "{{ state_attr('media player.salon … car ce « salon » selon l’appel au script n’est pus le même …

Ah ok, j’avais pas tout saisi, comme cela alors, ca doit fonctionner

{% set piece = states("input_text.tts_piece") %}
{{ state_attr('media_player.' + piece,'volume_level') | float(0) }}

Petit pas par petit pas …

  - action: input_text.set_value
    data:
      value: >-
        {% set piece_id = states('input_text.tts_piece') %} 
        {{state_attr('media_player.'+piece_id,'volume_level') }}
    target:
      entity_id: input_text.tts_volume_old

les 2 lignes de la valeur remontent bien 0,67 (volume actuel du sonos) dans l’éditeur de modèle.
par contre le code ci dessus ne modifie pas la valeur de l’input_text.tts_volume_old …?

Je deviens fou !..

Encore un grand merci à vous qui m’avez aidé à résoudre mon problème !!

L’erreur du 0,67 qui ne remontait pas n’était pas dans le code, mais dans les paramètres de mon input_text que j’avais limité à 3 caractères (de 0 à 100 %) sauf que c’est en décimal, et que 0,67, ca fait 4 caractères ! … donc il ne l’acceptait pas!

le code de mon scrpt (qui fonctionne) est donc :

sequence:
  - action: input_text.set_value
    data:
      value: >-
        {% set piece_id = states('input_text.tts_piece') %} 
        {{state_attr('media_player.'+piece_id,'volume_level') | float(0) }}
    target:
      entity_id: input_text.tts_volume_old
  - action: media_player.volume_set
    data:
      volume_level: "{{ states('input_text.tts_volume') }}"
    target:
      entity_id: media_player.{{states('input_text.tts_piece')}}
  - action: tts.speak
    target:
      entity_id: tts.google_translate_en_com
    data:
      language: fr
      media_player_entity_id: media_player.{{states('input_text.tts_piece')}}
      message: "{{ states('input_text.tts_msg') }}"
  - delay: 10
  - action: media_player.volume_set
    data:
      volume_level: "{{ states('input_text.tts_volume_old') }}"
    target:
      entity_id: media_player.{{states('input_text.tts_piece')}}

Sans le ‹ delay › le message se coupe et le volume est réduit imédiatement … Peut être qu’un ‹ wait › serait plus efficace …

Encore merci !

Manu

2 « J'aime »