I was standing in my kitchen, staring at a light switch that would not respond. The Alexa app showed the device as “unresponsive.” The SmartThings app spun its loading wheel for thirty seconds before giving up. My internet was fine, but the cloud service my lights depended on had a partial outage, and my house was effectively dead in the water until someone at Amazon noticed. That was the day I started ripping cloud dependencies out of my smart home setup.
Three months later, my lights turn on in under 50 milliseconds (a tenth of the time it used to take), my motion sensors work even when the internet is down, and I have not seen a “device unresponsive” notification in over two months. The setup runs entirely on a Raspberry Pi (a $35 single-board computer the size of a credit card) in my network closet. The cloud is gone. Local control is back.
What I had before
My old setup was the standard “buy a hub, buy some bulbs, hope it all talks to the cloud” arrangement most people end up with. A SmartThings hub, eight Hue bulbs, three Kwikset locks, four Ecobee thermostats, a couple of motion sensors, and a Ring doorbell. Every device phoned home to its own manufacturer’s cloud. The hubs and apps were just convenient interfaces to those cloud APIs (application programming interfaces, the documented way one program talks to another over a network).
When the cloud blinked, so did the house. The Alexa app could not reach the SmartThings cloud for an afternoon last March and I had to use physical switches for six hours. The Hue bridge has its own cloud dependency that goes down about once a quarter. Ecobee’s API is reliable but slow, with command latency (the time between sending a command and the device acting on it) measured in 1-3 seconds. None of this was the end of the world, but it added up to a smart home that was fragile in ways I did not notice until I needed it to actually work.
The first thing I tried was Home Assistant, the open-source home automation platform that runs on a Raspberry Pi or a small server. Home Assistant speaks almost every smart home protocol ever made: Zigbee (a low-power wireless protocol for smart home devices), Z-Wave (a competing low-power wireless protocol), Matter (a newer cross-vendor smart home standard backed by Apple, Google, and Amazon), MQTT (a lightweight messaging protocol designed for small devices), and a long list of vendor-specific APIs. The pitch is “all your devices, one local brain, no cloud required.” The reality is that getting from cloud-dependent to fully local is more work than the marketing suggests.
What I actually replaced
The hardware shift was the easy part. I bought a Sonoff Zigbee 3.0 USB dongle for $20 and a Nortek Z-Wave stick for $35. Both plug into the Pi and act as radios that talk to the wireless devices around the house. Then I bought a ConBee II (a popular Zigbee coordinator made by Dresden Elektronik) for an additional $40 because the Sonoff was flaky with my older Zigbee 1.2 bulbs. Three sticks, one Pi, total cost around $130.
The harder part was the migration. Home Assistant does not magically unhook your devices from the cloud. It gives you a local control plane, but each device has to be re-paired to the new radio. That means resetting 14 bulbs, re-pairing 14 bulbs, and re-creating every automation (a rule that triggers an action when a condition is met, like “when motion is detected, turn on the hallway light”). I spent a full weekend on it. The first attempt at the bathroom motion sensor was a 90-minute fight with Zigbee mesh routing (the way Zigbee devices relay signals through each other to reach the coordinator) that ended with me moving the coordinator two feet closer to the bathroom.
Hue bulbs are still paired to the original bridge, which is still on my network, but the cloud it used to talk to is no longer in the loop. The bridge is now an internal endpoint (a service that only devices on my local network can reach) instead of a cloud relay. The Ecobee thermostats still ping ecobee.com for weather data, but the actual thermostat control runs locally. If Ecobee goes down, my house still works. I have not tested this in a real outage, but the logs show zero outbound traffic to ecobee.com when I am running automations.
What the local setup actually gets you
Three things that turned out to matter more than I expected.
- Latency. Commands execute in under 100 milliseconds. The cloud path was 1-3 seconds for Ecobee and 500ms-2s for Hue. Local is fast enough that I can flip a switch and watch the light respond in real time, which sounds trivial until you have lived with cloud lag for a year.
- Reliability. The house works when the internet is down. I tested this on purpose last month by unplugging the cable modem. Lights, locks, motion sensors, and automations all worked. The only thing that stopped was the Ring doorbell, which is hardwired to the cloud and there is no good local alternative.
- Privacy. I do not need to trust Amazon, Google, or any other vendor with the data on when I am home, when I am asleep, and which lights I turn on at 2 AM. The logs stay on the Pi. I can read them with a text editor.
There is a fourth benefit that I did not appreciate until I had it: I can add devices that have no cloud story at all. Aqara (a Xiaomi-owned smart home brand) makes a $15 water leak sensor that runs on Zigbee and just works. There is no Aqara cloud account, no app, no subscription. The sensor reports “wet” or “dry” over Zigbee and Home Assistant picks it up. Compare that to the $50 leak sensors from the cloud brands that need a hub and an account and a monthly fee. The local-first world is a different price tier.
Trade-offs
Local-first is not free. The most obvious cost is time. The migration took me about 20 hours spread over two weekends, and I had to learn a fair amount about Zigbee mesh and MQTT to make it work. If your time is worth $100/hour, the setup cost me more than buying a new SmartThings hub would have. The savings come later, in reliability and the ability to add cheap Zigbee devices without a subscription.
The second cost is the hobby tax. Home Assistant is a real piece of software, not a consumer product. The UI is functional but not pretty. You will write YAML (a human-readable configuration format that uses indentation instead of braces) at some point. When something breaks, the answer is usually a forum post, a Reddit thread, and an hour of debugging. The cloud hubs abstract all of this away. The trade is that you get a tool that is genuinely yours, not a service that can be discontinued on a vendor’s schedule.
The third cost is the device list. Anything that is Wi-Fi-only and cloud-only, like most cheap smart plugs from no-name brands, is not going to work locally. You have to buy devices that speak Zigbee, Z-Wave, or Matter. The selection is good but not infinite. I had to give up two TP-Link Kasa plugs I had owned for years because the new Kasa firmware blocks local control entirely.
For a small apartment with three smart bulbs and a smart plug, this is overkill. For a house with 15+ devices and a family that depends on the lights coming on when they get home, it is a real improvement. The migration took 20 hours but I have not had a “device unresponsive” notification since.
What I would tell past me
If I could send a message back to the version of me standing in that kitchen in March, I would say four things.
- Buy the right radio first. I started with a single Sonoff stick and it was flaky. The ConBee II ($40) is the one I should have bought on the first try. Spend the extra $20.
- Do the migration in stages. I tried to do the whole house in one weekend and burned out on day two. Lights first, locks second, automations last. Each stage is a self-contained win.
- Plan the Zigbee mesh. Zigbee is a mesh network (each device relays signals for nearby devices, extending range), and the layout of your house matters. Thick walls, metal studs, and microwaves all degrade the signal. Put the coordinator in a central location, not in a network closet in the basement.
- Keep the cloud account as a backup for the first month. I did not need it after the migration, but having it as a fallback made the first few Zigbee pairing failures a lot less stressful.
The smart home I have now is not flashy. There is no app with a slick UI. The automations live in a YAML file I edit over SSH (a secure command-line connection to a remote machine). But the lights turn on when I flip the switch, every time, in under 100 milliseconds, with or without internet. That is what “smart” was supposed to mean in the first place.