RHASSPY - dialogue avancé

Bonjour,

Ce que je vais décrire ci-dessous fonctionne ainsi : si je mets en charge un appareil style GSM, tablette … Rhasspy doit me poser la question s’il doit surveiller l’évolution de la charge - La surveillance de charge a pour but de m’alerter quand cette dernière atteint 90% … Je peux ainsi arrêter la charge.
Le fonctionnement de Rhasspy est donc différent de son comportement normal : attente du wake-word, puis de la commande. Cette fois, il pose la question et attend votre réponse.

Le hot_word est une particularité : quand j’ai trop de bruit ambiant (TV, musique, …), je désactive le wake-word pour éviter des « je n’ai pas compris » … Condition à virer si besoin.
Il faudra par contre déclarer le input_text : texte_libre

Le passage par une annonce textuelle puis le StartSession de Rhasspy est du au fait que je passe par un TTS externe dans Rhasspy : et là, il calcule mal la fin de lecture du fichier wav. Il termine prématurément la session. Donc, j’ai été obligé de faire court pour le message qui va avec le InitSession et coller un délai pour laisser le temps au 1er message.

J’ai 4 automations :

  • une qui surveille la mise en charge d’un mobile,
  • une qui surveille l’état de charge des mobiles
  • une qui traite les réponses « affirmatives »
  • une qui traite les réponse « négatives »

Voici pour la surveillance des mobiles, 3 à ce jour, il faut aussi déclarer un input_boolean qui sert à savoir quel mobile est à surveiller :

input_boolean:
# gestion du mode de suivi de la charge mobile & tablette
  suivi_sonore_phone_alain:
    name: Indique si avec ou sans message Rhasspy pour GSM alain
  suivi_sonore_tab_a10:
    name: Indique si avec ou sans message Rhasspy pour tablette Tab A10
  suivi_sonore_tab_snote:
    name: Indique si avec ou sans message Rhasspy pour tablette S Note

L’automation qui surveille la mise en charge

- id: batterie_mobiles_demarre
## quand un mobile est mis en charge, demander si surveillance si pas en mode sourdine
  alias: batterie_mobiles_demarre
  description: ''
  trigger:
  - platform: state
    entity_id: binary_sensor.gt_n8010_is_charging_3
    from: "off"
    to: "on"
  - platform: state
    entity_id: binary_sensor.alain_pro_is_charging
    from: "off"
    to: "on"
  - platform: state
    entity_id: binary_sensor.alain_tablette_is_charging
    from: "off"
    to: "on"
  condition:
    condition: state
    entity_id: input_boolean.hot_word
    state: "on"
  action:
## init du texte avant d'entamer la conversation
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: ""
  - delay: 00:00:04
## est-ce que c'est le GSM d'Alain qui est mis en charge
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: >
        {{ iif(is_state('binary_sensor.alain_pro_is_charging', 'on'), "le GSM d'Alain", "") }}
## est-ce que c'est la tablette A10 qui est mise en charge
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: >
        {% if is_state('input_text.texte_libre', '') %}
          {{iif(is_state('binary_sensor.alain_tablette_is_charging','on') ,"la tablette A10","")}}
        {% else %}
          {{ states('input_text.texte_libre')}} {{iif(is_state('binary_sensor.alain_tablette_is_charging','on') ,"et la tablette A10","")}}
        {% endif %}
## est-ce que c'est la tablette S NOTE qui est mise en charge
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: >
        {% if is_state('input_text.texte_libre', '') %}
          {{iif(is_state('binary_sensor.gt_n8010_is_charging','on') ,"la tablette S note","")}}
        {% else %}
          {{ states('input_text.texte_libre')}} {{iif(is_state('binary_sensor.gt_n8010_is_charging','on') ,"et la tablette S note","")}}
        {% endif %}
## préparation du message de situation
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: >
        {{ states('input_text.texte_libre')}}
        {{iif(('et la' in states('input_text.texte_libre')) == false,' est en charge.',' sont en charge.')}}
## message de situation
  - service: rest_command.tts_rhasspy
    data:
      site: 'maitre'
      lemessage: "{{ states('input_text.texte_libre') }}"
  - service: input_select.select_option
    target:
      entity_id:
      - input_select.objet
    data:
      option: survmobilcharge
## préparation du texte final à prononcer
  - service: input_text.set_value
    target:
      entity_id: input_text.texte_libre
    data:
      value: >
        {{iif(('et la' in states('input_text.texte_libre')) == false,'Dois-je surveiller son niveau de charge ?','Dois-je surveiller leur niveau de charge ?')}}
  - delay: 00:00:04
  - service: mqtt.publish
    data:
      payload_template: " { \"init\": { \"type\": \"action\", \"canBeEnqueued\": \"false\", \"text\": \"{{ states('input_text.texte_libre') }}\", \"intentFilter\":[\"Negatif\",\"Affirmatif\"], \"sendIntentNotRecognized\": \"true\" }, \"siteId\": \"maitre\" }"
      topic: hermes/dialogueManager/startSession
  mode: single

Pour la gestion des réponses « oui / non » à la question sur la surveillance, j’ai ceci dans la config de Rhasspy :

[Affirmatif]
(oui | okay | ouais | yep | yes | affirmatif | bien sur | évidemment | cela va de soi | ouaip | absolument | tout a fait | aussi)

[Negatif]
(non | niet | négatif | pas la peine | pas nécessaire | surtout pas | pas du tout)

Puis voici le cas de l’automation qui gère le « oui » et qui a besoin de la déclaration d’un input_select objet qui me permet de savoir à quoi se rapporte la réponse « oui/non » car j’ai d’autres cas de dialogues avec Rhasspy :

