AES70/OCA protocol library for ADAM Audio A-Series studio monitors
Project description
Home Assistant - ADAM Audio Control (A series)
Home Assistant integration for ADAM Audio A-Series studio monitors (A4V, A7V, etc.) via the AES70/OCA protocol over UDP.
Controls each speaker individually and provides a virtual All Speakers group device to control both monitors simultaneously from a single entity or dashboard card.
Features
| Control | Entity Type | Notes |
|---|---|---|
| Mute / Unmute | switch |
|
| Sleep / Wake | switch |
Standby mode |
| Input Source | select |
RCA or XLR |
| Voicing | select |
Pure, UNR, Ext |
| Bass | number |
−2 to +1 dB |
| Desk | number |
−2 to 0 dB |
| Presence | number |
−1 to +1 dB |
| Treble | number |
−1 to +1 dB |
Auto-discovery via mDNS (_oca._udp.local.) with manual IP fallback.
Screenshots
Integration page showing 3 devices (Left, Right, All Speakers) and 24 entities
Per-device control panel — EQ, input source, voicing, mute and sleep
All entities for Left, All Speakers and Right monitors in the HA dashboard
Dashboard cards using the Backplate Card (
adam-audio-backplate-card)
Dashboard cards using the Adam Audio Card (
adam-audio-card)
More alternative dashboard cards will be added soon.
Requirements
- Home Assistant 2026.3.0 or newer
- ADAM Audio A-Series speaker on the same local network as your HA instance
- HACS (for the HACS install path)
Installation
Option A — HACS auto (recommended)
- Open HACS → Integrations
- Search for ADAM Audio Control
- Click Download
- Restart Home Assistant
Option B — HACS manual
- Open HACS → Integrations → ⋮ → Custom repositories
- Add
https://github.com/Perhan35/hass-adam-audio-controlas type Integration - Search for ADAM Audio, click Download
- Restart Home Assistant
Option C — Fully manual
- Copy the
custom_components/adam_audio/folder into your HA config directory:config/ └── custom_components/ └── adam_audio/ ← copy here - Restart Home Assistant
Adding the integration
Auto-discovery (recommended)
If your speakers are on the same network, HA will automatically detect them via mDNS:
- Go to Settings → Devices & Services
- A notification banner should appear: "New device discovered: ADAM Audio"
- Click Configure and confirm each speaker
Manual entry
- Settings → Devices & Services → + Add Integration
- Search for ADAM Audio
- Enter the speaker's IP address (assign a static DHCP lease to each speaker in your router for reliability)
- Leave default port at
49494unless you know it differs - Repeat for each speaker
Dashboard Cards
Some custom Lovelace cards are included. They are automatically registered as frontend resources when the integration loads — no manual resource setup needed.
Add a card
Edit your dashboard and at the bottom the custom Adam Audio cards will display. Select the one you want to add. Or add a Manual card with the following YAML (replace entity IDs with your own — find them in Settings → Devices & Services → your speaker).
All cards use the same configuration schema, so you can switch between them by changing the type field.
Cards available
custom:adam-audio-cardcustom:adam-audio-backplate-cardcustom:adam-audio-backplate-card-alt(coming soon)
ADAM Audio Card (custom:adam-audio-card)
A modern UI-style control card with segment selectors, sliders, and status indicators.
type: custom:adam-audio-card
title: Left Monitor
entities:
mute: switch.{entity_name}_mute
sleep: switch.{entity_name}_sleep
input: select.{entity_name}_input_source
voicing: select.{entity_name}_voicing
bass: number.{entity_name}_bass
desk: number.{entity_name}_desk
presence: number.{entity_name}_presence
treble: number.{entity_name}_treble
ADAM Audio Backplate Card (custom:adam-audio-backplate-card)
A card that visually replicates the physical backplate of an ADAM Audio A-Series monitor — dark metallic panel, green LED indicators, frequency response curves, XLR/RCA connector graphics, and round hardware-style buttons.
- Room Adaptation: SVG EQ curves visualize the frequency bands. Green LEDs indicate the current dB value for each band. Click the round hardware buttons below each band (Bass, Desk, Presence, Treble) to cycle through values.
- Audio IN: XLR and RCA connector graphics with green LED indicators showing the active input. Click the "Input Select" hardware button to toggle between RCA and XLR.
- Voicing: Green LEDs for Pure, UNR, and Ext. Click the "Voicing" button to cycle through voicing modes.
- Mute / Sleep: Header buttons that highlight red (mute) or amber (sleep) when active.
type: custom:adam-audio-backplate-card
title: Left Monitor
entities:
mute: switch.left_mute
sleep: switch.left_sleep
input: select.left_input_source
voicing: select.left_voicing
bass: number.left_bass
desk: number.left_desk
presence: number.left_presence
treble: number.left_treble
All Speakers Group (exemple with Backplate Card Alternative)
All cards work with the All Speakers group entities (prefixed all_speakers_):
type: custom:adam-audio-backplate-card-alt
title: All Monitors
entities:
mute: switch.all_speakers_mute
sleep: switch.all_speakers_sleep
input: select.all_speakers_input_source
voicing: select.all_speakers_voicing
bass: number.all_speakers_bass
desk: number.all_speakers_desk
presence: number.all_speakers_presence
treble: number.all_speakers_treble
Finding your entity IDs: Go to Settings → Devices & Services → ADAM Audio → your device, then click on any entity to see its full ID.
Automations examples
# Mute both speakers when Sonos starts playing
automation:
trigger:
- platform: state
entity_id: media_player.sonos
to: playing
action:
- service: switch.turn_on
target:
entity_id: switch.all_speakers_mute
# Wake speakers at 9:00 AM on weekdays
automation:
trigger:
- platform: time
at: "09:00:00"
condition:
- condition: time
weekday: [mon, tue, wed, thu, fri]
action:
- service: switch.turn_off
target:
entity_id: switch.all_speakers_sleep
Protocol Library
The AES70/OCA protocol layer is published as a standalone Python package:
pip install pyadamaudiocontroller
This library (lib/pyadamaudiocontroller/) handles all low-level UDP communication with the speakers and has zero dependencies beyond the Python standard library. It is used by both the HACS custom component and the HA Core integration.
How it works
Communication uses the AES70/OCA protocol over UDP — the same protocol used by ADAM Audio's official A Control app. No audio data is sent over the network; this integration is control-only.
State is tracked optimistically: the integration records what it has set and assumes the speaker accepted it. There is no read-back for most parameters in the OCA implementation the speakers expose. This means if you change settings via the physical knob or the A Control app, HA won't know until you restart or reload the integration.
A keepalive is sent every 25 seconds to maintain the OCA session.
Troubleshooting
Warning: Avoid opening the official ADAM Audio A Control app while this integration is running. Although you can open it, doing so will cause the speakers to reset their active commands to the ones sent by A Control, overriding any state set by this integration.
| Symptom | Fix |
|---|---|
| Speaker not discovered | Check the speaker is on the same network/VLAN as HA. Try the manual IP method. |
| Entities show Unavailable | Speaker may be in deep sleep mode. Try the manual IP fallback; the integration retries on the next poll cycle. |
| State doesn't reflect knob changes | Expected — state is optimistic and takes some time to update. Reload the integration entry to reset to defaults (if wanted/needed). |
| Commands stop working | Unload and reload the integration entry to reset the OCA session. |
| A Control app overrode my settings | Opening the A Control app resets commands to those sent by A Control. Close A Control to regain control from Home Assistant. |
Development & Testing
See CONTRIBUTING.md for more information.
Repository Structure
This is a monorepo that produces three deliverables:
| Directory | Purpose |
|---|---|
lib/pyadamaudiocontroller/ |
Standalone PyPI protocol library |
custom_components/adam_audio/ |
HACS custom integration (includes dashboard cards) |
scripts/gen_core.py |
Generates files for HA Core PR submission |
More info, see CONTRIBUTING.md#repository-structure.
TODO
- Add translation support
- Full test suite: Add tests for all entity platforms, group entity logic, and coordinator update cycle.
- Fix auto-discovery: zeroconf auto-discovery doesn't seem to work all the time
- Add support for more ADAM Audio speaker models: tested with A4V only
- Propose this integration to HACS
- Extract protocol library to PyPI (
pyadamaudiocontroller) - Propose this integration to Home Assistant Core: ongoing
- Enhance connectivity and error handling:
- add retry logic,
- implement a proper keepalive mechanism,
- better error messages
Credits
Protocol implementation based on pacontrol by @dmach, licensed GPL-3.0.
License
MIT — see LICENSE
Project details
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
File details
Details for the file pyadamaudiocontroller-1.0.0.tar.gz.
File metadata
- Download URL: pyadamaudiocontroller-1.0.0.tar.gz
- Upload date:
- Size: 12.9 kB
- Tags: Source
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
5bb86032735655509a7db4ea8c5a9a859dfa3861b18afd3b4b64317988e58da3
|
|
| MD5 |
8afdd6a1f25cfc918e275f0a3093ecf4
|
|
| BLAKE2b-256 |
57b16895387192065675be7096474d64c98c1825670d06652076859cf98f5ccf
|
Provenance
The following attestation bundles were made for pyadamaudiocontroller-1.0.0.tar.gz:
Publisher:
publish-lib.yml on Perhan35/hass-adam-audio-control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyadamaudiocontroller-1.0.0.tar.gz -
Subject digest:
5bb86032735655509a7db4ea8c5a9a859dfa3861b18afd3b4b64317988e58da3 - Sigstore transparency entry: 1172111091
- Sigstore integration time:
-
Permalink:
Perhan35/hass-adam-audio-control@5674fbdd91f640b0aadd9852dc23011ebaf77187 -
Branch / Tag:
refs/tags/lib-v1.0.0 - Owner: https://github.com/Perhan35
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-lib.yml@5674fbdd91f640b0aadd9852dc23011ebaf77187 -
Trigger Event:
push
-
Statement type:
File details
Details for the file pyadamaudiocontroller-1.0.0-py3-none-any.whl.
File metadata
- Download URL: pyadamaudiocontroller-1.0.0-py3-none-any.whl
- Upload date:
- Size: 13.8 kB
- Tags: Python 3
- Uploaded using Trusted Publishing? Yes
- Uploaded via: twine/6.1.0 CPython/3.13.7
File hashes
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
60aad8561009e8d0e73ab2653ae3136df8a63c9996151edda0ac296e1c95a20d
|
|
| MD5 |
1670e6d65142ff3f289d5b173aea5f94
|
|
| BLAKE2b-256 |
06b703377f12dd5e16c16a62f9af04e1932162fb6d36c63a479ef2eba43b9a2c
|
Provenance
The following attestation bundles were made for pyadamaudiocontroller-1.0.0-py3-none-any.whl:
Publisher:
publish-lib.yml on Perhan35/hass-adam-audio-control
-
Statement:
-
Statement type:
https://in-toto.io/Statement/v1 -
Predicate type:
https://docs.pypi.org/attestations/publish/v1 -
Subject name:
pyadamaudiocontroller-1.0.0-py3-none-any.whl -
Subject digest:
60aad8561009e8d0e73ab2653ae3136df8a63c9996151edda0ac296e1c95a20d - Sigstore transparency entry: 1172111110
- Sigstore integration time:
-
Permalink:
Perhan35/hass-adam-audio-control@5674fbdd91f640b0aadd9852dc23011ebaf77187 -
Branch / Tag:
refs/tags/lib-v1.0.0 - Owner: https://github.com/Perhan35
-
Access:
public
-
Token Issuer:
https://token.actions.githubusercontent.com -
Runner Environment:
github-hosted -
Publication workflow:
publish-lib.yml@5674fbdd91f640b0aadd9852dc23011ebaf77187 -
Trigger Event:
push
-
Statement type: