With the recent announcement that Music Assistant (MA) has been gifted to the Open Home Foundation and is to become a core component of the Home Assistant ecosystem, has there been any thought on implementing first-class support for AmpliPi controllers in MA?
I get the feeling that MA is going to become a very big part of HA in the coming months/years and having support for AmpliPi controllers might be the icing on the cake in terms of a standardised and easy-to-use control layer.
The current HA integration is functional but it is not very user-friendly for a non-techy person - i.e. partners and children. Having a single pane of glass for searching and selecting music (i.e. MA) which you can then send to any device in your smart home (including AmpliPi zones) would be the holy grail IMO.
Interested to hear if there are others who use MA or are considering switching to it in this group?
I can share that we definitely are interested, though I haven’t looked into this far enough to be able to tell you what demands this would make on our end to give a proper time estimate. Currently we’re giving the HA plugin some general polish and once we’re done with the more general fixes this is one of the higher-priority next steps after that!
I’ve been using it through the LMS/Squeezebox/Slimproto integration.
Overall, it works pretty well, there is one major bug that needs addressed, if my Home Assistant was running on a Pi, it would absolutely destroy the SD Card.
Interesting, how do you have your system setup exactly? I am running LMS on a different machine, with an LMS client on my AmpliPi. That all works pretty well, but if I try and add the SlimProto integration to MA it doesn’t find any players or devices.
Thanks for the details. For some reason it is not working for me.
With your setup like this, you can easily send music to be played on your AmpliPi stream (using MA), but how do you control which zones are playing that stream?
Does that still need to happen thru the AmpliPi app or do you use HA?
I exclusively use HA. I rarely go into the AmpliPi interface.
In HA, there’s a media_player entity for the LMS client that was configured and all the zones have media_player entities. In HA I automate setting the Source on the Zone, using its media_player entity, to be the LMS client and that’s how I do any grouping I need to do.
Ok cool - I can see how you can do all that using hand-cranked automations, but how do your users interact with the system - i.e. partners, children, guests?
It is quite convoluted getting them to select something in Music Assistant to send to the LMS client (i.e. AmpliPi source) and then they have to move to Home Assistant to select which zones are playing that source.
I have been trying to come up with a streamlined way for non-techie users to easily control the music in our house and have been struggling . Very interested to hear how others might have solved this tho.
I’m trying to come up with ways where I could ask Siri to play audio in certain rooms through HA…it’s been hard to figure out and I’m not being super successful yet. I’d love to be able to say “Play Spotify in the Living Room at 50%” or something like that and it would play the spotify source in the living room at 50% volume.
Were you ever able to get this working reliably? I’m diving more into MA now, but I’m really unclear on the best way to use this with the Amplipi. I have 6 zones in my Amplipi and have the integration setup in HA, so I see those all as media_player entities (for example, media_player.kitchen_speakers). When I play from MA to this zone, I get output on the speakers, but back in HA the media_player is idle and I see something playing on a different entity (media_player.amplipi_kitchen_2- not sure where this came from). When I look at the MA integration:
I want to use the state to flex my dashboards. Meaning, if I’m playing music to media_player.kitchen_speakers, then activate a view on the kitchen tablet that shows MA. However, it shows idle, even though music is coming out of the speakers. If I look in MA at the same time:
It shows 00:00 the whole track. The next track will start and MA doesn’t even advance to show that. I should note, if I use MA locally to my computer, it works fine.
It feels very disjointed at this point. But perhaps I have screwed it up 10 time over trying to get it to work reliably.
I haven’t had any luck getting this to work either. I gave up months ago. And now that Spotify won’t play I can pretty much only listen to online radio via my AmpliPi.
I can “send” audio to it from MA, but it’s incredibly unreliable. The information that MA has about the media is not always correct and I can’t pause/ resume from the main MA interface. In an ideal state, we would be able to use the MA interface to send to various amplipi zones, but at a minimum, I should be able to send generically to my amplipi and control media playback via MA, even if I have to use the amplipi interface to set zones.
I recently tried adding a USB DAC on my HA server and routed that into the RCA inputs on my amplipi. I had to add the VLC integration in HA to make a media_player entity, and this seems to work. Though the audio quality is terrible. Not sure if that’s the cabling, or what, I haven’t done any troubleshooting on that yet. But at least I can pause the music that starts.
I would love to see some basic support of MA enabled.
I’m not sure how this community feels about AI coding, but I spent the last two days making an HA integration and MA media player with the help of gpt-5.3-codex. I’ve got it to a point that I can reliably initiate music from MA to a zone, add a speaker to that zone in the MA interface, pause, resume, volume change, power off (mute and detach the zone), remove a speaker, etc.
In order to test this, I had to setup MA as a standalone docker container vs the HA add-on. I just went through the effort of pointing my HA/MA integration to the IP of my docker host vs the add-on and it seems to be working fairly well that way too. Will try to keep testing over the weekend.
I’m happy to hand this over to the Amplipi team if you want to release an actual MA player provider. I’m also fully aware that what I mostly did was write requirements and acceptance criteria, then perform testing - not trying to claim some amount of development.
Just a quick update. I’ve done a lot of testing over the last few days. I think it’s in fairly decent shape, but I do think there’s an architectural problem that could cause some issues later one. Perhaps someone from the amplipi team might have feedback.
When a queue finishes (gets to the last item), the amplipi asks MA for the flac file again. Here are the logs from MA running my provider code.
This is a track starting:
2026-03-03 21:56:33.871 DEBUG (MainThread) [music_assistant.audio] Getting streamdetails for library://track/5038
2026-03-03 21:56:33.876 DEBUG (MainThread) [music_assistant.audio] retrieved streamdetails for library://track/5038 in 5 milliseconds
2026-03-03 21:56:33.979 DEBUG (MainThread) [music_assistant.amplipi] [zone=2 name=Office] action=power requested=True sync_leader=None
2026-03-03 21:56:34.133 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API request: PATCH /api/zones/2 payload={'source_id': 0, 'mute': False}
2026-03-03 21:56:34.325 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API response: PATCH /api/zones/2 keys=['groups', 'info', 'presets', 'sources', 'streams', 'version', 'zones']
2026-03-03 21:56:34.326 DEBUG (MainThread) [music_assistant.amplipi] [zone=2 name=Office] action=play_media_start uri=http://192.168.0.113:8097/flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac sync_leader=None
2026-03-03 21:56:34.464 DEBUG (MainThread) [music_assistant.amplipi] [zone=2 name=Office] action=play_media_source_selected selected_source_id=0 current_zone_source=0 preferred_source_id=0
2026-03-03 21:56:34.464 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API request: POST /api/play payload={'media': 'http://192.168.0.113:8097/flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac', 'source_id': 0}
2026-03-03 21:56:34.799 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API response: POST /api/play keys=['groups', 'info', 'presets', 'sources', 'streams', 'version', 'zones']
2026-03-03 21:56:34.799 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API request: PATCH /api/zones/2 payload={'source_id': 0, 'mute': False}
2026-03-03 21:56:34.907 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API response: PATCH /api/zones/2 keys=['groups', 'info', 'presets', 'sources', 'streams', 'version', 'zones']
2026-03-03 21:56:34.998 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API request: POST /api/streams/1177/play payload={}
2026-03-03 21:56:35.094 DEBUG (MainThread) [music_assistant.amplipi] AmpliPi API response: POST /api/streams/1177/play keys=['groups', 'info', 'presets', 'sources', 'streams', 'version', 'zones']
2026-03-03 21:56:35.581 DEBUG (MainThread) [music_assistant.streams] Got GET request to /flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac from 192.168.0.10
2026-03-03 21:56:35.583 DEBUG (MainThread) [music_assistant.streams] Start serving Queue flow audio stream for Office
2026-03-03 21:56:35.583 DEBUG (MainThread) [music_assistant.audio] Generated ffmpeg params for player amplipi_zone_2: ['alimiter=limit=-2dB:level=false:asc=true']
2026-03-03 21:56:35.585 INFO (MainThread) [music_assistant.streams] Start Queue Flow stream for Queue Office - crossfade: disabled
2026-03-03 21:56:35.586 DEBUG (MainThread) [music_assistant.streams] Start Streaming queue track: filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac (Foy Vance - Good Time Southern Soul) for queue Office
2026-03-03 21:56:35.586 DEBUG (MainThread) [music_assistant.streams] Starting queue item stream for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) - using buffer: False - using fade-in: False - using volume normalization: measurement_only
2026-03-03 21:56:35.587 DEBUG (MainThread) [music_assistant.audio.media_stream] Started media stream for filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac - using streamtype: local_file - pcm format: f32le - ffmpeg PID: 42
2026-03-03 21:56:35.599 DEBUG (MainThread) [music_assistant.streams] Got GET request to /flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac from 192.168.0.10
2026-03-03 21:56:35.602 DEBUG (MainThread) [music_assistant.streams] Start serving Queue flow audio stream for Office
2026-03-03 21:56:35.602 DEBUG (MainThread) [music_assistant.audio] Generated ffmpeg params for player amplipi_zone_2: ['alimiter=limit=-2dB:level=false:asc=true']
2026-03-03 21:56:35.605 INFO (MainThread) [music_assistant.streams] Start Queue Flow stream for Queue Office - crossfade: disabled
2026-03-03 21:56:35.605 DEBUG (MainThread) [music_assistant.streams] Start Streaming queue track: filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac (Foy Vance - Good Time Southern Soul) for queue Office
2026-03-03 21:56:35.605 DEBUG (MainThread) [music_assistant.streams] Starting queue item stream for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) - using buffer: False - using fade-in: False - using volume normalization: measurement_only
2026-03-03 21:56:35.607 DEBUG (MainThread) [music_assistant.audio.media_stream] Started media stream for filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac - using streamtype: local_file - pcm format: f32le - ffmpeg PID: 58
2026-03-03 21:56:35.608 DEBUG (MainThread) [music_assistant.audio.media_stream] First chunk received after 0.02 seconds (codec detected: flac)
2026-03-03 21:56:35.608 DEBUG (MainThread) [music_assistant.streams] First audio chunk received for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) after 0.02 seconds
2026-03-03 21:56:35.629 DEBUG (MainThread) [music_assistant.audio.media_stream] First chunk received after 0.02 seconds (codec detected: flac)
2026-03-03 21:56:35.629 DEBUG (MainThread) [music_assistant.streams] First audio chunk received for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) after 0.02 seconds
2026-03-03 21:56:35.665 DEBUG (MainThread) [music_assistant.streams] stream aborted for filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac in 0.08 seconds - seconds streamed/buffered: 10.00
The stream shows as finishing, but the track still has ~30 seconds to go. I’m assuming this is because the amplipi has cached it:
2026-03-03 21:58:19.236 DEBUG (MainThread) [music_assistant.streams] stream finished for filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac in 103.63 seconds - seconds streamed/buffered: 141.89
2026-03-03 21:58:20.260 DEBUG (MainThread) [music_assistant.streams] Finished Streaming queue track: filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac (Foy Vance - Good Time Southern Soul) on queue Office
2026-03-03 21:58:20.260 INFO (MainThread) [music_assistant.streams] Finished Queue Flow stream for Queue Office
The amplipi then sends a new GET request. The track is still playing:
2026-03-03 21:58:51.505 DEBUG (MainThread) [music_assistant.streams] Got GET request to /flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac from 192.168.0.10
2026-03-03 21:58:51.507 DEBUG (MainThread) [music_assistant.streams] Start serving Queue flow audio stream for Office
2026-03-03 21:58:51.507 DEBUG (MainThread) [music_assistant.audio] Generated ffmpeg params for player amplipi_zone_2: ['alimiter=limit=-2dB:level=false:asc=true']
2026-03-03 21:58:51.509 INFO (MainThread) [music_assistant.streams] Start Queue Flow stream for Queue Office - crossfade: disabled
2026-03-03 21:58:51.509 DEBUG (MainThread) [music_assistant.streams] Start Streaming queue track: filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac (Foy Vance - Good Time Southern Soul) for queue Office
2026-03-03 21:58:51.509 DEBUG (MainThread) [music_assistant.streams] Starting queue item stream for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) - using buffer: False - using fade-in: False - using volume normalization: measurement_only
2026-03-03 21:58:51.510 DEBUG (MainThread) [music_assistant.audio.media_stream] Started media stream for filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac - using streamtype: local_file - pcm format: f32le - ffmpeg PID: 92
2026-03-03 21:58:51.522 DEBUG (MainThread) [music_assistant.audio.media_stream] First chunk received after 0.01 seconds (codec detected: flac)
2026-03-03 21:58:51.522 DEBUG (MainThread) [music_assistant.streams] First audio chunk received for Foy Vance - Good Time Southern Soul (filesystem_smb--FT3LAw3o://track/Foy Vance - 2019 - From Muscle Shoals/07. Good Time Southern Soul.flac) after 0.01 seconds
2026-03-03 21:58:55.410 DEBUG (MainThread) [music_assistant.amplipi] [zone=2 name=Office] replay_guard armed media_uri=http://192.168.0.113:8097/flow/KijVEgEx/amplipi_zone_2/3a68869b45c74cbdab20e899c750413e.flac
This is when the track stops and then starts over again.
I added logic so that replay_guard actually just stops the amplipi and it seems to work. I guess the core issue is that the amplipi is just getting a stream of a flac and has no idea of the content? So my player provider can’t poll that to find out that it’s stopped. I’m thinking/ assuming the best way to approach that is to create a new stream type in amplipi for Music Assistant vs using the External Media type.
However, this does seem to at least work better than it was before.
EDIT (because I can’t reply to myself 3 times )
I’ll share my repo tomorrow if you’re open for testing it. Tonight I was playing music and noticed that when an announcement came in, the MA integration muted the music, the announce played, but then no music (it was still playing, just muted). I’ll see if I can figure out how to basically work around that. I assume the MA integration polls the Amplipi and sees the zone was detached from the source and then mutes it. Maybe I can trigger based on the zone being re-attached to the source, to unmute…
EDIT Again:
It’s not perfect, there are times when it gets to the end of the queue and just keeps playing, not sure why, but I might try to figure that out at some point. I made the git public, which I’ve never done before, so hopefully I didn’t screw it up. Let me know if you’re able to get it working. I have Music Assistant 2.7.10 with this, fyi: