If you also have a never Triad Matrix Switch and not the old C4 version then this integration should help you out.
Hello @Otis and all,
I’m trying to configure your plug-in in bulk for a 8 zones amps, but for some reason I do not succeed very well. There’s probably something I’m missing big time, but after many attempts using different ways, I always end up with something that do not make sense. I would expect to see 8 entries at the end, but what I get is at best confusing to me ![]()
I posted a few images of what I’m doing:
And this is the end results:
Thank you
Hi @Jamon, thanks for letting me know! I have validated the problem by deleting all my devices and trying to add them back. The problem is that HA has changed the way they deal with certain device types. I am working on a fix.
In the future, it would be better to create an Issue in the Github repository.
Hello @OtisPresley
To be honest, I was really not thinking it was a bug, but the way I was using it.
I added it to Github. Next time I’ll log a bug report in GitHub like you suggested, I was not even aware this was a feature of GitHub!
Keep us posted when you have a new code to test it out.
Hello @OtisPresley. Just to let you know, I was now able to add all my zones and inputs using the latest version of the plug-in: it worked like a charm. I'm now able to use the system as expected.
I had Music Assistant installed, and to make it work using the same PC running HA, I used a Griffin iMic. I was not using the device anymore with my computer anyway. I plugged it in the PC, with a cable going to the first input of the control4 amp. Then I installed VLC player and selected the iMic as the destination. In the dashboard, I have all output zones grouped by their physical location, plus a widget for the MA controls.
I bought a year or so ago an IKEA SYMFONISK remote and it can control most of the functions in that dashboard (see picture).
To accomplish all of that integration, I used Claude Code with HA-MCP, and in just a few days, I'm up and running! I may need to tweak a few more things as I use it, but so far, I've accomplished a lot in just a matter of days.
Thank you again!
@Jamon, I am glad it is working as expected for you.
I have released a new version that adds max volume control, input gain configuration, implements code that captures the acknowledgement from the amp to make sure the command was successful, and adds 2 new services:
- Party Mode that syncs all your zones to the same source and volume
- Send Raw Command that allows you to send certain commands to your amp, such as
c4.amp.out 01 02
I also created a new card specifically for this integration, called Control4 Media Player Card, and am waiting for it to be added to HACS. It automatically discovers your zones and inputs from the integration, so configuration of the card is minimal. You map you inputs to media players for seamless switching.
Nicely done.
Hello Otis.
I saw the update just a few hours ago. Will give a try to the card tonight.
Do we need to download the card separately or it comes with the HACS plug in?
Tried the card, but it failed for me. Transmitted a bug report on Github.
I came across this while looking for a way to control the C4 Audio Matrix (C4-16ZAMSV3-B / AVM-16S1-B). I've noticed many others in this thread searching for the same,
This is great @OtisPresley . I love seeing how far this has come.
Going to try the card out as soon as I can get it in HACS.
Hi Folks,
I just wanted to share this JSON with everyone. It is every command and description I could find for Control4 Amps. Most of them do not work for my amp, and I have integrated all the ones that do into the integration. I hope it is helpful to someone.
Click here to expand the JSON code
{
"protocol_specification": {
"transport": "UDP",
"port": 8750,
"encryption": "none",
"line_termination": "\r\n",
"base_format": "0s[4_char_alphanumeric_sequencer][space][command_string][space][parameters]"
},
"commands": {
"system_power": {
"command": "c4.amp.psave",
"description": "Controls the main hardware power efficiency or standby processing states.",
"parameters": {
"set_active_run": "00 00",
"set_standby_sleep": "01 00"
},
"supports_get": true
},
"matrix_routing": {
"command": "c4.amp.out",
"description": "Binds a physical input RCA source channel to an independent zone audio output.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"source_input": "01-08 (2-digit Hex; 00 isolates/turns zone off)"
},
"supports_get": true
},
"volume_master": {
"command": "c4.amp.chvol",
"description": "Adjusts output volume level index for a specific zone using an internal byte offset calculation.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"volume_hex": "Formula: hex(percentage_value + 155). Range: 9B (0%) to FF (100%)"
},
"supports_get": true
},
"volume_ceiling": {
"command": "c4.amp.chvolmax",
"description": "Enforces a strict physical volume limit safety threshold per zone to safeguard hardware.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"volume_hex": "Formula: hex(percentage_value + 155)"
},
"supports_get": true
},
"mute_control": {
"command": "c4.amp.chmute",
"description": "Mutes or unmutes a zone output instantly without modifying the current volume index.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"unmute": "00",
"mute": "01"
},
"supports_get": true
},
"basic_eq_bass": {
"command": "c4.amp.chbass",
"description": "Adjusts low-frequency low-shelf boost or cut properties independently for a zone.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"gain_hex": "Hex representation mapping across a -12dB to +12dB window"
},
"supports_get": true
},
"basic_eq_treble": {
"command": "c4.amp.chtreble",
"description": "Adjusts high-frequency high-shelf boost or cut properties independently for a zone.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"gain_hex": "Hex representation mapping across a -12dB to +12dB window"
},
"supports_get": true
},
"balance_control": {
"command": "c4.amp.chbal",
"description": "Shifts structural stereo center bias balance properties between left and right speaker lines.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"bias_hex": "Hex balance representation shifting stereophonic soundstage weighting"
},
"supports_get": true
},
"topology_mode": {
"command": "c4.amp.chmode",
"description": "Configures channel audio processing modes to match specific speaker topologies.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"stereo": "00",
"mono_summed": "01",
"bridged_mono": "02"
},
"supports_get": true
},
"parametric_eq_gain": {
"command": "c4.amp.ch_eq_gain",
"description": "Modifies independent decibel cut or boost parameters for a specific parametric EQ band.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"band_index": "01-05 (2-digit Hex representing independent internal equalizer channels)",
"gain_hex": "Baseline offset mapping: 80 = 0dB (flat). Scale is 1 decibel per unit (e.g., 86 = +6dB, 74 = -12dB)"
},
"supports_get": true
},
"parametric_eq_frequency": {
"command": "c4.amp.ch_eq_freq",
"description": "Targets the exact center frequency spectrum processing location for a parametric EQ band.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"band_index": "01-05 (2-digit Hex)",
"frequency_hex": "2-byte hex mapping variable calculated over the 20Hz - 20000Hz frequency response curve"
},
"supports_get": true
},
"parametric_eq_q_factor": {
"command": "c4.amp.ch_eq_q",
"description": "Modifies the slope bandwidth sharpness (Quality Factor) shape calculation of an EQ band.",
"parameters": {
"zone_target": "01-08 (2-digit Hex)",
"band_index": "01-05 (2-digit Hex)",
"q_hex": "Hex value mapping across standard acoustic operational ranges from 0.5 to 10.0 (0e = 1.4 normal curve)"
},
"supports_get": true
},
"zone_linking": {
"command": "c4.amp.chlink",
"description": "Bridges zones inside hardware to mirror inputs/volume with zero processing latency.",
"parameters": {
"master_zone": "01-08 (2-digit Hex)",
"slave_zone": "01-08 (2-digit Hex)",
"unlink": "00",
"link": "01"
},
"supports_get": true
},
"input_gain_trim": {
"command": "c4.amp.ingain",
"description": "Calibrates source input voltage trim offsets before routing to prevent source sound discrepancies.",
"parameters": {
"input_target": "01-08 (2-digit Hex matching physical RCA input pairs)",
"trim_hex": "Baseline offset mapping: 80 = 0dB. Scale limits: 7A (-6dB) to 86 (+6dB)"
},
"supports_get": true
},
"signal_sensing": {
"command": "c4.amp.sigsense",
"description": "Activates or deactivates automated physical analog input electrical voltage presence monitoring.",
"parameters": {
"input_target": "01-08 (2-digit Hex)",
"disable": "00",
"enable": "01"
},
"supports_get": true
},
"front_panel_lockout": {
"command": "c4.amp.frontlock",
"description": "Disables local manual control over configuration menus on the physical chassis dial face.",
"parameters": {
"unlock": "00",
"lock": "01"
},
"supports_get": true
},
"network_ip_mode": {
"command": "c4.amp.ipmode",
"description": "Dictates whether the onboard LAN chip leverages dynamic server leases or internal network properties.",
"parameters": {
"dhcp_client": "00",
"static_fixed": "01"
},
"supports_get": true
},
"diagnostics_thermal": {
"command": "c4.amp.temp",
"description": "Reads operational diagnostic heat variables across amplifier circuit paths.",
"parameters": {},
"supports_get": true,
"get_only": true
},
"diagnostics_fault": {
"command": "c4.amp.fault",
"description": "Queries internal safety masks to identify active channel short-circuits or hardware failures.",
"parameters": {},
"supports_get": true,
"get_only": true
},
"maintenance_version": {
"command": "c4.amp.version",
"description": "Requests the raw build metadata information string matching active processor firmware revisions.",
"parameters": {},
"supports_get": true,
"get_only": true
},
"maintenance_reboot": {
"command": "c4.amp.reboot",
"description": "Forces an immediate soft restart of the embedded network control interface processing layer.",
"parameters": {},
"supports_get": false,
"action_trigger": true
},
"maintenance_factory_defaults": {
"command": "c4.amp.factory_defaults",
"description": "Clears user memory arrays, resetting network parameters, structural names, and EQ configurations.",
"parameters": {},
"supports_get": false,
"action_trigger": true
}
}
}
Thanks for sharing. I found that on my amp, adjusting the max volume sets it to the max volume on the next power-on.
My wife was not amused ![]()
Oh wow! I am so sorry to hear that. Actually, I am now seeing this behavior too. I will look into it.
@OtisPresley you really heard Hansen8601 wife? That was crazy loud then. ![]()
![]()
![]()
More seriously, I tried the new card, and the bug I reported was resolved. Now I see things that make sense. I’m not sure if I’ll use it as the dashboard Claude built for me is working fine and it’s more granular per zone as would be my use case.
Claude also built some scripts that call your integration to activate zones or change the source. That’s working fine too, but when testing it (ON then OFF), if I do it too quickly (in less than 10-15 seconds) sometimes it gets a miss. But in normal use case it doesn’t matter.
Very nice job, thank you for this work you did
Hi, I just caught up with this and remembered I had some code from about 10 years ago when I intercepted some of the matrix amp commands. They may already be covered and may be completely out of date but thought I'd share the ones I found that are not in the json above. If no use please ignore. Most of them seem the same as the ‘ch’ versions:
c4.amp.digi 01 00 Turn Amp On
c4.amp.digi 01 01 Turn Amp Off
c4.amp.mute {0} 01 Mute
c4.amp.mute {0} 00 Unmute
c4.amp.trebgain {0} {1} Set treble
c4.amp.ptreble {0} 01 Treble Up
c4.amp.ptreble {0} ff Treble down
c4.amp.bassgain {0} {1} Set bass
c4.amp.pbass {0} 01 Bass Up
c4.amp.pbass {0} ff Bass Down
c4.amp.bal {0} {1} Set balance
Hope they are useful.
Cheers
Thank you @MartiniX! This turned out to be extremely helpful! All of them work on my amp except for Turn Amp On/Off, so I implemented these things into the integration as Optional per-zone parameters.
I have released v2.3.2 that fixes the UDP response bug causing 2 second delays. Also via the options, you can enable the EQ parameters, which will give you controls for Balance, Bass gain, and Treble gain, which can also be enabled on all other zones at once. YMMV as your firmware may not support these options. They all work on mine.
@Hansen8601, the max volume fix turned out to be a firmware bug in my amp and probably yours too where when you set chmaxvol, the amp sets chvol to your max volume setting. The integration now works around this by ONLY setting and enforcing this in HA until you turn the zone OFF; then it will set it in hardware on the amp.
Enjoy everyone!
Thank you for the persistent states! This is something that's always caused me to delay restarts or upgrades. I love it.
"Active player states (on/off, volume, active input source, mute) and configuration sliders are perfectly preserved across Home Assistant reboots."
No problem @Hansen8601! I have always hated that too and was able to get rid of all my helpers and startup script for it.
If you ever feel like the scripts are getting a bit chunky, I found it helps to break them into small helpers and then call those from HA automations. Makes it way easier to swap zones or tweak volume logic without hunting through a giant file. Also, if your tuner exposes any odd serial quirks, a quick USB serial dump can save a lot of head scratching later.





