Google Mini doorgaan met muziek afspelen na TTS

Ik heb een aantal Google Mini speakers en deze kunnen muziek afspelen vanuit streaming services, bijvoorbeeld Sublime, Veronica of SkyRadio, etc…

Dat afspelen doe ik meestal via de Radio Content Player en de streams komen dan van de API van:

http://playerservices.streamtheworld.com

en NPO zenders via

http://icecast.omroep.nl

Radio streams kun je eenvoudig vinden met de zoek functie op Radio-Browser.info

De TTS (Text To Speech) engine maakt gebruik van Google Translate en in de configuration.yaml van Home Assistant staat dan ook:

tts:
  - platform: google_translate
    service_name: google_say
    base_url: http://192.168.1.123:8123. ## IP adres van jouw Home Assistant
    language: nl
    cache: false

TTS gebruik ik dan om te melden dat er ergens een sensor op ‘on‘ komt te staan, zoals de vaatwasser of wasmachine die klaar is, of het vlees op de barbecue is gereed… maar ook rook- of watermelders, alarm, etc…

In Node-RED wordt gebruik gemaakt van service-nodes om de TTS naar de speaker te sturen, bijvoorbeeld:

So far so good, muziek werkt, TTS werkt ook. Echter, indien er muziek speelt op de Google Mini en er komt een TTS overheen, stopt daarna de muziek.

Dat wil ik niet, dus ik heb de volgende oplossing bedacht waarbij het uitgangspunt is dat de state van de media_player wijzigt, m.a.w. er wordt iets afgespeeld, hetzij muziek, hetzij tts.

Stap 1

De 1e switch controleert op msg.payload en als die ‘playing‘ is volgt een 2e switch die de msg.data.old_state.attributes.media_content_id controleert op ‘playerservices’ of ‘icecast’.

1e switch
2e switch

Indien het voldoet dan stop ik de property met een change-node in een flow-variable, flow.playing

Bijvoorbeeld, de Google Mini gaat Sublime afspelen, dan bevat de variable flow.playing het volgende:

http://playerservices.streamtheworld.com/api/livestream-redirect/SUBLIME.mp3

Stap 2

Stel nu dat terwijl muziek afspeelt, er een TTS melding op de Google Mini wordt afgespeeld. De state van de Google Mini wijzigt dan een paar keer en uiteindelijk is de status ‘idle‘ want hij stop met afspelen. Nu geldt de 3e uitgang van de 1e switch-node (idle) en gaat de volgende flow in:

Met de 1e switch hierin wordt gecontroleerd of de content_id nu ‘tts_proxy‘ bevat en zo ja, dan wacht ik 5 seconden of er echt niets afgespeeld wordt waarna ik vanuit de variable flow.playing de ‘oude’ URL van de streamingdienst probeer op te vragen en in de payload stop. Indien de variabele niet leeg is, stuurt een service-node de URL (uit de payload) naar de Google Mini en speelt de muziek weer af.

Indien de flow.playing op dit moment wel leeg is (uitgang 2 van de laatste switch-node), zet ik de Google Home uit want blijkbaar speelde er geen muziek vóór de TTS melding.

De state van de Google Mini wijzigt nu in ‘off‘ en daardoor wordt de variable flow.playing verwijderd.

De totale flow ziet er als volgt uit:

De ‘Delete flow.playing’ node is een change node die de flow variable verwijderd: