Home Assistant direct control of Control4 AMP and Tuner (no plugin needed)

One other thing I need to figure out is how to make the Hone Assistant media player be able to stream music to the line out of the PC. That will make it a very nice streamer for music I could copy on the SSD of the PC. If anyone have a way, let me know. So far I haven’t found my answer.

Im looking for a solution for that as well. Have HA running on a decently powerful PC platform and should be able to stream music to the L+R audio outputs. The PC audio outputs would then connect to a line input of the Control4 Matrix switch. Similar to the way the Control4 HC800 has two L+R line outputs for connection to the matrix switch. Does anyone know of a way to do this that would also work with Music Assistant? I searched and found reference to VLC, but wondering if there are simpler solutions for streaming media to the PC hosts built in audio line outputs…

For this, you could use something as simple as this from Amazon, if you don’t already have RCA outputs, to convert audio out to RCA via USB on your PC and then plug it into an input on the Matrix Amp. And then you can use something like System Bridge to integrate the PC with HA to have some level of control over it via automation.

For me, I have an Echo Dot with a 3.5mm to RCA cable plugged into the Matrix Amp and can use it in automations to play media from Amazon Music and Pandora via that device. You should also check out the Music Assitant addon for HA that supports several streaming services and can play media on some HA media players.

I also have a 3.5mm to RCA cable from my HA NUC box to the Matrix Amp so I can use like VLC Telnet to play media from HA, like doorbell sounds and announcements via CloudSay.

For anyone interested, I forked @Hansen8601’s repository and moved everything to HACS and GUI configuration, so no more configuration.yaml. You need 1 edit per channel for the integration to automatically migrate your configuration.yaml entries to the GUI with unique id’s. Please open an issue if you have any problems.

Thank you @Hansen8601 for all your work!

Control4 Media Player

Nicely done… glad to see continuing the work.

And thank you @bigmac of course! You started it all!

Sharing is the name of the game… it all works when we share.

The original took me over 2 weeks to capture and decipher just the commands coming from the C4 controller, but that was done in anger because of the excessive cost of C4 and how locked down the system is/was.

It was fun to break into it.

Thank you, Otis! This is something I’ve wanted to do for a long time, but never put in the effort to get it done. I love seeing it available to more HA users!

I bet it was!

You’re welcome @Hansen8601!

This is a long and old thread and I haven’t read all of it, but I think that my contribution is in the right ballpark (but apologies if it’s a little off topic!)

I’m migrating off of Control4 and one of the things I needed was for HA to control my Triad 8x8 AMS. I couldn’t find anything that would work so I’ve coded up a custom integration which is now in HACS.

You can try it out here. I only have an 8x8 so that’s what I’ve tested it on but it seems pretty solid so far! Bugs/feedback/PRs welcome…

Great work @bharat! Thanks for contributing to the community.

Would this work with Control4 C4-16S2-E-B Matrix?

possibly? I don’t have one of those so I haven’t tested it out. If you try it and hit issues, let me know and I can work with you to get it working for you.

Just have to mention up front. I’m not a coder but can follow instructions well and am willing to learn. I downloaded the file from HACS and installed the integration. Although the C4-16S2-E-B Matrix is a 16x16 I started with a 8x8 setup. After a restart the entity showed up. Tried powering on but nada. It shows as powered on in HA but not on the Matrix. When I try to turn off via HA it doesnt do anything either in HA or on the Matrix. I should note all works when I do it manually.

Has anyone gotten the C4-16S2-E-B Matrix to work in HA?

I appreciate the help. I did not do anything in the .yaml.

Let’s see what we can figure out. The first thing to do is to enable debugging and see if we can get that to give us some useful information.

Once this is enabled, you can either grep your home-assistant.log or, if you don’t know what that is, try a few operations and then disable debug logging and it’ll download a log file for you. Search that log file for lines that contain triad_ams and you’ll see lines like this:

2025-12-08 09:03:05.417 DEBUG (MainThread) [custom_components.triad_ams.connection] Sending raw bytes: ff5504031ef503
2025-12-08 09:03:05.518 DEBUG (MainThread) [custom_components.triad_ams.connection] Raw response: b'Get Out[4] Volume : -45.9\x00'
2025-12-08 09:03:05.673 DEBUG (MainThread) [custom_components.triad_ams.connection] Sending raw bytes: ff55040317f503
2025-12-08 09:03:05.776 DEBUG (MainThread) [custom_components.triad_ams.connection] Raw response: b'Get Out[4] Mute status : Unmute\x00'
2025-12-08 09:03:05.927 DEBUG (MainThread) [custom_components.triad_ams.connection] Sending raw bytes: ff5504031df503
2025-12-08 09:03:06.029 DEBUG (MainThread) [custom_components.triad_ams.connection] Raw response: b'Get Out[4] Input Source : input 3\x00'

Share those lines here and let’s look at it together.

2025-12-10 09:52:37.162 ERROR (MainThread) [custom_components.triad_ams.models] Failed to turn off output 1
Traceback (most recent call last):
  File "/config/custom_components/triad_ams/models.py", line 163, in turn_off
    await self.coordinator.disconnect_output(self.number)
  File "/config/custom_components/triad_ams/coordinator.py", line 212, in disconnect_output
    await self._execute(lambda c: c.disconnect_output(output_channel))
  File "/config/custom_components/triad_ams/coordinator.py", line 165, in _execute
    return await future
           ^^^^^^^^^^^^
  File "/config/custom_components/triad_ams/coordinator.py", line 114, in _run_worker
    await self._ensure_connection()
  File "/config/custom_components/triad_ams/coordinator.py", line 100, in _ensure_connection
    await asyncio.wait_for(self._conn.connect(), timeout=5)
  File "/usr/local/lib/python3.13/asyncio/tasks.py", line 507, in wait_for
    return await fut
           ^^^^^^^^^
  File "/config/custom_components/triad_ams/connection.py", line 37, in connect
    self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/streams.py", line 48, in open_connection
    transport, _ = await loop.create_connection(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        lambda: protocol, host, port, **kwds)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1171, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1146, in create_connection
    sock = await self._connect_sock(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
        exceptions, addrinfo, laddr_infos)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1045, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.13/asyncio/selector_events.py", line 641, in sock_connect
    return await fut
           ^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/selector_events.py", line 681, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('192.168.1.243', 52000)
2025-12-10 09:52:40.651 INFO (MainThread) [custom_components.triad_ams.media_player] Turning OFF output 2
2025-12-10 09:52:40.657 WARNING (MainThread) [custom_components.triad_ams.coordinator] Command failed; dropping and reopening connection: [Errno 111] Connect call failed ('192.168.1.243', 52000)
2025-12-10 09:52:40.661 WARNING (MainThread) [custom_components.triad_ams.coordinator] Reconnect attempt failed (will retry on next command): [Errno 111] Connect call failed ('192.168.1.243', 52000)
2025-12-10 09:52:40.662 ERROR (MainThread) [custom_components.triad_ams.models] Failed to turn off output 2
Traceback (most recent call last):
  File "/config/custom_components/triad_ams/models.py", line 163, in turn_off
    await self.coordinator.disconnect_output(self.number)
  File "/config/custom_components/triad_ams/coordinator.py", line 212, in disconnect_output
    await self._execute(lambda c: c.disconnect_output(output_channel))
  File "/config/custom_components/triad_ams/coordinator.py", line 165, in _execute
    return await future
           ^^^^^^^^^^^^
  File "/config/custom_components/triad_ams/coordinator.py", line 114, in _run_worker
    await self._ensure_connection()
  File "/config/custom_components/triad_ams/coordinator.py", line 100, in _ensure_connection
    await asyncio.wait_for(self._conn.connect(), timeout=5)
  File "/usr/local/lib/python3.13/asyncio/tasks.py", line 507, in wait_for
    return await fut
           ^^^^^^^^^
  File "/config/custom_components/triad_ams/connection.py", line 37, in connect
    self._reader, self._writer = await asyncio.open_connection(self.host, self.port)
                                 ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/streams.py", line 48, in open_connection
    transport, _ = await loop.create_connection(
                   ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
        lambda: protocol, host, port, **kwds)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1171, in create_connection
    raise exceptions[0]
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1146, in create_connection
    sock = await self._connect_sock(
           ^^^^^^^^^^^^^^^^^^^^^^^^^
        exceptions, addrinfo, laddr_infos)
        ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/base_events.py", line 1045, in _connect_sock
    await self.sock_connect(sock, address)
  File "/usr/local/lib/python3.13/asyncio/selector_events.py", line 641, in sock_connect
    return await fut
           ^^^^^^^^^
  File "/usr/local/lib/python3.13/asyncio/selector_events.py", line 681, in _sock_connect_cb
    raise OSError(err, f'Connect call failed {address}')
ConnectionRefusedError: [Errno 111] Connect call failed ('192.168.1.243', 52000)

This is the key problem right now. Either your IP is wrong, or there isn’t a path to that IP, or it’s not listening on that port.

From the homeassistant instance can you ping that IP address and/or verify that it’s correct?

If it is correct, then your device isn’t listening on port 52000 and either (a) it’s listening on some other port in which case we need to figure out what that is or (b) it doesn’t speak this protocol at all which means that this integration isn’t going to work for you, at least not without meaningful alterations.

Like everyone else I’m trying to go away from C4, but all I want to keep working is my C4 8 zone amp.

Where do I start, which GitHub has the most updated integration as I see a lot of work has been done?

Thanks all!

Depends on which amp you have as to which version you use… my original code is for the old original version, and the later stuff is for the newest version.