- Fix: all buttons always available — buttons are fire-and-forget commands, they don't depend on coordinator state
- New
AudacButtonBaseclass withavailable = True— all 13 button classes inherit from it - Buttons no longer show as
unavailablewhen the coordinator has a failed poll
- Fix: all IMP40 favourites now loaded — pagination no longer stops early on partial batches
- Fix: IMP40 favourites retry —
_favourites_loadedretries every poll until successfully loaded - Removed
len(batch) < 10termination condition — only empty response stops pagination - Added deduplication via
seen_pointersset to detect when device loops back - Max pages increased from 10 to 20 (supports up to 200 stations)
COMMAND_TIMEOUTincreased from 5s to 8s — GFAV responses need more time
- Refined failure strategy for both MTX and XMP44 coordinators:
- 0–2 failures: Keep last known state, continue normal polling (60s/30s)
- 3+ failures: Mark entities as
unavailable, slow polling to 180s (3 min) - Recovery: Device responds again → immediately restore normal polling, reset counter
- Single command timeout reduced to 5s (was 25s) — fail fast on hung connections
- Overall timeouts restored to safe values (GET_ALL_ZONES 45s, UPDATE 55s)
- Fix: persistent unavailable state — Single command timeout reduced from 25s to 5s
- A hung TCP command now frees the lock in 5s instead of 25s, preventing cascading timeouts
- Overall timeouts restored: GET_ALL_ZONES 45s, UPDATE 55s (were aggressively reduced to 25s/35s in v3.12.0)
- Both MTX and XMP44 coordinators benefit from faster failure recovery
- Compact zone/slot rows further to match HA standard container padding
- Row padding: 10px 12px → 8px 12px (row height ~52px, down from ~58px)
- Content gap: 12px → 10px
- Container gap between rows: 8px → 6px
- Name line-height: default → 1.3
- Compact zone/slot row sizing to match HA standard row height (~56px)
- Zone/slot name: 14px → 13px (matches Bubble Card)
- Info column gap: 2px → 1px
- Detail text line-height: 1.2 (tighter)
- HA theme integration: Cards now use
--ha-card-background,--ha-card-border-radius,--ha-card-border-color, and--ha-card-box-shadowCSS variables - Removed hardcoded opaque backgrounds and
backdrop-filter: blur()from card containers - Zone/slot rows use subtle
rgba()overlays instead of opaque card backgrounds - Cards blend seamlessly with Bubble Card, transparent themes, and glassmorphism themes
- Both MTX and XMP44 cards (including slot card) updated
- Fix: Lovelace resource registration for HA 2026.3+ — used
hasattr(ll_data, "resources")attribute access instead of dict-style lookup (HA changed from dict to object) - Fix: blocking
read_textcall — version reading now usesasync_add_executor_jobto avoid event loop warning - Simplified and more robust
_register_lovelace_resourceimplementation
- Auto-versioning: Card version is now single-source-of-truth in the JS files —
__init__.pyreads it dynamically, no more manual syncing ofCARD_VERSIONinconst.py - Bubble Card sizing for both MTX and XMP44 cards:
- Karten-Radius: 25px durchgehend (statt 24px/18px gemischt)
- Karten-Padding: 16px (statt 20px)
- Header-Icon: 38px, rund (statt 42px, eckig)
- Titel: 14px (statt 16px)
- Zone/Slot-Icons: 36px, rund (statt 40px, eckig)
- Zone/Slot-Zeilen: ~56px (statt ~68px)
- Action-Buttons: Pillenform 20px Radius (statt eckig 12px)
- Play-Buttons: rund (statt eckig)
- Rewrite: GZI0x per-zone polling replaces bulk GVALL/GRALL/GMALL strategy
- Each zone queried individually via
GZI0x(volume^routing^mute^bass^treble in one response) - Per-zone failure resilience: if one zone fails, previous data for that zone is kept while other zones update normally
- Always fresh bass/treble: no more cache, every poll returns all 5 values per zone
- 8 TCP commands per poll (~5-6s) — simple, predictable, resilient
- Removed bass/treble cache (no longer needed)
- Reduced timeouts (GET_ALL_ZONES: 45→25s, UPDATE: 55→35s)
- Faster MTX polling: Bass/treble values are now cached and only refreshed every 5th poll
- Normal polls: 3 TCP commands (~2-3s) instead of 19 (~15-20s)
- Eliminates HA warning "Update is taking over 10 seconds" for 80% of polls
- Bass/treble cache is updated immediately when set via HA (no wait for next refresh)
- Plausibility check: MTX coordinator detects suspicious all-zero responses (routing=0 on all zones) and keeps previous state instead of showing "0/6"
- Incomplete data detection: Keeps previous state when fewer zones than expected are returned
- Fixed failure counter not being properly maintained when plausibility check triggers
- Fix:
coroutine '_register_lovelace_resource' was never awaitedwarning on Python 3.14 - Replaced sync lambda with async callback for
homeassistant_startedevent listener
- Fix: XMP44 slot card editor no longer destroyed by state refreshes
- Editor renders only once (not on every
set hass()call) - Card only re-renders on actual config or state changes (config snapshot diff)
- New:
audac-xmp44-slot-card— individual Lovelace card per XMP44 module - Supports all module types (BMP40, IMP40, FMP40, DMP40, TMP40, MMP40, NMP40)
- Entity picker in card editor with auto-discover
- Always-expanded controls (no accordion click needed)
- Same Bubble Card-inspired design as the main XMP44 card
- Static preview in card picker
- Auto-cleanup of legacy IMP40 station entities (old unique_id format without pointer)
- No more duplicate "Nicht verfügbar" buttons after upgrading from v3.8.7 or earlier
- Icon now uses dark rounded background with white logo — works on both light and dark HA themes
- HA frontend only requests
icon.png(notdark_icon.png), so the icon must work universally
- Rebuilt all brand assets from official AUDAC vector source (
.ai) - Light and dark variants with proper luminance-based alpha transparency
- Smaller file sizes and crisp edges from high-res vector rendering
- Resilient state handling: Entities keep their last known state for up to 3 consecutive poll failures before becoming unavailable. Previously, a single failed response could mark entities as unavailable.
- Applies to both MTX and XMP44 coordinators
- Failure counter resets on every successful poll
- Log messages now show failure count (e.g.
failure 2/3)
- Fix: Lovelace resource warning at startup — defer registration to
homeassistant_startedwhen collection not ready yet (instead of logging a false warning) - Downgraded fallback message from WARNING to DEBUG
- Fix: IMP40 station buttons duplicate unique_id — now includes pointer for guaranteed uniqueness
- Added deduplication for IMP40 favourites list
- Static previews for Volume, Source, Bass, Treble sub-cards in the HA card picker
- Removed
audac-mtx-more-infofrom card picker (more-info panel, not a standalone card) - Fixed
_config.titlecrash in MoreInfo_getZones() - Linked Audac to audac.eu in README
- Fix:
helpers.pynow checks all 3 link formats (zone_z_link,zone_z_links,zone_z_linked_to) for slave zone visibility — was only checking legacy format - Fix: Removed duplicate
window.customCardsregistration at end ofaudac-mtx-card.jscausing double entries in HA card picker - Fix: Removed redundant
client.disconnect()in config flow (already handled byfinally)
- README title and references renamed from "Audac MTX" to "Audac"
- Repository references updated from
tuldener/Audac-Mtx-ControltoFX6W9WZK/ha-audac
- README: Added XMP44 Lovelace Card manual setup instructions
- XMP44 card: Accordion behavior – only one slot expanded at a time
- Fix: XMP44 card flickering – state diff rendering like MTX card
- MTX: Save button + Volume Up/Down buttons per zone
- All module controls rendered as buttons with full card rendering
- Prepare repo rename from
Audac-Mtx-Controltoha-audac
- FMP40 triggers rendered as rows – 50% Play / 50% Stop per line
- XMP44 Card: FMP40 trigger buttons, BMP40 Bluetooth controls
- Fix: XMP44 card editor – prevent Assist popup when typing
- XMP44 Lovelace Card (separate Bubble Card-inspired card)
- Complete DMP40, TMP40, MMP40 module support
- NMP40 Network Audio Player – sensors and IP polling
- BMP40 Bluetooth controls – pairing, disconnect, sensors
- Critical fix: Accept ALL broadcast responses from XMP44
- IMP40 station buttons from favourites
- IMP40 Internet Radio with source selection (favourites)
- Individual name field per FMP40 trigger
- FMP40 trigger config only shown for FMP40 slots, custom trigger names
- FMP40 voice file trigger buttons
- XMP44 modules as individual sub-devices (via_device)
- Renamed integration to "Audac", added XMP44 device info
- Fix: Duplicate card registration when multiple config entries
- Removed auto-detect, kept simple manual module dropdowns
- Auto-detect button for XMP44 modules
- Manual module selection for XMP44 via dropdown in options
- XMP44 support – Audac XMP44 modular audio system is now supported
- New client framework:
AudacClientbase class for shared TCP protocol MTXClientandXMP44Clientinherit fromAudacClient- Automatic module detection via GTPS command (DMP40, TMP40, IMP40, MMP40, FMP40, BMP40, NMP40)
- Media player entity per installed XMP44 module with module-specific features
- Config flow: XMP44 selectable as third model
- No breaking changes for existing MTX users
- Zone coupling as dropdown instead of checkboxes (a slave zone can only have one master)
- Default: "No coupling"
- Full backward compatibility with old checkbox and legacy format
- Fix: Added
issue_trackerto manifest.json (HACS required field) - Fix: Added
httptoafter_dependencies(Hassfest validation) - Fix: Added
CONFIG_SCHEMA(config_entry_only_config_schema)
- Brand assets (icon.png) for HACS Default Store
- GitHub Actions workflow for HACS and Hassfest validation
- Cleaned up hacs.json (removed invalid fields)
- HACS "My" button in README for easy installation
- Fix: Linked zones now show the configured name instead of "Zone X"
- New
zone_numberattribute on each media player entity mtxLinkedNames()now matches viazone_numberinstead of entity ID pattern
- Fix: SyntaxError in
_renderZone(single quotes in template literal) - Fix: Typos in DE translations
- Linked slave zone names shown next to the link icon (e.g.
Bar 🔗 Subwoofer) - New helper function
mtxLinkedNames()resolves zone numbers to friendly names
- i18n fallback changed to English (instead of German)
- Automatic language detection (German / English) for the entire Lovelace card
- Language read from HA user settings (
hass.language) - All card UI strings translated: labels, tooltips, editor, error messages, card descriptions
- README: Real screenshot as card preview
- Card editor: Removed "Zones" section (manual add/remove), auto-discover is sufficient
- README: Card preview with generic zone names, absolute image path for HACS
- Fix: README image displayed correctly (absolute URL via raw.githubusercontent.com)
- Fix: Version badge switched to static
- Bass/treble visibility removed from integration settings (card editor toggle only)
- CARD_VERSION correctly bumped for browser cache busting
- Fix: Removed duplicate code in coordinator.py – second
_fetch_data(without sync) was overwriting the first - Fix: Cleaned up
async_shutdown(removed dead code)
- Fix: Zone coupling was not working (sync + hiding in card)
- Coordinator now reads
zone_X_links(list) instead ofzone_X_linked_to(int) - Card correctly hides slave zones
- Coupling as checkboxes (SelectSelector, multi-select) instead of dropdown
- Migration from old to new coupling format
- Slave zone sync on every coordinator poll (~60 s)
- Volume tolerance (±2 units), exact matching for mute, source, bass, treble
- Zone coupling (master/slave) in integration options
- Immediate mirroring when sending commands to the master zone
- Fix: Zone dropdown in single card editor
- Bass/treble visibility in card editor
- Fix:
_async_update_zone_visibilitywas not defined - Fix: Visibility covers all entity types
- New: Central
helpers.pymodule
- Entities are always created, visibility via Entity Registry
- Coordinator SCAN_INTERVAL 60 s, timeout improvements
- Fix: Card not loading on first render (ll-rebuild)
- Fix:
window.customCardsmoved to top of file
- Zone names auto-truncated, volume as background fill
- Flickering fixed: smart DOM patching, interactive bass/treble sliders
- Services
routing_up/routing_down, protocol documentation
- Initial release