finished replacing a professionally-installed Control4 system with Home Assistant across roughly ten audio and video zones. No rip-out weekend, no evening where the house couldn’t play music, and nobody in the family had to learn a workaround. The old controller stayed live the entire time until it had nothing left to do.
I’ve written the whole thing up as a field guide rather than a build log:
What’s actually in it, from the HA side:
- A build guide — layered architecture (separate what’s playing from where it plays, joined by a dispatcher over explicit helper state), integrations that age well, using one streaming engine as the backbone instead of a different mechanism per service, composable idempotent scripting, and the platform pitfalls that cost me the most time.
- Thirteen generalized gotchas — one control authority per device, idempotent commands, entity state being arbitrarily stale, power commands having a blast radius across zones you never named, reloads silently no-opping already-open dashboards. Each one is a real failure, the rule it taught, and how to verify you got it right.
- A five-stage migration model — discovery, prove the hard part first, parallel operation, cutover, then operate & harden. That last stage exists because roughly half the total effort came after the old system was already in a box, and no plan I read anywhere warned me about it.
- A decision layer — including honest reasons not to do this at all.
It’s written principle-first with small illustrative snippets rather than copy-paste configs, because your house is wired differently from mine. The point is to hand over how to think about the migration, not to document one specific rack.
Two things I got wrong that might save you a weekend: I treated decommission as the finish line when it was the midpoint, and I spent weeks blaming software contention for what turned out to be a failing network interface in an AVR.
If you’ve done this migration — or you’re mid-way through one — I’d genuinely rather have your gotchas than your stars. There’s a Discussions space set up for exactly that, and the contribution guide has the anonymization bar every entry clears.