The task I actually wanted to do today was small and fun: put some Home Assistant controls on my Stream Deck+ so I could tap and twist a dial to run the house. I got as far as opening Home Assistant and realised I couldn't build on it, because the thing underneath was a mess. Five integrations were sitting there broken, and half my smart home wasn't even in Home Assistant — it lived in Apple Home and had never been connected. You can't automate a foundation that isn't there. So the button waited, and I spent the day fixing the floor before decorating the room.
The honest shape of the day
This is the failure mode I know I have: I go in to change a light switch and come out having re-plumbed the house. I'm not going to pretend it was a tidy plan. But this particular rabbit hole was the right one, because everything I wanted the Stream Deck to control had to actually exist in Home Assistant first, and most of it didn't.
Matter needed a server I never ran
Home Assistant runs on my server as a plain Docker container, not the full appliance version. The difference matters: the appliance can install a Matter server as an add-on with one click, and the container can't. So the Matter integration had been quietly failing since forever, trying to reach a helper that was never there. The fix was to run that helper myself as its own container and point Home Assistant at it. Once it came up, Matter finally had something to talk to.
Three VLANs that can't hear each other
Then the interesting problem. My network is segmented on purpose: Home Assistant sits on the management network, my Apple TV and HomePods live on the home network, and every smart plug and sensor is on a locked-down IoT network. Good for security. Terrible for Matter, because the way Matter and Thread find devices is with a kind of local broadcast that stops dead at a VLAN boundary. Home Assistant literally could not see the plugs on the other side of the fence.
The clean fix was two targeted changes on the UniFi side rather than tearing down the segmentation: one firewall rule letting Home Assistant reach the IoT network, and turning on the mDNS reflector so device discovery could cross between the three networks. No devices moved, the walls stayed up, and Home Assistant could suddenly see across them. I did briefly move the Apple TV to sort out the Thread side and immediately broke a pile of firewall rules that were scoped to its old address, so I put it straight back. Lesson logged: don't move the thing every other rule points at.
The Meross detour, and knowing when to switch tactics
I started bringing my Meross plugs in the "proper" Matter way, sharing each one from Apple Home into Home Assistant. It worked for a few, then turned into a slog: pairing windows timing out, a couple of plugs refusing outright, and — the real tell — several plugs that weren't in Apple Home at all, so there was nothing to share. I was nursing fifteen devices through a process that fought me on every third one.
So I stopped and changed approach. There's a local integration, meross_lan, that talks to Meross devices directly over the network with no Apple Home middleman and no pairing dance. I pulled the seven I'd already done back off Matter and let meross_lan take the whole fleet at once. All fifteen came in together — every plug, both cinema light strips, the garage opener, the presence sensors — with richer data than Matter gave me, and locked their IP addresses so they can't drift. The lesson I want to keep: the "correct" method isn't the right one if it costs you an hour per device and still misses a third of them.
The 150-degree mystery that wasn't a bug
My ducted air conditioning showed every room at over 150 degrees. It looked like a broken temperature reading, and I went down into the library code convinced it was a decoding error. It wasn't. My air con simply has no temperature sensors in the zones — it controls airflow by damper percentage, not by temperature — so the controller reports a placeholder value that, read as a temperature, comes out as nonsense. Nothing to fix in software; the data doesn't exist. Good to know before I spend money: if I want real per-room temperatures, I need to add actual sensors, and I've got a plan to hang cheap ones off my Aqara hubs later.
Clearing the rest of the board
The cameras came back with a fresh local account after the integration had rate-limited itself into a lockout by hammering a bad password for hours. The air con reconnected once I pointed it at its new address on the IoT network. The Bluetooth entry was for a radio the server doesn't even have, so it went in the bin. And with the mess gone, I did the satisfying part: renamed forty-odd devices to something sane, so each one is just what it is — "Sim Rig Plug", "Downlight 1" — and lets the room it's in carry the location, which is exactly how Apple Home and voice control want it.
Where this leaves me
The foundation is solid now. Everything I own answers to Home Assistant, it's named properly, and the broken-integration list is finally empty. The whole reason I started — controlling the house from a dial on my desk — is unblocked, and the cinema light strips that kicked off this entire thread three requests ago are now real, controllable entities.
The homework I'm not going to pretend away: I still want real temperature sensors in the rooms that matter, the smart lock is stuck behind the same Thread-across-VLANs wall and is parked until I add a dedicated radio, and my NAS backup story from earlier this week still isn't where it needs to be. But today was foundation work, and foundation work is the kind of thing that's invisible right up until everything you build on top of it just works. Tomorrow, the button.