Home Assistant & Voice
Comme beaucoup d'utilisateurs j'utilise des notifications vocales, et comme pour beaucoup d'utilisateurs parfois c'est le bug !
Comme beaucoup d'utilisateurs j'utilise des notifications vocales, et comme pour beaucoup d'utilisateurs parfois c'est le bug. Il y a plusieurs approches, Alexa Media est la dernière, Alexa Media Player peut s'utiliser en parallèle ou encore Google TTS, Cloud TTS (Nabu Casa) ou même en local avec Piper.
Le problème est qu'il arrive parfois que l'un de ces services ne fonctionne pas. Il passe alors en indisponible, ou pas à l'image d'Alexa Devices qui parfois ne retourne pas d'erreur, mais ne parle pas !
Si contourner ces problème peut s'envisager automatiquement quand le device est indisponible, j'ai choisit une autre approche consistant à créer un input_select:avec les choix des différents services que j'appelerait via un script dans les automations :
input_select:
select_voice:
name: Select Voice
icon: mdi:speaker-message
options:
- Alexa Media Player
- Alexa Devices
- Sonos TTS
- ...script:
notify_voice:
alias: Notify Voice
mode: queued
fields:
message:
description: Message vocal
volume:
description: Volume optionnel
default: 40
sequence:
- variables:
backend: "{{ states('input_select.tts') }}"
vol: "{{ volume | default(40) }}"
- choose:
# Alexa Media Player
- conditions: "{{ backend == 'Alexa Media Player' }}"
sequence:
- action: notify.alexa_media
data:
message: "{{ message }}"
target: media_player.echo_dot_hall
data:
type: "tts"
# Alexa Media Player (variante chuchotement) https://docs.aws.amazon.com/polly/latest/dg/supportedtags.html#prosody-tag
- conditions: "{{ backend == 'Alexa Media Player Soft' }}"
sequence:
- action: notify.alexa_media
data:
message: <amazon:effect name="whispered">{{ message }}</amazon:effect>
target: media_player.echo_dot_hall
data:
type: "tts"
# Alexa Device
- conditions: "{{ backend == 'Alexa Devices' }}"
sequence:
- action: notify.send_message
target:
entity_id: notify.echo_hall_speak
data:
message: "{{ message }}"
# Alexa Piper
- conditions: "{{ backend == 'Alexa Piper' }}"
sequence:
- action: tts.speak
data:
# cache: true
media_player_entity_id: media_player.echo_dot_hall
message: "{{ message }}"
target:
entity_id: tts.piper
# Sonos TTS (via Music Assistant)
- conditions: "{{ backend == 'Sonos TTS MA' }}"
sequence:
- action: tts.cloud_say
data:
entity_id: media_player.sonos_ma_hall
message: "{{ message }}"
# Google Home TTS
- conditions: "{{ backend == 'Google TTS Cloud' }}"
sequence:
- action: tts.cloud_say
target:
entity_id: media_player.cast_entree
data:
message: "{{ message }}"
# Google Home TTS Piper
- conditions: "{{ backend == 'Google TTS Piper' }}"
sequence:
- action: tts.speak
data:
# cache: true
media_player_entity_id: media_player.cast_entree
message: "{{ message }}"
target:
entity_id: tts.piperEt ensuite j'insère uniquement cette commande dans mon automation. A noter que les variables dans le message sont prises en charge car il est créé dans l'automation :
automation:
... Mon automation ...
- action: script.notify_voice
data:
message: "{{ trigger.event.data.preset }} du chauffage de la salle de bain activé pour {{ trigger.event.data.duration_minutes | int }} minutes, Pour aller plus loin on pourrait régulièrement tester la disponibilité des services et sélectionner automatiquement le bon service.