Xantech / Dayton Audio / Sonance multi-zone amps

The new tag (0.1.3) worked for me, in that I get the correct contents in custom_configs/xantech

But upon reboot I get this error in the logs:

 Requirements for xantech not found: ['pyxantech>=0.8.0']

When I write

pip install pyxantech

In my terminal it gives me 0.7.2.

If I try to manually install 0.8.0 I get:

╰─❯ pip install pyxantech==0.8.0
Collecting pyxantech==0.8.0
  Using cached pyxantech-0.8.0-py3-none-any.whl.metadata (10 kB)
Requirement already satisfied: pyserial>=3.4 in /opt/homebrew/Caskroom/miniconda/base/envs/merge-merge/lib/python3.12/site-packages (from pyxantech==0.8.0) (3.5)
Requirement already satisfied: pyserial-asyncio>=0.4 in /opt/homebrew/Caskroom/miniconda/base/envs/merge-merge/lib/python3.12/site-packages (from pyxantech==0.8.0) (0.6)
INFO: pip is looking at multiple versions of pyxantech to determine which version is compatible with other requirements. This could take a while.
ERROR: Could not find a version that satisfies the requirement libcst.tests.pyre (from pyxantech) (from versions: none)
ERROR: No matching distribution found for libcst.tests.pyre

@sorrygofish try updating 0.1.3 again, it should pull in pyxantech 0.8.1. I removed pyre dependency (not sure why that was there, but it was added 2 years ago). I suspect it should work now.

Yep. Version bumps worked for me. Thanks so much for the quick iteration! Cheers.

Just a friendly poke that I have a PR out there on the pyxantech library for you with (hopefully) fixes for Sonance.

Hi
I’ve been playing around with this for a while now and got my first DAX88 working over the USB-Serial adapter. Now my question is how do I setup my second DAX88 unit with zones 21-28. Ive tried around a bit and cant seem to get it to work. Obviously it will need to be pointed to another USB port.

media_player:
  - platform: xantech
    type: dax88
    port: /dev/ttyUSB3
    zones:
      11:
        name: "Office"
      12:
        name: "Kitchen"
      13:
        name: "Dining room"
      14:
        name: "Master bed"
      15:
        name: "Master bath"
      16:
        name: "Upstairs hall"
      17:
        name: "Deck side"
      18:
        name: "Deck front"

    port: /dev/ttyUSB4
    zones:
      21:
        name: "Enno's room"
      22:
        name: "Finn's room"
      23:
        name: "Laundry room"
      24:
        name: "Brewery"
      25:
        name: "Zone 5"
      26:
        name: "Zone 6"
      27:
        name: "Garage"
      28:
        name: "Living room"
    sources:

I’ve tried this but it didnt work.
Any help is appreciated.

I can look at it over this weekend. When i put together the files to enable the Dax, i noted it was for one unit. Should not be hard to add for three

sounds good,
it finds those zones but if I klick the button to turn them on i get
“Failed to perform the action media_player/turn_on. unknown error”
not sure if this might help you.

You are daisy-chaining them correct? Not two independent units. Check the installation of pyxantech. The limits are set like to “8” … I do no have another unit to test. Others like monoprice have 1-38, Dayton/DAX says 1-8.

Check in these folders.

I see here:

- series: dax88
  name: "Dax 88 8-Zone Amp"

  supported:
    - manufacturer: "Dayton Audio"
      model: "DAX88"

  features:
    zones: 8
    sources: 8

  # FIXME: switch code to features
  num_zones: 8
  num_sources: 8
  max_amps: 3
 ...

and here:

# FROM @kbrown01


- protocol: dayton
  name: "Dayton Audio 8-Zone Amp Protocol" #Same as monoprice with extra zones

  connection:
    rs232:
      baud: 9600
      data: 8
      parity: N
      stop: 1

  limits:
    volume:
      min: 0
      max: 38
    treble:
      min: 0
      max: 14
    bass:
      min: 0
      max: 14
    balance:
      min: 0
      max: 20
    source: # technically limited by hardware series yaml, not protocol
      min: 1
      max: 8
    zone: # technically limited by hardware series yaml, not protocol
      min: 1
      max: 8

WARNING: There could be things here not in your file as I have implemented bass, treble and balance also in my version. I originally created those files for the Dayton/DAX88.

I am only a hack, @ryans maybe is better to figure out where. Not sure. As I said, I do not have a second unit to test.

Hi, hoping for some help
I have a Monoprice 10761 6 zone amp. It has been connected to HA with RS232 to Usb and works with the monoprice integration on baremetal core install in venv, python 3.13, and core 25.2.0b2 I wanted to try the Xantech Integration to get Balance/Base/Treble controls, so I disabled the monoprice and installed Xantech from HACS, this is Config:

  - platform: xantech
    type: monoprice6
    port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B0028Y58-if00-port0
    #/dev/ttyUSB0
    zones:
      11:
        name: "Kitchen Great Room"
      12:
        name: "2"
      13:
        name: "3"
      14:
        name: "4"
      15:
        name: "5"
      16:
        name: "Server Desk"
    sources:
      1:
        name: "Squeezelite"
      2:
        name: "2"
      3:
        name: "3"
      4:
        name: "4"
      5: 
        name: "5"
      6:
        name: "HDMI"

