Multi-room audio without alexa

Greetings everyone,

I want to create a multi-room audio system and I’m a bit overwhelmed with all the options and solutions so far. Plus, I have a few “extras” and don’t know how ot approach them (I’m definitely a beginner!).

Here’s my current situation:
I have two echo dots that I use to stream music via spotify. I have a soundbar that is not “smart” and has no wifi-capability whatsoever. Now, I want to get rid of my echo dots due to privacy reasons and would like to create a multi-room audio system that doesn’t really need to be super sophisticated, especially at the beginning.

What I’m looking for:
I want to place a few speakers in my apartment (1 x living room, 1 x bedroom, 1 x kitchen and maybe 1 x bath). Then I want to be able to choose one or more speakers and play a spotify playlist on them (either by picking a playlist with my smartphone or by pushing a button that plays a defined [or maybe even random] playlist). Also, it would be really nice if I could connect the TV and my soundbar with the RPI (using HDMI and/or optical). When I stream music, the soundbar should play the RPIs audio-signal, when the TV is turned on, the RPI should pass the audio-signal through, so that the soundbar then plays the TV-sound - that functionality would be really nice if that’s possible, but my main-focus here is the multi-room speakers to play spotify playlists.

I already found out that squeezelite seems to be a really good option for that. What I couldn’t figure out so far is what hardware I will need and how it should all be set up. Obviously, I don’t want to connect all speakers with cables and I don’t wany any speakers that have Alexa built in. I do have an RPI 3b+ that runs openhab and an RPI 3b+ that is currently unused.

What kind of speaker could I use to connect it to openhab and/or squeezelite? Would each speaker have to be connected to its own RPI or could they all be connected using bluetooth / wifi? How would you approach this project?

Thank you in advance
Pat

This is an interesting project!
Recently plex came out with a version of plexamp which is headless. Meaning you can install it on a device, hook up some speakers, and cast to it. I suppose that multi room support will come soon.
I also saw news some time ago about making smart speakers with esp32s.
As for commercial solutions, if you’re taking out Alexa for privacy reasons then you can cut all others for the very same.

I’m not sure about Sonos when it comes to privacy, but I’m pretty sure this would cover almost every point of your list (well, maybe a bit pricey), so maybe take a look at that.

squeezelite is really nice (I have six + four players in use), but a first point is, there is no way to use squeezelite to stream hdmi audio or other audio Input at all (at least I don’t know about an option). It’s only for streaming audio from Internet, Icecast, whatever, and from the Logitechmediaserver (Open Source) which is the control center. You would need this one up and running to control squeezelite from any App, may it be openHAB or something more special).
On the other hand, as squeezelite will be a DIY project, it’s not a big deal to add some other software to get hdmi sound input additionally (but definitely not only one weekend for this…).

You can use whatever hardware and software platform you want, some of my Players are iOS, some are Android, some are Windows, some are debian Linux, I have two old Roku (well, Pinnacle…) M1000 with an additional firmware, which allows the players to act as fake squeezeboxes (just like squeezelite) and I also have a PiCore player (TinyCore Distribution specialized to squeezelite), this one is built with a Raspberry Pi 2 (you could even use a Model 1) and a HifiBerry HAT (You can chose different HATs and even the builtin Audio Jacks and hdmi sound output). So that is a very nice option, too.
I also have built a Raspberry Player which uses Bluetooth to send the Sound to a Bluetooth Speaker, but this was more like a “will I get this up and running?” project, so I don’t use this player in real life.

I have one special player though, which is a Hardkernel Odroid U3 Compute Module plus a cheap 7.1 USB Sound Card. Please be aware that the cheap ones don’t have any additional filtering at Output, so you can simply use them as four stereo Outputs (ALSA hacking :wink: ), center and lfe as the fourth stereo pair, and on this system I got four instances of squeezelite running in parallel, these are connected to four Class-D stereo amps which outputs are connected to speakers in the ceiling in both bath rooms , kitchen and a pair of speakers in the laundry room.

Logitechmediaserver is available for at least Windows and Linux, PiCore is able to run the server part additionally. Squeezelite-X is available at the Windows store (no charge) so you could test squeezelite without even buying any hardware.

If your privacy reasons are specifically the microphones built into Alexa speakers, then you may want to consider using the hardware mute switches to prevent them from ever listening to you. Of course, that’s not a solution if you want to get rid of Amazon completely.

Your scenario is similar to mine. I’m using Google Cast devices, which you may not like, but I’ll describe it since there are some other things worth considering.

I have:

  • a Chromecast Gen 2 on my Bedroom TV/speakers
  • a Chromecast Audio on my living room stereo system (a Geneva XL that a relative gave me when they upgraded).
  • a Nest Audio speaker in my den

I only use the Nest Audio for multi-room audio, so I’ve muted the microphone and disconnected the LEDs (which are constantly on when it’s muted). It’s just a really solid speaker when you can get it on sale (or two for stereo pairing).

