My Home Assistant dashboard has evolved significantly over the past year. What started as the default auto-generated cards has become a carefully organized interface that my whole family actually uses. Here’s how I built it, with a focus on the whole home audio system that ties everything together.
Dashboard Philosophy#
Before diving into implementation, a few principles guided the design:
- Function over flash - Every card earns its screen space
- One-tap actions - Common tasks shouldn’t require drilling into menus
- Status at a glance - The overview tells you what’s happening without interaction
- Mobile-first - Tablets mounted around the house are the primary interface
The Stack#
- Lovelace YAML mode - Full control over layout and structure
- Mushroom cards - Clean, consistent UI components
- Custom Layout Card - Responsive grid layouts that work on any screen
- Stack-in-card - Grouping related controls together
Overview Page#
The overview page is designed to answer “what’s happening right now?” at a glance:
- type: custom:mushroom-chips-card
alignment: center
chips:
- type: weather
entity: weather.katw
- type: template
entity: person.rusty_bower
icon: mdi:account
icon_color: "{{ 'green' if is_state('person.rusty_bower', 'home') else 'grey' }}"
content: Rusty
- type: template
icon: mdi:lightbulb-group
icon_color: "{{ 'amber' if states.light | selectattr('state', 'eq', 'on') | list | count > 0 else 'disabled' }}"
content: "{{ states.light | selectattr('state', 'eq', 'on') | list | count }} lights"The chip bar at the top shows:
- Current weather
- Who’s home (person tracking)
- How many lights are on (tap to navigate to lighting)
- Garage door status (red = open, green = closed)
- HVAC status (heating/cooling active)
- Upcoming trash/recycling days
Quick actions provide one-tap scenes: Goodnight, Spa Mode, All Lights Off, Close All Garage Doors.
Whole Home Audio Architecture#
The audio system uses a Xantech DAX66 multi-zone amplifier - a commercial-grade matrix amplifier that can route any of 6 sources to any of 18 zones independently. Each zone has its own volume control and can play different content simultaneously.
The Zones#
The house is wired with in-ceiling speakers across 15 zones spanning three floors - main living areas, bedrooms/offices upstairs, and utility/recreation spaces in the basement. Plus a dedicated Theater with an Anthem AV receiver for serious listening.
Integration Approach#
The Xantech communicates via RS-232, but I needed network access from Kubernetes. The solution is a socat bridge running as a sidecar:
containers:
- name: socat
image: alpine/socat:latest
args:
- "-d"
- "-d"
- "TCP-LISTEN:7001,reuseaddr,fork"
- "TCP:10.0.10.209:4999,keepalive,forever,interval=10"This bridges TCP connections from Home Assistant to the serial-to-ethernet adapter connected to the Xantech. The keepalive,forever ensures the connection recovers from network hiccups.
Home Assistant sees each zone as a media_player entity with source selection and volume control.
Audio Dashboard Design#
Designing the audio UI was tricky. With 15 zones, a traditional media player card for each would be overwhelming. The solution is a two-column layout: streaming controls on the left, zone controls on the right.
Streaming Column#
The maxi-media-player card provides a full-featured player with album art as a blurred background:
- type: custom:maxi-media-player
entities:
- media_player.spotify
- media_player.zone_1
- media_player.zone_2
# ... all zones
sections:
- player
artworkAsBackgroundBlur: trueThis gives you playback controls, track info, and the ability to cast to any zone - all in one card.
Zone Controls Column#
For the individual zones, I use mushroom-media-player-card with a horizontal layout. Tap to toggle on/off, volume buttons for quick adjustments:
- type: custom:stack-in-card
cards:
- type: custom:mushroom-title-card
title: Whole Home Audio
subtitle: Upstairs
- type: custom:mushroom-media-player-card
entity: media_player.zone_1
name: Zone 1
layout: horizontal
volume_controls:
- volume_buttons
- volume_set
media_controls: []
collapsible_controls: false
tap_action:
action: toggle
- type: custom:mushroom-media-player-card
entity: media_player.zone_2
name: Zone 2
layout: horizontal
volume_controls:
- volume_buttons
- volume_set
media_controls: []
collapsible_controls: false
tap_action:
action: toggle
# ... more zones
- type: custom:mushroom-title-card
title: ""
subtitle: Main Floor
# ... main floor zonesThe key settings:
layout: horizontal- Compact single-line layoutvolume_controls: [volume_buttons, volume_set]- Both +/- buttons and a slidermedia_controls: []- Hide play/pause since we control that from the streaming cardtap_action: action: toggle- Tap the card to turn the zone on/off
This puts all zones in a scrollable card organized by floor, with the streaming player always visible on the left.
Scene Integration#
The real power comes from combining audio with other automations:
Spa Mode#
One tap: dims the outdoor lights, starts a relaxation playlist in the relevant zone, adjusts the HVAC.
- type: custom:mushroom-template-card
primary: Spa Mode
icon: mdi:hot-tub
icon_color: cyan
tap_action:
action: call-service
service: scene.turn_on
target:
entity_id: scene.spa_modeGoodnight#
Turns off all audio zones, sets overnight temperature setpoints, dims lights to 5% in hallways, locks doors.
Party Mode#
Syncs all main floor and outdoor zones to the same source at matched volumes.
Theater Integration#
The theater runs separately on an Anthem AV receiver, integrated via IP control. It gets its own section with proper media controls:
- type: custom:mushroom-media-player-card
entity: media_player.anthem_av
name: Anthem AV
use_media_info: true
show_volume_level: true
volume_controls:
- volume_set
- volume_muteThe theater lighting also has dedicated scene buttons: Off, Movie (5% seating lights), Intermission (50%), and Full brightness for cleaning.
Tablet Deployment#
Fire tablets run Fully Kiosk Browser showing the dashboard at key locations - one on the main floor for everyday use, one upstairs, and a portable tablet that docks at a charging station when not in use.
The Admin page shows tablet connectivity status so I know if one has gone offline.
Lessons Learned#
- YAML mode is worth it - The visual editor can’t do responsive layouts or template chips
- Group by function, not location - “Lighting” view is more useful than “Living Room” view
- Limit visible options - Show the 80% use case, hide the edge cases behind taps
- Test with family - My initial designs were too information-dense
What’s Next#
- Music Assistant integration for better source management
- Voice control via local Whisper for “play jazz in the kitchen”
- Presence-based audio - automatically route music to follow occupancy
The dashboard continues to evolve, but the core principle stays the same: make the smart home actually easier to use than the dumb version.