The integration loads, zone entities setup, but do not work
One error in log

This error originated from a custom integration.
Logger: custom_components.xantech.media_player
Source: custom_components/xantech/media_player.py:323
integration: Xantech/Dayton Audio/Sonance Multi-Zone Amps (documentation)
First occurred: 2:11:49 PM (2127 occurrences)
Last logged: 3:10:39 PM
Failed updating Xantech House Audio zone 12 (2): 'NoneType' object has no attribute 'groupdict'
Failed updating Xantech House Audio zone 13 (3): 'NoneType' object has no attribute 'groupdict'
Failed updating Xantech House Audio zone 14 (4): 'NoneType' object has no attribute 'groupdict'
Failed updating Xantech House Audio zone 15 (5): 'NoneType' object has no attribute 'groupdict'
Failed updating Xantech House Audio zone 16 (Server Desk): 'NoneType' object has no attribute 'groupdict'

I enabled debug logging, and the gist of it is zone updates are failing:

2025-01-31 14:09:48.716 WARNING (ImportExecutor_0) [homeassistant.helpers.typing] HomeAssistantType was used from xantech, this is a deprecated alias which will be removed in HA Core 2025.5. Use homeassistant.core.HomeAssistant instead, please report it to the author of the 'xantech' custom integration
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating zone media players for xantech8 'Xantech House Audio'; sources={1: 'Squeezelite', 2: '2', 3: '3', 4: '4', 5: '5', 6: 'HDMI'}
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 11 (Kitchen Great Room) media player
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 12 (2) media player
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 13 (3) media player
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 14 (4) media player
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 15 (5) media player
2025-01-31 14:09:48.782 INFO (MainThread) [custom_components.xantech.media_player] Creating Xantech House Audio zone 16 (Server Desk) media player
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 11 (Kitchen Great Room)
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 12 (2)
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 13 (3)
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 14 (4)
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 15 (5)
2025-01-31 14:09:48.782 DEBUG (MainThread) [custom_components.xantech.media_player] Updating Xantech House Audio zone 16 (Server Desk)
2025-01-31 14:09:48.783 DEBUG (MainThread) [custom_components.xantech.media_player] async_update() is empty
2025-01-31 14:09:48.877 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 11 (Kitchen Great Room): 'NoneType' object has no attribute 'groupdict'
2025-01-31 14:09:48.890 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 12 (2): 'NoneType' object has no attribute 'groupdict'
2025-01-31 14:09:48.937 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 13 (3): 'NoneType' object has no attribute 'groupdict'
2025-01-31 14:09:49.002 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 14 (4): 'NoneType' object has no attribute 'groupdict'
2025-01-31 14:09:49.129 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 15 (5): 'NoneType' object has no attribute 'groupdict'
2025-01-31 14:09:49.193 WARNING (MainThread) [custom_components.xantech.media_player] Failed updating Xantech House Audio zone 16 (Server Desk): 'NoneType' object has no attribute 'groupdict'

errors repeat at poll interval.
I know this unit is not tested, willing to help with this; any suggestions on how I could resolve this appreciated. I also noted on the media_player.py file there are places listing zones as 1 - 8, but the monprice.yaml has correct at 6. Do I need to manually change those, or does the yaml in the site packages overide it? Thanks for your time.

I was under the impression they can’t be linked together like some other ones, they can be daisy chained in the sense that you use one of the preamp outs of the first one to feed an input on the next one.
the manual suggests to run them beside each other and have “Y-cables” split your input signals into both units so you can have the same sources, thats exactly what I did. So you propably have to call them two independent units.

what happens if you change your port to

port: /dev/ttyUSB0

instead of what you posted

port: /dev/serial/by-id/usb-FTDI_FT232R_USB_UART_B0028Y58-if00-port0
    #/dev/ttyUSB0

The commented out /dev/ttyUSB0, is because I tried it, same issue. The port as defined works with the monoprice integration as well as with the custom integration by Bradley Sanders. I would expect the integration would not setup at all if it could not connect, afik.

Has anyone used this integration to control a Dayton Matrix88?

The device has a network port.

I was finally able to make a connection with:

- platform: xantech
  type: dax88
  port: socket://192.168.69.129:80
  zones:
    11:
      name: "Zone 1"
    12:
      name: "Zone 2"
    13:
      name: "Zone 3"
    14:
      name: "Zone 4"
    15:
      name: "Zone 5"
    16:
      name: "Zone 6"
    17: 
      name: "Zone 7"
    18:
      name: "Zone 8"
  sources:
    1:
      name: "Source 1"
    2:
      name: "Source 2"
    3: 
      name: "Source 3"
    4:
      name: "Source 4"
    5: 
      name: "Source 5"
    6: 
      name: "Source 6"
    7: 
      name: "Source 7"
    8:
      name: "WiFi"

But the zones don’t work (on/off) and the sources don’t get created.

99% sure the LAN port is only for streaming music. Think you need RS232 for control.

That’s unfortunate. I was hoping since the Matrio app can control it over the LAN port that the integration could too.

I am not sure about that. I have the DAX88 but i use the usb to serial cable it came with.

Others on here got IP Serial working at least on regular DAX88