Samsung announced in June that SmartThings API access goes paid in October, $4.99/month for personal use. Maybe personal tokens get an exemption, maybe the HA integration survives untouched, I honestly don’t know. But with a baby due in November I didn’t feel like betting the house on a pricing FAQ, so I spent ten days moving our whole apartment off SmartThings.
The server is the part people will yell at me about: it’s my old M1 MacBook, lid closed, kept awake with caffeinate. Yes I know, get a Pi, get a NUC. But the M1 was sitting in a drawer doing nothing, it’s completely silent, it has a built-in UPS (the battery, 210 cycles and still fine), and the full stack barely registers on it - the Stream Deck next to it shows 9.6 W package power, CPU at 68 C, fan at 1,212 rpm. The Mac itself has been up 31 days, longer than this server project has existed. The compose volumes are all relative paths, so the day I do buy a Pi 5 I copy one directory and go. Both arm64, same images.
Coordinator is a Sonoff ZBDongle-P. Stack is Home Assistant + Mosquitto + Zigbee2MQTT + Postgres under docker compose. Sounds like an afternoon of work. It was not, and macOS was the reason, twice.
First trap: the HA image wouldn’t unpack. invalid tar header, right at the end of a 100% completed download, which looks exactly like a broken network. I re-pulled it three times before checking the actual cause: HA ships its layers as tar+zstd, and Docker older than 23.0 doesn’t know zstd, so it assumes gzip and dies at the last moment. My Docker Desktop was an ancient 20.10. I ended up on colima rather than upgrading Desktop, which brought its own comedy: the Mac now has two docker binaries and the dead one comes first in PATH.
Second trap, and this one has no workaround: you cannot pass a USB device into a container on macOS. Docker Desktop and colima both run containers inside a VM, and the dongle simply doesn’t exist in there. So Zigbee2MQTT runs natively on the host, outside compose, pointed at the same data directory the container would use (so the pairings survive the eventual Pi move without re-pairing 20 devices).
And then, with everything finally in place, I plugged in the dongle and Z2M died on startup. Every single time, getExtAddr timeout. I probed the dongle by hand with raw serial commands to prove it wasn’t bricked (it wasn’t). The real cause took three evenings to find, it’s buried in zigbee-herdsman, and it’s darkly funny - the fix was a 60-line Python script and I’ll write it up later in this thread because it deserves the space. (The post right after this one is about the wallpad, the Korean apartment panel that owns my ceiling lights and, as it turns out, the elevator.)
After that it was two weekends of room-by-room migration, 18 devices the first weekend and the stragglers after. One thing I didn’t expect: several sensors got better after leaving. My bathroom “motion sensor” turned out to be a 4-in-1 that exposes a presence channel the SmartThings driver never showed me.
The ST hub is off now. Automations are in HA, history is in Postgres, and the wallpad (Korean apartment RS-485 thing) is a separate saga I’ll get to.
A few weeks in, a verdict I didn’t plan on giving: I’m a little bit in love with HA. I braced for the YAML horror stories and instead most of it was a config flow and a click. And to be fair to SmartThings, it has the prettier app, but pretty was never my problem. The moment you want to touch anything programmatically it fights you, and that’s exactly the layer that’s about to get a price tag.
The one ST screen I did miss was the Map View. Here’s what it looked like in July:
Pretty, right? This is the part ST genuinely does well. So I rebuilt the idea in HA as a floorplan dashboard: live temperature, lights and presence per room, plus the four buttons we actually use. One of those calls the elevator, which is the wallpad post’s problem to explain.
Anyone else jumping before October, or are you waiting to see where the fee actually lands?
P.S. Apologies that every screen in the photos is in Korean
the wallpad post will be worse.