When I wake up, openHAB starts a livestream from a local radio station on my bedroom TV. When I turn on the bathroom lights, the stream switches to multi-room casting on all three devices. If I want to start Spotify, I can do it from my phone, computer or a Google Assistant device (which I’ve set to default to multi-room casting).

BTW, when you play an audio stream on a Chromecast, it just shows static images on the TV.

Unfortunately, the Chromecast Audio was discontinued a few years ago. It’s a great little device that works flawlessly, and I’ve heard rumours recently that they might bring it back. Until that happens, Echo Dots with 3.5mm jacks offer an advantage. You can also just use a regular Chromecast with an HDMI-to-analog converter to extract the audio.

So, here’s the thing you really have to consider: how do you control the non-smart speakers and TVs? It’s no fun if you have to go around turning them on and off all of the time.

My Geneva and TVs have IR remotes, so I use Logitech Harmony Hubs to control them. Whenever openHAB senses that a Chromecast is casting/idle, it turns on/off the accompanying device.

Alas, Harmony Hubs have also been discontinued. If one of mine dies, I’ll replace it with a Broadlink RM4 Mini with the unofficial openHAB binding.

The thing I love most is that openHAB normalizes the volume for me. Every time I start Spotify, the cast volumes for each speaker are reset to my default level. This prevents me from accidentally blasting music at an unreasonable hour if I previously had the volume way up.

I’ve also accounted for different streaming apps needing different volumes on different devices. For whatever reason, the web radio stream I use plays at different volumes on each device, so I can’t use the same settings as Spotify. Also, when I watch Disney+ or Prime Video on my bedroom TV, the casting volume needs to be turned way up. Again, openHAB does that for me.

As a result of this, I never have to adjust the volumes on individual speakers, because it’s all done by openHAB and Google Cast.

This took a heck of a lot of time and effort, but it was absolutely worth it. I use this functionality pretty much every day, and I never have to think about it. So no matter what solution you choose, I’d highly recommend being able to control device power/volume based on it.

Awesome, thank you guys very much for all the input. That’s definitely enough to keep me busy for quite some time.

I didn’t really trust the alexa mute switch, but from what I have read now, it is pretty secure since it is actually interrupting the microphones’ power supply. So that might be a good temporary solution - plus, it gives me some time to transition towards an alexa-free home more smoothly.

@Udo_Hartmann: Adding some additional functionality to squeezelite sounds really cool - but as a beginner, that just seems incredibly overwhelming. How would you approach this? Not code-wise, but more a general approach to dive into this topic and get to a point where you have that idea and you’re able to figure out a strategy in order to get there. So far, I’ve installed a conbeeII-stick, added some zigbee switches and plugs, wrote a few scripts for routines that occur every day (a motion sensor that gets activated after sunset, lights that turn on and off depending on certain conditions, etc.). Adding some more functionality to squeezelite sounds really interesting, but from my current perspective it feels just as realistic as me building a rocket and sending it to Mars.

And thanks for the ESP32- and Broadlink RM4-advice too! From what I understand, the Broadlink RM4 could be used to control my soundbar via Infrared and turn it into a “somewhat-smart-device” that way, right? I knew that the Harmony Hub was discontinued, but never knew a good alternative to it.

Yep. It’s the same for Google’s physical mute buttons. There are now also some smart speakers that intentionally leave out microphones.

My general advice for learning new technologies is to start small. I’ve spoken with a lot of new OH users who are thinking way too far into the future, and get so caught up in the end goals that they struggle with the basics. I don’t know much about Squeezelite, but I think the first thing to do would be to see what it can natively do, and then connect the dots to what you really want it to do.

I started OH with just my lights/plugs, and then added my Cast devices and Harmony Hubs. But it took me awhile to grasp how I could make it all tie in together.

Yep, the RM4 can issue commands to IR-controlled devices, same as the Harmony Hub. You have to program the IR codes, which I haven’t done, but individual users can upload their code profiles to the Broadlink app.

The whole discussion is here, and I’ve linked to the last release.

If you can find one on clearance/used, then I highly recommend it. Logitech has said they’ll keep supporting it “indefinitely”, because they don’t want to upset their current users. That could mean it turns off tomorrow if there’s an exploit, but it could also be five years from now. I suspect that they’ll monitor the user numbers and then kill it when it’s clear that people have mostly gone elsewhere.

If you get an RM4 Mini/Pro, make sure to get the bundle with the temperature/humidity sensor built into the USB cable.

HOW?!?!? This is so basic and yet so needed… a “default volume” state, similar to smart lights default state for when they are turned off at the socket.

Well, like other platforms, you could use more than one software to play music. You would need an audio input to get the sound, but the input can be routed directly via ALSA.
There might also be an option to use a much more recent version of squeezelite which is compatible with pulse audio.
There is a binding for pulse audio…

Really interested to see where your project may lead to!
I picked a moment in time myself when Google was about to discontinue their chromecastAudio line and bought a bunch of them.

I never got to really reliable get them to work until

  • I settled on spotify as my music streaming service and allowed to ignore my own 500GB music collection
  • oh3/chromeCast fixed some memory issues it may have had on oh2
  • spotify apps got better, too.

