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.
Hallo,
schöne Anleitung, aber wo fügt man denn das Sonos Script ein? Direkt in der Automation? Bin noch Anfänger im Bereich HA
Nicht alle meine Artikel richten sich an Einsteiger, sondern ich versuche ein breiten Interessen- und Erfahrungsmix in unterschiedlichen Themenbereichen abzudecken. Dieser Artikel setzt ein wenig Erfahrung mit Home Assistant voraus. Skripte und Automatisierungen (was nicht dasselbe ist) können als Alternative zum grafischen Editor sowohl komplett als auch auf Einzelschritt-Basis in der YAML-Sprache geschrieben werden (intern wird sowieso alles in YAML gespeichert). Aufgerufen wird diese Möglichkeit über das Menü, was durch drei senkrechte Punkte gekennzeichnet ist, unter dem Punkt „als YAML bearbeiten“.