Google Mini doorgaan met muziek afspelen na TTS

Ik heb een aantal Google Hub en 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 Cloud Say en deze is ontsloten met behulp van de cloud-koppeling in Nabu Casa. Zonder Nabu Casa zou een aparte TTS-instelling nodig zijn, zie https://www.home-assistant.io/integrations/tts/

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 speaker 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 – playing

De 1e switch-node controleert op msg.payload en als die ‘playing‘ is volgt een 2e switch die de msg.data.new_state.attributes.media_content_id controleert op ‘streamtheworld’ want daar komt de radio-stream vandaan.

Indien het voldoet dan wordt een scene aangemaakt van de status van de media_player zoals die op dat moment is, dus afspelen van muziek.

Stap 2 – idle

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 2e uitgang van de 1e switch-node (idle) en gaat de flow in om te controleren of de vorige status het afspelen van een stream vanuit ‘streamtheworld’ was:

Als daar aan voldaan is wordt een delay van 15 seconden ingesteld, genoeg om in die tijd de TTS melding af te spelen. Hierna wordt de scene gestart die de status van de media_player bevat ten tijde van het afspelen van muziek. Dus, de muziek wordt hervat!

Stap 3 – off

Zodra gestopt wordt met afspelen van muziek zal de status van de media_player op ‘off‘ komen en dan wordt de scene verwijderd.

Er wordt ook gebruik gemaakt van een helper type input_boolean die gebruikt wordt om aan te geven of de scene wel of niet aanwezig is omdat anders een foutmelding verschijnt als de status van de media_player op off komt terwijl er geen muziek werd afgespeeld.

Deze Node-RED flow wordt nu voor elke Google speaker aangemaakt waar muziek en TTS op wordt afgespeeld.