From Hub Chaos to One Clean Architecture — My Home Assistant Migration 2026
Tags: frigate zigbee2mqtt matter influxdb grafana homekit bare-metal haos reolink mosquitto
TL;DR
After 6-7 years of accumulating smart home hubs, I rebuilt everything from scratch on bare metal Home Assistant OS (HAOS 18.0) on a Lenovo M710q mini PC. One guiding rule: everything local, no cloud accounts, one single pipeline to Apple Home for the family. This post covers the full journey — why I did it, the architecture decisions, the real installation challenges, and what's running now.
PHASE 1 — Design & Architecture
How It Started — The Hub Mess
Like most people here, my smart home grew organically over the years. By 2026 here's what I was running:
- SmartThings hub — original automation backbone
- Two Philips Hue Bridges — one for indoors, one I added thinking I needed it
- Lutron Caséta — great switches but another hub
- Ecobee — thermostat with its own cloud
- Meross — garage door openers via HomeKit
- Home Assistant — running as a VM on Dell R720 ESXi, later migrated to Proxmox VM on Lenovo M920q
- Blue Iris — Windows NVR for Amcrest cameras on a T5500 workstation
- Multiple cloud apps — Kasa, Amazon plugs, eWeLink outdoor plug
The problem wasn't that any single device didn't work. The problem was that nothing talked to each other cleanly. Hub-to-hub connections, app-to-app automations, cloud dependencies everywhere. If one thing went down, it cascaded. The family had multiple apps — nobody used it properly because it was too complicated.
The breaking point: I realized I had hardware running 24/7 that I didn't need, cloud accounts that could disappear tomorrow taking my automations with them, and a system only I could operate.
The Architecture Decision — Four Rules
Before touching any hardware, I defined the rules:
Rule 1: One Pipeline, No Exceptions
Physical Devices → Home Assistant → HomeKit Bridge → Apple Home
Every single device. No direct hub-to-hub connections. No device that bypasses HA. Apple Home is the family UI — clean, simple, familiar. HA is the brain.
Rule 2: Local Control Only — Zero Mandatory Cloud Accounts
If a device requires a vendor app or cloud login to function — even just for initial setup — it gets rejected. No exceptions. A company going under or changing their API shouldn't render my hardware useless.
Rule 3: Bench Test Before Bulk Buy
Order one, test it thoroughly for a full week, then order more.
Rule 4: Multiple Simple Automations Over Complex Branching Logic
When one automation sequence can't achieve a result cleanly, use two or more separate automations instead of complex conditional branching. Easier to debug, easier to understand.
New Hardware Decisions
Cameras — Reolink RLC-520A over Amcrest
Amcrest cameras removed from Frigate NVR due to persistent RTSP instability. Reolink RLC-520A replaced them — PoE, 5MP, RTSP/ONVIF, no cloud required, Frigate-compatible. One unit bench tested for one week before ordering more.
Zigbee — CC2652P Dongle + Zigbee2MQTT
Instead of another vendor Zigbee hub, a CC2652P USB dongle running Zigbee2MQTT gives full local control, excellent device compatibility, and complete visibility into the Zigbee network. Per-service MQTT credential isolation — separate Mosquitto user per addon.
Smart Plugs — Kasa KP125M via Matter
Amazon plugs required cloud account — returned. Kasa EP40 outdoor plug required TP-Link account — returned. Kasa KP125M is Matter-certified and pairs with zero TP-Link account via Matter QR code directly into HA. 15A, no cloud, fully local.
Energy Monitoring — Refoss EM16P (planned)
Refoss EM16P — 16 branch circuit monitoring, fully local out of box, no firmware flash needed. Web UI + MQTT + Open API. ~$160 CAD at Refoss | Your Privacy, Your Home, Your Rules – Refoss Official Store. Two units planned for 30 breakers.
Devices Decommissioned
- SmartThings hub — factory reset, for sale
- Second Philips Hue Bridge — factory reset, for sale with spare bulbs
- Old HA VM on Proxmox — shut down
- Amazon smart plugs (7-8 units) — cloud account required, for sale
- Kasa EP40 outdoor plug — returned, required TP-Link cloud account
- Costco eWeLink outdoor plug — replacing with Tapo P400M (Matter)
- Apple TV 4K 1st gen (A1842) + Apple TV 2nd gen (A1378) — no Matter support, for sale
PHASE 2 — Implementation
The Hardware Migration — Three Generations
Generation 1: Dell R720
Home Assistant started as a VM on a Dell R720 enterprise server running ESXi — pulling ~300W continuously, roughly $35-40 CAD per month just to run a smart home VM.
Generation 2: Proxmox VM on Lenovo M920q
Migrated HA to Proxmox VM on M920q to kill the R720's power bill. Restored from R720 backup. R720 went offline. But the HA problems didn't go away — same instability, same VM overhead, same complexity.
Generation 3: Bare Metal HAOS on Lenovo M710q (This Project)
The right fix wasn't better VM hardware — it was eliminating the VM entirely. Lenovo M710q (i5-6500T, 16GB DDR4) running HAOS 18.0 bare metal at ~25W idle. Greenfield install — no legacy configuration carried forward.
Why bare metal?
- Direct hardware access for future AI accelerator (Hailo-8L) without PCIe passthrough complexity
- Simpler — no hypervisor layer to troubleshoot
- More stable — no VM management overhead
- Clean slate — no years of accumulated config debt
The Installation — What Actually Happened
Installing HAOS itself was straightforward. What followed was the real education.
Challenge 1: The Frigate Config Path (4 Hours)
Documentation says the config file is at /config/frigate.yml. It's not.
Real path:
/addon_configs/ccab4aaf_frigate-fa/config.yaml
This took approximately four hours of SSH file hunting to discover. Also: !secret syntax does not work in Frigate's addon config — passwords must be hardcoded in that file.
Challenge 2: Mosquitto Broker Crash Loop
Mosquitto MQTT broker kept crash-looping with no obvious error in the addon UI. SSH into the logs revealed:
Error: Unable to open include_dir '/share/mosquitto'
Error found at /etc/mosquitto/mosquitto.conf:48
Fix:
mkdir -p /share/mosquitto
Not documented anywhere obvious. Cost: ~1 hour of log digging.
Challenge 3: Zigbee2MQTT Onboarding Flag
After completing the Zigbee2MQTT onboarding wizard, the UI kept showing the onboarding screen on every restart even though the config had saved correctly. The culprit:
onboarding: true
Fix:
sed -i 's/onboarding: true/onboarding: false/' /config/zigbee2mqtt/configuration.yaml
Challenge 4: HomeKit Bridge Camera Categories
Adding cameras to Apple Home via HomeKit Bridge requires manually enabling the camera category in the bridge configuration — not on by default. Enabling it requires a full re-pair of the bridge. The new QR code appears in HA notifications (not the integration config screen).
Challenge 5: Matter on a Server Without Bluetooth
Kasa KP125M Matter pairing kept failing with "Unable to add accessory." After IPv6 troubleshooting (yes, Matter requires IPv6 on your LAN — enable it in OPNsense Router Advertisements in Unmanaged/SLAAC mode), the real issue appeared in Matter Server logs:
BLE is not enabled on this platform
bluetooth_enabled: false
Fix: Enable the BLE proxy in the Matter Server addon — this allows your iPhone's Bluetooth to proxy the commissioning process. Also set WiFi credentials in Settings → Matter before commissioning.
Architecture — What's Running Now
| Component | Details |
|---|---|
| Host | Lenovo M710q i5-6500T 16GB — HAOS 18.0 bare metal |
| IP | 192.168.50.176 (permanent reservation) |
| Remote access | Tailscale |
| Frigate | v0.17.1 — real config at /addon_configs/ccab4aaf_frigate-fa/config.yaml |
| Zigbee | CC2652P dongle via Zigbee2MQTT 2.12.1 |
| MQTT | Mosquitto — per-service users (frigate, zigbee2mqtt) |
| Matter | Matter Server 9.0.3 — BLE proxy enabled |
| Network | OPNsense + Cisco SG300-28P + C2960CX-8PC-L |
Integrations active: Philips Hue, Lutron Caséta, Ecobee, Sonos, Meross garage doors (HomeKit Device), Reolink Doorbell + RLC-520A (Frigate), Kasa KP125M ×4 (Matter), Aqara temp/humidity (Zigbee2MQTT), Google Drive Backup, Tailscale, Environment Canada, Ontario Energy Board, Speedtest, System Monitor, Brother printer, Milton waste collection calendar (Remote Calendar iCal), HACS: Mushroom Cards, Advanced Camera Card, Life360, Frigate card.
Automations Built
All automations live in HA. Hue app automations migrated and deleted from the Hue app. Per the "multiple simple automations" rule — each automation does one thing.
| # | Automation | Trigger | Status |
|---|---|---|---|
| 5a/5b/5c | Office desk lamp | Sunset on / Midnight off / 2AM safety off | |
| 6a/6b/6c | Stair hallway | Sunset 100% / Midnight 50% / Sunrise off | |
| 7a | Garage fan on | Garage door opens + temp ≥ 26°C | |
| 7b | Garage fan off | Both garage doors closed | |
| 7c | Garage fan on (temp rising) | Temp rises above 26°C while door already open | |
| #1 | Doorbell motion → outside lights | Doorbell motion (dusk-30min) | |
| #2 | Family arrives → outside lights | iPhone presence + dusk | |
| #3a/#3b | Garage/laundry lights | Meross door / motion sensor |
Automations 7a/7b/7c were tested on a 35°C day — real world validated.
Utility Monitoring — InfluxDB + Grafana
InfluxDB 1.x and Grafana running as Home Assistant addons on the same M710q (CPU usage: 16%, Memory: 19% — minimal impact).
Imported 22 months of Enbridge gas data (Green Button XML) and 913 days of Milton Hydro hourly electricity data (21,889 hourly records) into InfluxDB. Applied actual TOU rates per hour for cost calculations.
Grafana Utilities dashboard shows:
- Daily hydro consumption (hourly granularity)
- Monthly gas consumption (m³)
- Monthly gas bill with component breakdown
- Federal Carbon Tax elimination in April 2025 — visible in the data
- R720 shutdown impact — visible as consumption drop in June 2024
- TOU cost estimates: today's hydro cost + this month's hydro cost
Note: See my companion post on parsing Green Button data for a full guide on importing Enbridge and Milton Hydro data into InfluxDB.
Camera Deployment Plan
| Location | Camera | Status |
|---|---|---|
| Front door | Reolink Doorbell PoE | |
| Driveway | Reolink RLC-820A | After bench test |
| Garage interior | Reolink RLC-820A | After bench test |
| Basement | Reolink RLC-820A | After bench test |
| Under deck | Reolink RLC-820A | New cable run |
| Stair alley | Reolink RLC-820A | New cable run |
| Gravel alley | Reolink RLC-820A | New cable run |
All cameras on Cisco SG300-28P PoE switch (180W budget, currently using 32W).
Coming Next
- Doorbell motion → outside/foyer lights automation
- Family arrival → outside lights (Life360 presence)
- Lutron switch install → garage/laundry motion automations
- Reolink RLC-820A ×6 bulk order (after bench test passes)
- ESPHome + HC-SR04 water softener salt level monitor
- ESP32-CAM + AI on the Edge for water meter digit reading
- Emporia Vue 3 / Refoss EM16P panel-level energy monitoring
- Hailo-8L M.2 AI accelerator for Frigate
- InfluxDB + Grafana long-term logging stack (already running)
- HomePod mini for proper Matter/Thread hub
Key Lessons
- Define your architecture before buying anything. Hub sprawl happens one device at a time.
- Local control is a philosophy, not a feature. "Works with Alexa" means cloud. Matter with BLE proxy means local. Read the fine print.
- MQTT is worth the complexity. Rock solid once running. Use per-service credential isolation — one Mosquitto user per addon.
- Bench test everything. One Reolink RLC-520A for one week before ordering six more.
- The Frigate config path will waste your time. It's
/addon_configs/ccab4aaf_frigate-fa/config.yaml. Bookmark it. mkdir -p /share/mosquitto— do this before starting Mosquitto. Not documented. Saves an hour.- Matter needs IPv6 on LAN + BLE proxy if your server has no Bluetooth. Both required, both underdocumented.
- Multiple simple automations beat complex branching logic. Three garage fan automations that each do one thing are infinitely easier to debug than one with nested conditions.
- Your family will use Apple Home. Build for that. HA dashboard is for you. Apple Home is for everyone else.
- Sell your old gear before buying new gear. Amazon plugs, old hubs, old Apple TVs fund the upgrade.
HAOS 18.0 | Frigate v0.17.1 | Zigbee2MQTT 2.12.1 | Matter Server 9.0.3 | Lenovo M710q i5-6500T 16GB | InfluxDB 1.x | Grafana
Questions welcome — happy to share config files for any of the above.