Mein Smart-Home macht in der ein oder anderen Automatisierung Sprachansagen über einen meiner Sonos-Lautsprecher zu meiner Information. Ansagen sind für mich zu Hause das, was Push-Nachrichten auf die Apple Watch oder das iPhone unterwegs sind. Beispiele sind eine zu schlechte Luftqualität, ein erkannter Posteinwurf oder eine Erinnerung ans Blumengießen. Natürlich erfolgen alle diese Ansagen nicht im Nachtmodus. Außerdem habe ich noch einen Helfer definiert, mit dem ich Ansagen komplett deaktivieren kann, z.B. bei Videokonferenzen. Sein Wert ist Teil einer Bedingung vor der jeweiligen Ansage.
Grundsätzlich nutze ich für Sprachansagen den Home-Assistant-Dienst “cloud.tts_say“. Dieser Teil des Abos, welches man abschließen kann, um von unterwegs auf seine Smart-Home zugreifen zu können. Mehr Informationen dazu findet ihr hier.
Das Skript
Da Sprachausgaben in verschiedenen Automatisierungen vorkommen, habe ich sie in ein zentrales Skript ausgelagert. Eine zentrale Anforderung an das Skript ist, dass eine eventuell bereits vorhandene Audio-Ausgabe auf dem entsprechenden Lautsprecher (Radio-Stream, Musik, …) nach der Sprachansage fortgesetzt wird. Dazu nutze ich die Dienste sonos.snapshot und sonos.restore.
Das Skript nimmt als “Parameter” den gewünschten Text, den Lautsprecher, einen Pause-Wert sowie die Lautstärke entgegen. Der Pause-Wert sollte dabei mindestens so lang wie die jeweilige Sprachausgabe sein. Er stellt sicher, dass der Restore nicht die Ansage unterbricht.
Alles in allem sieht das Skript dann so aus:
alias: TTS Engine sequence: - service: sonos.snapshot data: entity_id: "{{ speaker }}" with_group: true - service: media_player.unjoin data: entity_id: "{{ speaker }}" - service: media_player.volume_set data: entity_id: "{{ speaker }}" volume_level: "{{ volume }}" - service: tts.cloud_say data: entity_id: "{{ speaker }}" message: "{{ message }}" - delay: seconds: "{{ delay }}" - wait_template: "{{ is_state(speaker, 'paused') }}" - delay: seconds: 1 - service: sonos.restore data: entity_id: "{{ speaker }}" with_group: true
Fügt es am besten im YAML-Modus ein, da es nicht komplett im grafischen Editor bearbeitet werden kann.
Ein Beispiel-Aufruf
Schauen wir uns noch schnell an, wie ein beispielhafter Aufruf aus einer Automatisierung heraus aussehen kann. Zur besseren Kopierbarkeit zeige ich euch gleich die YAML-Version:
service: script.tts_engine data: speaker: media_player.kueche message: Posteinwurf erkannt! volume: 0.5 delay: 10
Den Mediaplayer müsst ihr natürlich anpassen. Außerdem muss der Dienstname dem entsprechen, was wir als Skript-Name zuvor definiert haben.
Moin,
vielen Dank für das coole Script. Mit “tts.google_translate_say”läuft es allerdings etwas träge.
Wäre schön, wenn Du mal erklären könntest, wie Du Sprachausgaben an mehrere Sonos-Geräte gleichzeitig realisierst hast, ohne die Geräte zu gruppieren. Ich verstehe es momentan so, dass dies nur geht, wenn das Script mehrfach aufgerufen wird.
Ich verwende nur einen Speaker für Sprachansagen. Denke schon, dass ein mehrfacher Aufruf hier helfen würde. Mit cloud.tts_say bin ich zufrieden und unterstütze gleichzeitig das Home-Assistant-Projekt.