input_select:
# quel élément est ciblé par la question oui/non de rhasppy
  objet:
    options:
      - rien
      - ampli
      - tv
      - sourde
      - survmobilcharge
    initial: rien

L’automation qui gère le « oui »

- id: rhasspy_affirmatif
## traitement des réponses positives
  alias: rhasspy_affirmatif
  description: ''
  trigger:
  - platform: event
    event_type: rhasspy_Affirmatif
  condition: []
  action:
  - choose:
## pour la surveillance de la charge des mobiles 
    - conditions:
      - condition: state
        entity_id: input_select.objet
        state: survmobilcharge
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id:
            - input_boolean.suivi_sonore_phone_alain
            - input_boolean.suivi_sonore_tab_a10
            - input_boolean.suivi_sonore_tab_snote
      - service: tts.edge_tts_say
        data:
          entity_id: media_player.mpd
          message: okay, je surveille
## et test si la tablette TAB A10 en charge
      - choose:
        - conditions:
          - condition: state
            entity_id: binary_sensor.alain_tablette_is_charging
            state: "on"
          sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.suivi_sonore_tab_a10
        default:
## et test si GSM Alain en charge
      - choose:
        - conditions:
          - condition: state
            entity_id: binary_sensor.alain_pro_is_charging
            state: "on"
          sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.suivi_sonore_phone_alain
        default:
## et test si tablette S note en charge
      - choose:
        - conditions:
          - condition: state
            entity_id: binary_sensor.gt_n8010_is_charging
            state: "on"
          sequence:
          - service: input_boolean.turn_on
            target:
              entity_id: input_boolean.suivi_sonore_tab_snote
        default:
    default: []
  - service: script.objet_rien
  mode: parallel

Pour l’automation qui gère le « non » et qui a aussi besoin de l’input_select objet :

- id: rhasspy_negatif
## traitement des réponses négatives
  alias: rhasspy_negatif
  description: ''
  trigger:
  - platform: event
    event_type: rhasspy_Negatif
  condition: []
  action:
  - choose:
## pour la surveillance des mobiles
    - conditions:
      - condition: state
        entity_id: input_select.objet
        state: survmobilcharge
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id:
            - input_boolean.suivi_sonore_phone_alain
            - input_boolean.suivi_sonore_tab_a10
            - input_boolean.suivi_sonore_tab_snote
      - service: tts.edge_tts_say
        data:
          entity_id: media_player.mpd
          message: okay, je ne surveille pas
      - service: script.objet_rien
    default: []
  mode: parallel

Et pour finir, l’automation qui surveille le dépassement du seuil de 90% de charge et envoie un message vocal si on a répondu oui à la question. A noter, que si pas de message vocal il y a néanmoins envoi d’une notification sur 2 appareils principaux :

- id: batterie_mobiles_terminer
## surveillance du niveau de charge à 90% des mobiles avec alerte sonore si enclenchée
  alias: batterie_mobiles_terminer
  description: ''
  trigger:
  - platform: numeric_state
    entity_id: sensor.gt_n8010_battery_level_3
    above: 90
  - platform: numeric_state
    entity_id: sensor.alain_pro_battery_level
    above: 90
  - platform: numeric_state
    entity_id: sensor.alain_tablette_battery_level
    above: 90
  action:
## notification envoyée sur mon GSM et ma tablette
  - service: notify.mobile_app_alain_pro
    data:
      message: attention, charge presque complète pour {{ state_attr(trigger.entity_id,'friendly_name').split(" Batt")[0] }}
  - service: notify.mobile_app_alain_tablette
    data:
      message: attention, charge presque complète pour {{ state_attr(trigger.entity_id,'friendly_name').split(" Batt")[0] }}
## message sonore sur cas de la tablette TAB A10 qui est à 90%
  - choose:
    - conditions:
      - condition: and
        conditions:
          - condition: state
            entity_id: binary_sensor.alain_tablette_is_charging
            state: "on"
          - condition: state
            entity_id: input_boolean.suivi_sonore_tab_a10
            state: "on"
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.suivi_sonore_tab_a10
      - service: tts.edge_tts_say
        data:
          entity_id: media_player.mpd
          message: la tablette tab A10 est maintenant chargée a {{ states.sensor.alain_tablette_battery_level.state }} %
    default:
## message sonore sur cas du GSM Alain qui est à 90%
  - choose:
    - conditions:
      - condition: and
        conditions:
          - condition: state
            entity_id: binary_sensor.alain_pro_is_charging
            state: "on"
          - condition: state
            entity_id: input_boolean.suivi_sonore_phone_alain
            state: "on"
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.suivi_sonore_phone_alain
      - service: tts.edge_tts_say
        data:
          entity_id: media_player.mpd
          message: le gsm pro d'alain est maintenant chargé a {{ states.sensor.alain_pro_battery_level.state }} %
    default:
## message sonore sur cas de la vieille tablette NOTE S qui est à 90%
  - choose:
    - conditions:
      - condition: and
        conditions:
          - condition: state
            entity_id: binary_sensor.gt_n8010_is_charging_3
            state: "on"
          - condition: state
            entity_id: input_boolean.suivi_sonore_tab_snote
            state: "on"
      sequence:
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.suivi_sonore_tab_snote
      - service: tts.edge_tts_say
        data:
          entity_id: media_player.mpd
          message: la tablette S note est maintenant chargée a {{ states.sensor.alain_pro_battery_level.state }} %
    default:
  mode: single
2 « J'aime »

Merci pour le partage

hello,
ta pas un i de trop la ?

non, ça peut surprendre, mais le iif existe bien : Templating - Home Assistant

pratique car ça simplifie le code

Bon on en apprend tout les jours merci de l’info
Désolé