Migration
Replace SmartThings or a cloud smart home hub
Home Assistant replaces the hub and the automations. What it cannot replace is a device whose only control path is a vendor cloud, and working out which of yours those are is the first job.
Can Home Assistant replace a SmartThings or cloud smart home hub?
Home Assistant replaces the hub, the app and the automations, and it keeps working when your internet does not. It is not one migration but three: the hub itself, the radios (you need your own Zigbee or Z-Wave coordinator, because the old hub's radio does not come with you), and the cloud-only devices that have no local control path and will simply stop working. Budget a USB Zigbee coordinator, a re-pairing session for every battery sensor, and an hour a month afterwards, because Home Assistant ships a release with breaking changes every month.
This is not one migration. It is three, they have different costs, and people fail at it because they plan for the first and discover the other two halfway through.
The hub is software: Home Assistant replaces it in an afternoon. The radios are hardware: the Zigbee mesh lives on the coordinator chip inside your old hub, that chip is not coming with you, and every device gets re-paired. The cloud-only devices are a loss, because anything whose only control path runs through a vendor account cannot be brought local at all.
Work out that third category first. It decides whether this is worth doing.
What you are actually giving up#
A hub that just works. SmartThings is an appliance. It updates itself, it has no breaking changes page, and nobody in your house has had to know what YAML is. Home Assistant ships monthly with its own breaking changes section, and one custom component that fails to load can stop the instance from starting. Its operational load is 4 out of 5 on this site's scale. That is not a criticism of the project, it is the price.
Every cloud-only device. A Wi-Fi plug that only speaks to its manufacturer's servers, an appliance that only answers through the vendor app, a doorbell with no local API: these do not migrate. Some have community integrations that reverse the cloud API and break when the vendor changes it. Some can be reflashed. Many are e-waste in this plan, and you should count them before you buy a coordinator.
Voice, on day one. Alexa and Google Assistant do not automatically see Home Assistant entities. Until you expose them back or move to the local Assist assistant, "turn off the kitchen light" stops working. That is the most visible thing you will break.
Two weeks of evenings. Pairing, naming, re-writing automations, and finding that the sensor you just mounted is deaf because the coordinator is in a USB 3 port.
If the house works today and nobody is unhappy, When not to self-host applies. The reasons to do it anyway are concrete: automations keep running when the internet is down, no vendor can retire a device you own, and nobody is monetizing a log of when you go to bed.
Get your device inventory out first#
Before you buy anything, build a table: every device, one row, four columns of name, radio, local control, replacement. The radio column is what matters. Sort every device into:
- Zigbee. Migrates, with your own coordinator and a re-pair.
- Z-Wave. Migrates, with a Z-Wave stick and an exclude-then-include per device.
- Matter or Thread. Migrates most cleanly, and needs a border router.
- Wi-Fi with a local API. Migrates. ESP-based devices can often be reflashed.
- Wi-Fi, cloud only. Does not migrate. Fill in the replacement column now.
Also mark which devices other people depend on. A bedroom lamp is not the same class of risk as the lock or the thermostat, and the ones that matter move last, not first.
Home Assistant
Local-first automation hub that speaks nearly every smart home protocol without a vendor cloud
600 MB idle · ops load 4/5 · Apache-2.0Home automationZigbee2MQTT
Bridges a USB Zigbee radio to MQTT so your sensors stop needing vendor hubs
90 MB idle · ops load 2/5 · GPL-3.0Home automationESPHome
Turns YAML into ESP32 firmware and gives Home Assistant a local, encrypted device link
150 MB idle · ops load 2/5 · MIT (Python tooling) and GPL-3.0 (C++ device runtime)Home automationNode-RED
Browser-based flow editor for wiring devices, APIs and automations together
110 MB idle · ops load 2/5 · Apache-2.0Which one to pick#
Four pieces, and only the first is mandatory.
| Job | Run | Notes |
|---|---|---|
| The hub, the app, the automations | Home Assistant | Mandatory. Everything else plugs into it |
| Zigbee sensors and bulbs from several vendors | Zigbee2MQTT or built-in ZHA | Pick once; switching means re-pairing |
| Devices you build or reflash yourself | ESPHome | Local, encrypted, no MQTT broker needed |
| Logic that outgrew the automation editor | Node-RED | Add later, if at all |
The install method is the decision you cannot cheaply reverse. Home Assistant now supports exactly two: HA OS, an appliance image for a Green, a Pi or a VM, and Container, one Docker image. Core and Supervised were deprecated in May 2025 and lost support at release 2025.12, along with i386, armhf and armv7 builds. If you followed a 2022 tutorial you are probably on a dead path.
Choose HA OS unless you already run a Docker host and enjoy it. Only HA OS gets Apps (renamed from Add-ons in 2026.2), one-click updates and Supervisor-managed backups. Container has no Apps panel, so Thread and Z-Wave lose their turnkey path and you run those containers yourself: fine if you already run Docker Engine, a genuine surprise if you picked Container because it sounded simpler. Give either the documented 2 GB of RAM and 2 vCPUs.
Zigbee2MQTT or ZHA. ZHA is built in, needs no broker, and supports EmberZNet, Z-Stack, ConBee and RaspBee, ZiGate and XBee radios, with the Connect ZBT-2 as the recommended adapter. It does not support Zigbee Green Power or Smart Energy profile devices. Zigbee2MQTT costs two containers (itself plus Mosquitto, which must be up first or it exits) and gives you broader device support, a live network map, OTA firmware pushes and MQTT topics other tools can subscribe to. Take Zigbee2MQTT if you like inspecting things, ZHA if you want fewer parts.
What it actually costs#
A coordinator, roughly the price of two smart bulbs. Buy from the supported list: a CC2652-based stick or an EmberZNet one. Only zStack and EmberZNet adapters support coordinator backups at all, and without one a dead stick means re-pairing the entire mesh.
A USB 2.0 extension cable, which is not optional. A stick in a USB 3 port, or next to an external SSD, sits in a wall of 2.4 GHz noise. Range collapses to a few meters and you will blame the mesh. Get one meter of extension between it and the host, away from any metal rack, then judge coverage. This is the commonest cause of a network that works next to the server and nowhere else.
A channel decision, made once. Zigbee's default channel 11 sits underneath Wi-Fi channel 1, and Wi-Fi wins. If your access points are on Wi-Fi 1, 6 and 11, put Zigbee on 15, 20 or 25:
# zigbee2mqtt data/configuration.yaml
advanced:
channel: 20
network_key: GENERATE
pan_id: GENERATE
serial:
port: /dev/serial/by-id/usb-ITead_Sonoff_Zigbee_3.0_USB_Dongle_Plus-if00-port0Set network_key and pan_id to GENERATE once and never touch them again: changing either forces every device on the mesh to be re-paired, and battery devices usually need a physical reset to comply. Use the /dev/serial/by-id/ path, never /dev/ttyUSB0, which renumbers across reboots. Changing channel later drops devices that miss the announcement, which is why it is a day-one decision.
Disk and attention. Home Assistant idles near 600 MB and lands around 1.6 GB once Mosquitto, Zigbee2MQTT and ESPHome run alongside it. The recorder writes every state change and adds 20 to 150 MB a day; cut it with exclude filters on power meters and device trackers and a lower purge_keep_days before it eats an SD card.
ESPHome is a compiler, not a service. It idles at 150 MB and wants 1 GB or more while building, which is why compiles die on a 1 GB Pi. Every version bump means rebuilding and re-flashing every device, so define twenty identical sensors with one shared YAML package or that becomes twenty edits.
What breaks and how to tell early#
Voice, immediately. Test it on day one, not week three. Either expose entities back to Alexa and Google, or commit to the local Assist assistant on a phone, an ESPHome device or the Voice Preview Edition hardware. Assist runs locally and knows your devices; it is not a general-purpose assistant and language support varies.
Whatever the household uses without thinking. The first complaints are always the same three: the switch by the door, the bedtime routine, and the thing somebody controlled by voice. Migrate those last and keep the old hub powered until they are proven.
Sensors that report intermittently. That is the channel or the USB port, not the battery. Read the network map before you buy batteries.
The first Wednesday of the month. Core ships monthly and deprecates aggressively. Read the breaking changes, keep the previous backup, and note that a backup cannot be restored into an older core version, so a rollback means rolling the container tag back too.
A device you cannot reach. In ESPHome, always include an ap: block with captive_portal so a device that cannot join Wi-Fi raises its own access point. And 2026.1 dropped MD5 OTA authentication for SHA-256: upgrade the machine that flashes firmware before you upgrade devices, or a device in a ceiling becomes a ladder job.
The point of no return#
Re-pairing. Once a Zigbee device joins your new coordinator it has left the old hub's network, and putting it back is the same manual exercise in reverse. So: stand up Home Assistant, bring the SmartThings bridge up so nothing breaks, migrate device classes in order of how little anyone would notice, and unplug the old hub only when the inventory table is fully accounted for.
Back up before each batch. What matters is the whole Home Assistant config directory including the hidden .storage/, which holds config entries and the device and entity registries: restore without it and you re-add every integration by hand. Alongside it, the Zigbee2MQTT data directory, because configuration.yaml holds the network key every paired device depends on. Both are small. Keep them somewhere that survives the server, per Backups that actually restore.
What to do next#
Build the inventory table before you buy anything: it tells you whether this is a Saturday or a shopping trip. Then read the Home Assistant profile, pick HA OS or Container deliberately, order a supported coordinator and a USB extension cable, and plan the channel. If cameras are next, Replacing Ring and Nest cameras runs on the same hardware, and Home automation has the rest.
Questions#
Do I have to re-pair all my Zigbee devices?
Yes. The Zigbee network lives on the coordinator radio, and your old hub's radio is not coming with you. Moving to your own coordinator means putting every device back into pairing mode, one at a time, which for battery sensors usually means a reset sequence with a pin. Plan it as an evening with a ladder and a paperclip rather than a background task, and do the mains-powered devices first because they become the routers that the battery devices join through.
Should I use Zigbee2MQTT or the built-in ZHA integration?
ZHA if you want one fewer moving part and you are on Home Assistant OS: it is built in, needs no MQTT broker, and supports Silicon Labs, Texas Instruments, ConBee and RaspBee radios. Zigbee2MQTT if you want its device support breadth, the network map, OTA firmware updates and MQTT topics you can inspect and reuse from other tools. Zigbee2MQTT costs you an extra container plus Mosquitto. Either is a defensible choice, and switching later means re-pairing, so pick once.
Which Zigbee channel should I use?
Not 11, which is the default and sits underneath Wi-Fi channel 1. Zigbee and Wi-Fi share 2.4 GHz and Wi-Fi transmits far louder. The docs recommend the ZLL channels 11, 15, 20 or 25; if your access points are on Wi-Fi 1, 6 and 11, then Zigbee 15, 20 or 25 give you the quiet gaps. The symptom of a bad choice is not total failure, it is sensors that report intermittently and lights that answer after two seconds, which is why people live with it for months. Changing channel later drops devices that miss the announcement.
Can I keep using SmartThings devices during the migration?
Partly, and it is getting more expensive. Home Assistant's SmartThings integration is a Cloud Push integration: it talks to Samsung's cloud with your Samsung account, so it is a bridge and not a destination, and it stops when Samsung's service does. Samsung has announced that free SmartThings API access is being phased out from October 2026, after which it requires a paid Personal Plan at $4.99 a month. Use the bridge to keep the house working during the changeover, then get off it.
What will my household notice first?
Voice. Alexa and Google Assistant do not automatically see your Home Assistant entities, so on day one nobody can turn a lamp off by asking. You can expose entities back to Alexa or Google through Home Assistant Cloud or your own configuration, or move to the built-in Assist voice assistant, which runs locally and understands your devices but is not as good at general questions. Decide this before the changeover, not after somebody stands in a dark room talking to a speaker.
How much ongoing work is Home Assistant?
About an hour a month, honestly. Core ships a release every month with its own breaking changes section, custom components from HACS often lag by days or weeks, and a single component that fails to load can prevent startup. The recorder database also needs deliberate attention: it writes every state change to SQLite, keeps 10 days by default, and a talkative install adds 50 to 150 MB a day. Read the breaking changes before you click update and keep the previous backup.
Do I need Node-RED as well?
No, and most people should not start with it. Home Assistant's own automation editor covers the great majority of household logic. Node-RED earns its place when you are wiring MQTT, HTTP APIs, a serial device and a database into one pipeline, or when your logic outgrew YAML but you do not want to write a service. If you do run it, set credentialSecret in settings.js on day one, or a restore onto a new host loses every stored password in your flows.
Sources#
- Home Assistant installation docs and method comparison
- Deprecation of Core and Supervised installs and 32-bit systems
- Home Assistant SmartThings integration, cloud push and API plan change
- Zigbee Home Automation (ZHA) integration, supported coordinators
- Home Assistant recorder integration, defaults and purge behavior
- Home Assistant Assist, local voice control
- Zigbee2MQTT 2.0.0 breaking changes discussion
- Zigbee2MQTT network settings, channel and key guidance
- Zigbee2MQTT supported adapters and coordinator firmware
- ESPHome 2026.1.0 changelog, MD5 OTA removal
Published . Last reviewed . Found something out of date? Tell us and we will fix it and log the change.