Xantech / Dayton Audio / Sonance multi-zone amps

Discussion thread for Xantech custom integration that supports various amps using variations of the Xantech multi-zone control protocol (including Monoprice, Daytona Audio, Sonance).

Supported Amplifiers

See pyxantech for a full list of supported hardware.

Manufacturer Model(s) Zones Supported Series Notes
Xantech MRAUDIO8X8 / MRAUDIO8X8m 6+2 YES xantech8 audio only; zones 7-8 are preamp outputs only
MX88a / MX88ai 8 YES xantech8 audio only; ai = Ethernet support (MRIP)
MRC88 / MRC88m 6+2 YES xantech8 audio + video; zones 7-8 are preamp outputs only
MX88 / MX88vi 8 YES xantech8 audio + video; vi = Ethernet support (MRIP)
CM8X8 / CM8X8DR 8 UNTESTED xantech8 commercial rack mount matrix controller (BNC)
ZPR68-10 6 UNTESTED zpr68-10 6-zone output; 8 source inputs
MRAUDIO4X4 / BXAUDIO4x4 4 NO N/A audio only; only supports IR control
MRC44 / MRC44CTL 4 NO N/A audio + video; only supprots IR control
Monoprice MPR-SG6Z / 10761 6 UNTESTED monoprice6 audio only
Dayton Audio DAX66 6 UNTESTED monoprice6 audio only
DAX88 6 YES dax88 audio only
Sonance C4630 SE / 875D SE / 875D MKII 4-6 UNTESTED sonance audio only

See also the Monoprice integration for Home Assistant community discussion.

3 Likes

Technically the Dayton Audio Dax88 is 8x8 matrix. 6 amped zones and two pre-amp. Inputs are 1-7 wired and zone 8 which is streaming services built in like Spotify.

Y’all rock!
I got this all setup with my Dayton Audio DAX88, and it’s working great!
Currently running 7 zones (6 powered from the DAX88, and another that’s the pre-amp out on the DAX88 into a little Fosi amplifier). Polk in-ceiling speakers inside, and Polk Atriums outside.

My UI isn’t quite at the level of @kbrown01, but that will come in time.
Thanks!

1 Like

Great to see another DAX88 user and what UI you put together. My house is under huge remodel, so my Xantech(s) are offline…haven’t experimented with a new UI yet, but I hope to do something similar to @kbrown01.

FYI, I do not think snapshot/restore feature EVER worked as from what I can tell it was never implemented fully. To avoid confusion, the service definitions should probably be removed from services.yaml until this is implemented in the future.

Has anyone ever had working snapshot/restore?

I was not looking at that, but I just forked the latest to see if I could fold in bass, treble, balance services. I am still trying to figure out Git and Python and how to test such things (pointers welcome).

But if would like to look at what I have so far through some differences, you could look here:

I took some inspiration from the monoprice-custom implementation but I an confused at that one as I see no need for entities for this, just services to call and set things or maybe I am confused.

I am also not sure if the max_bass, max_treble and max_balance are read from the actual model YAML, I assume they are. The Dax88 certainly has different values than other models. The Dax88 is:

  # FIXME: load these limits from protocol
  max_balance: 20
  max_bass: 24
  max_treble: 24
  max_volume: 38

I guess those should be changed in pyxantech.

1 Like

In looking at the code it seems to me it returns the status. If I set the log level to debug, I see this in log:

2022-08-18 11:09:16.519 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 11 (Kitchen) status update: {'zone': 1, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 4, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:16.987 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 12 (Living Room) status update: {'zone': 2, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 3, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:19.730 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 13 (Deck) status update: {'zone': 3, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 15, 'treble': 16, 'bass': 16, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:19.988 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 14 (Hot Tub) status update: {'zone': 4, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 10, 'treble': 20, 'bass': 15, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:22.177 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 15 (Patio) status update: {'zone': 5, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 21, 'bass': 16, 'balance': 14, 'source': 3, 'keypad': '01'}
2022-08-18 11:09:22.455 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 16 (Foyer) status update: {'zone': 6, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 16, 'bass': 17, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:22.853 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 17 (Master) status update: {'zone': 7, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 11:09:23.254 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 18 (Unused) status update: {'zone': 8, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 8, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 1, 'keypad': '01'}

And then after I turned music on a powered up a few zones:

2022-08-18 12:25:13.654 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 11 (Kitchen)
2022-08-18 12:25:13.654 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 12 (Living Room)
2022-08-18 12:25:13.654 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 13 (Deck)
2022-08-18 12:25:13.654 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 14 (Hot Tub)
2022-08-18 12:25:13.654 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 15 (Patio)
2022-08-18 12:25:13.655 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 16 (Foyer)
2022-08-18 12:25:13.655 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 17 (Master)
2022-08-18 12:25:13.655 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 18 (Unused)
2022-08-18 12:25:13.686 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 11 (Kitchen) status update: {'zone': 1, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 4, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:14.086 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 12 (Living Room) status update: {'zone': 2, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 3, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:14.488 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 13 (Deck) status update: {'zone': 3, 'unknown': '00', 'power': True, 'mute': False, 'do_not_disturb': '00', 'volume': 3, 'treble': 16, 'bass': 16, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:14.890 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 14 (Hot Tub) status update: {'zone': 4, 'unknown': '00', 'power': True, 'mute': False, 'do_not_disturb': '00', 'volume': 7, 'treble': 20, 'bass': 15, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:15.291 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 15 (Patio) status update: {'zone': 5, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 21, 'bass': 16, 'balance': 14, 'source': 3, 'keypad': '01'}
2022-08-18 12:25:15.694 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 16 (Foyer) status update: {'zone': 6, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 16, 'bass': 17, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:16.095 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 17 (Master) status update: {'zone': 7, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 24, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 8, 'keypad': '01'}
2022-08-18 12:25:16.496 DEBUG (MainThread) [custom_components.xantech.media_player] Xantech House Audio zone 18 (Unused) status update: {'zone': 8, 'unknown': '00', 'power': False, 'mute': False, 'do_not_disturb': '00', 'volume': 8, 'treble': 12, 'bass': 12, 'balance': 10, 'source': 1, 'keypad': '01'}

So I just assume you are talking about “snapshot-ing” the current state and the restoring it (as opposed to just reporting status)?

I would assume I could try calling the service now, changing things, and then call restore? I do not see what that would be used for unless you could save them with a name and restore those names (aka like some scene). And even more, I think the real value would be only if you could “snapshot” the whole receiver with some name and then “restore” the whole receiver from that same name. That would be an extremely valuable feature. A person could put on some music and adjust all the setting for power, volumes (and bass, treble, balance) that could be different in each zone. Snap that like a “scene”/“mood” and then create a button to restore that mood. That is similar in my GUI except I use an automation which adjusts those things individually. One command would be SO much better.

I would note that this is how the Insteon integration works. It allows you to create “scenes” (groups of lights/switches and their states on/brightness/etc.). Then there are services to execute scene_on and scene_off.

Last weeks I checked the code and discovered some small bugs and the reason why the restore gave errors. I bundled it all in a pull request and it works with my xantech setup

1 Like

Can I ask what it does and when/how it would be used? Is it just a singular save/restore? Or does it have the possibility of naming the saved states and restoring them by name?

Based on the interface and what I see in code, it is only a singular save for each zone (one state). Still trying to think how one would use that. How do you plan on using it?

What I would think we should look at is something like:

Save “Party Mode” …

Zone 1: vol 50%, bass …, treble …, input WifI
Zone 2: vol 50%, bass …, treble …, input WifI
Zone 3: vol 50%, bass …, treble …, input WifI
…

Or save “TV Mode”

Zone 1: vol25%, …
Zone 2: Off
Zone 3: Off
…

An ability to save and restire “scenes” in other words.

Right now, I have many of these built into automations that do it. If I could get rid of the automations with a simple one command restore, it would be very powerful.

In reality, I had just started to build something a bit different where you would keep the scenes in a JSON file and then use rest to read that to a sensor. Then write one (complex) automation that given an input name, would just run all the commands to set the vol, input and on/off state.

It makes a snapshot of the current running settings. It stores all attributes, and on restore it sets them back.
I am using my multizone amplifier to play the doorbell

  • Set the amplifier to the correct source

  • Set the amplifier at right volume level so doorbell is clearly recognizable

  • After doorbell is finished, restore amplifier to previous settings

I’m looking into a multiroom setup and using this looks great. @gsherman , @ryans I am thinking about getting the DAX88. I have a question about the 8 inputs. As I understand it there is 1 “dedicated Wi-Fi audio streaming channel”. Does this mean that you can only stream one service at a time? For example if I have a zone KITCHEN and a zone LIVINGROOM and I want to stream song A with my Spotify to KITCHEN, and my girlfriend wants to stream song B with her own Spotify (or Apple Music or other available service), to LIVINGROOM, is that possible? Or does 1 audio streaming channel mean that there can be at most 1 stream that you have to listen to in each zone if those zones are tuned to wifi channel?

Yes and no. You can use the built in streaming in the DAX unit for one source at a time. But you can also have different streaming services into other things … like Volumio or Alexa and plug those into a different input. To play Spotify on different zones you would also need two different accounts.

On my DAX, I have Alexa, Volumio, Home Assistant/Kodi on RCA inputs plus the wireless streaming. Volumio also has Spotify and Pandora

1 Like

Hope everyone is well, great job on this integration.
Is anyone successfully using the Dax88 with ethernet or is everyone using serial?

I have not tried ethernet but have a separate system with Home Assistant installed. I will give it a whirl and report back. I had a conference call with Parts Express/Dayton product team last week and was very impressed at their willingness to help if we get stuck.

Ask @mr_fixit … I think he got it working via IP. Not sure.

I ended up using a serial connection.

I think it was a discussion at Parts Express product comments about HA integration over the ethernet. My understanding that Dayton was considering HA support, but I don’t know what is the current state of this project.


Source: custom_components/xantech/media_player.py:291
Integration: Xantech/Dayton Audio/Sonance Multi-Zone Amps ([documentation](https://github.com/rsnodgrass/hass-xantech))
First occurred: October 28, 2022 at 9:15:45 PM (965577 occurrences)
Last logged: 7:42:26 PM

Missing key 'zone_status_skip' in dictionary 'dax88'; returning None

Anyone had similar warning in logs?

Everything has been working fine, but now HA is saying that my configuration is invalid, when I go to Developer Tools - Check and Restart - Check Configuration.

Configuration invalid!
Platform error media_player.xantech - Exception importing custom_components.xantech.media_player

Any ideas or suggestions?

I am also getting this error on the latest supervised HA, HACS and component.

Configuration invalid!
Platform error media_player.xantech - Exception importing custom_components.xantech.media_player
I had just installed the component in the last week or 2 and it stopped working. I am using a. ITachFlexIP to 232. I worked well until now. I also have this in the logs.

Traceback (most recent call last):
  File "/usr/src/homeassistant/homeassistant/loader.py", line 728, in get_platform
    cache[full_name] = self._import_platform(platform_name)
  File "/usr/src/homeassistant/homeassistant/loader.py", line 745, in _import_platform
    return importlib.import_module(f"{self.pkg_path}.{platform_name}")
  File "/usr/local/lib/python3.10/importlib/__init__.py", line 126, in import_module
    return _bootstrap._gcd_import(name[level:], package, level)
  File "<frozen importlib._bootstrap>", line 1050, in _gcd_import
  File "<frozen importlib._bootstrap>", line 1027, in _find_and_load
  File "<frozen importlib._bootstrap>", line 1006, in _find_and_load_unlocked
  File "<frozen importlib._bootstrap>", line 688, in _load_unlocked
  File "<frozen importlib._bootstrap_external>", line 883, in exec_module
  File "<frozen importlib._bootstrap>", line 241, in _call_with_frames_removed
  File "/config/custom_components/xantech/media_player.py", line 9, in <module>
    from pyxantech import async_get_amp_controller, SUPPORTED_AMP_TYPES, BAUD_RATES
  File "/usr/local/lib/python3.10/site-packages/pyxantech/__init__.py", line 10, in <module>
    from .config import (
  File "/usr/local/lib/python3.10/site-packages/pyxantech/config.py", line 84, in <module>
    DEVICE_CONFIG = _load_config_dir(f"{config_dir}/series")
  File "/usr/local/lib/python3.10/site-packages/pyxantech/config.py", line 30, in _load_config_dir
    for filename in os.listdir(directory):
FileNotFoundError: [Errno 2] No such file or directory: '/usr/local/lib/python3.10/site-packages/pyxantech/series'

Try reinstalling. It should pickup pyxantech 0.7.2 which includes the missing yaml file.