Since… I have 7 devices and they all sing the same tune as I tell them. An android phone to group/ungroup and since like a year spotify fixed some bugs so I can select which group of speakers to use and which volume and of course which playlist or what from spotify on linux, android and on macos, too. (macs where the bad finger before) Which happens to be my choice of OSen, can’t speak for windows but I guess it would do, too.

The only point of problem I see currently is that the devices do not seem to have an option to - in all kindness - force them to use 5g wifi when there is 2.4 and it has a wee bit more signal strength. So they mostly hang on 2.4g and once the music starts for the home-group wlan throughput maxes out.

I can tinker with wlan settings or use a smaller group of devices or dream of a real wifi router…
In other words, I’m quite happy with my choice.

Chromecasts have a channel to report the current app, so you can identify and then set the appropriate volume level on demand.

I call the Chromecast Audio attached to my Geneva XL “Barney”.

rule "Set volume on Barney"
when
    Item Chromecast_Barney_App changed
then
    //The only things I ever cast to Barney are Spotify and TuneIn/Default, so it's only necessary to call out Spotify.
    if (Chromecast_Barney_App.state == "Spotify")
    {
        //set the volume to 50% if it isn't already there
        if (Chromecast_Barney_Volume.state != 50) { Chromecast_Barney_Volume.sendCommand(50) }
    }
    //Everything else is set to 30%
    else
    {
        if (Chromecast_Barney_Volume.state != 30) { Chromecast_Barney_Volume.sendCommand(30) }
    }
end

It’s a little trickier with HDMI Chromecasts, because they have states that correspond to their backdrops. So, I flipped it around and called out some specific states, while including Spotify in the “everything else” condition.

The Chromecast attached to my bedroom TV is “Kirby”.

rule "Set volume on Kirby"
when
    Item Chromecast_Kirby_App changed
then
    //For radio or backdrop, set the volume to 10%
    if (Chromecast_Kirby_App.state == "Backdrop" || Chromecast_Kirby_App.state == "TuneIn Free" || Chromecast_Kirby_App.state == "Default Media Receiver")
    {
        if (Chromecast_Kirby_Volume.state != 10) { Chromecast_Kirby_Volume.sendCommand(10) }
    }
    //For all other apps, set the volume to 50%
    //Chromecasts go to Backdrop when not being used, and transition through UNDEF when starting/ending apps. We want to avoid changing volumes on UNDEF
    else if (Chromecast_Kirby_App.state != UNDEF) { Chromecast_Kirby_Volume.sendCommand(50) }
end

I arrived at 50% for Spotify by setting that as the cast volume and then adjusting the individual speakers so that the sound is balanced throughout my house. Then I repeated that for the other apps I use on devices and tweaked the rules accordingly. Then I put all of the remotes away so that I’ll never be tempted to change the volume with them.

The Cast multi-audio group averages the volumes of all group members. That’s why I chose Spotify to be 50%. It’s the app that I’m most likely to change the volume on regularly, and I know that everything starts at 50%.

For turning the devices on/off, I use the Chromecast “Idling” channel. When Idling is OFF, the Chromecast is working and openHAB switches the speaker on. When Idling is ON, the Chromecast is dormant and openHAB turns the speaker off after one minute.

1 Like

Check in your router if you can deny access to specific bands by MAC addresses.

You can cast from an Oculus Quest 2 VR headset to a Chromecast, but the connection will drop if one or the other switches networks. I fixed this at my sister’s house by denying both devices access to 2.4G.

I don’t think it has anything to do with the router or the number of devices on the network. As you’ve noted, Chromecasts just love to jump between bands.

Just adding a few bits of information for anyone interested:

a) There is a device called WiiM Mini, which is relatively cheap and does multi-room audio in a similar way to Chromecast. While it’s not Chromecast compatible, it’s compatible with Spotify Connect, Tidal Connect, TuneIn, Amazon etc. Haven’t used it, but it seemed like an interesting solution.

b) Instead of using a Chromecast + Audio extractor (since the Audio is dicontinued) I think it’s more convenient to use a Xiaomi Mi Box S, which is Chromecast compatible and has a 3.5mm, optical, USB (for use with a separate DAC) and HDMI outputs. It’s a single box, it’s got better quality compared to an extractor and it’s cheaper too. It’s what I currently use in my main system.

c) For guys with a local library like @rubens , there is always the option of roon. It’s not cheap, but it’s a very versatile solution which does multi-room, it works with local libraries, you can use Chromecasts as endpoints and loads more.

Another option is squeezeBox aka LogitechMediaServer. This is FOSS, written in Perl. It has a plugin castBridge which finds and connects chromecast Audio devices. Documentation is in parts outdated and confusing but I found .deb packages on Logitech Media Server Downloads and had success installing and running it from there, feeding my local collection to CC Audio groups.

Or use the official stable version… Index of /LogitechMediaServer_v8.3.1

As I started with smart home I used a setup with raspberry Pi’s too and rack mounted them
On software side I used GMrenderer-ressurect [Github]

Here is the complete project with HW described.