My Xiaomi MJSXJ10CM (under 2k, bought and paired in India) now streams 1080p HEVC to my own machine and follows people and objects around my room. Not a single frame leaves the LAN. I didn't flash it, open it or downgrade it. It's still on the firmware Xiaomi shipped, 4.5.6_0450.
go2rtc v1.9.14 plus the go2rtc-xiaomi-control patch speaks Xiaomi's protocol. The only thing that touches the internet is a one-time key exchange. Pan/tilt is a single MISS command, opcode 0x112, with operation 1 to 4 for left, right, up and down.
The thing worth knowing if you try this is that the camera's acknowledgement means "I heard you," not "I moved." I measured frame differences every 200ms after a command, and the picture doesn't change for roughly 1.4 seconds. A naive tracker running on 12fps video fires about fifteen more commands before the first one lands, and the camera just convulses. So after every move my loop ignores everything for 2 seconds, which makes the real control rate 0.5Hz. Steps also aren't symmetric: left moves further than right, and one step shifts the frame by 8 to 12%. That forced the dead zone up to 0.18.
Since this is a motor in my bedroom, I built in some brakes:
- Tracking is off by default.
- Manual buttons cancel automation before the step is sent.
- The dashboard sends a heartbeat every 2s. Six seconds of silence and the server stops the camera.
- Movement is capped at 20 steps a minute.
- Losing the target stops it instead of letting it hunt around.
Detection uses Apple's Vision framework through a small Swift helper, so there are no model downloads. One bug almost got me. Vision uses a bottom-left origin, and if you get that flip wrong, tilt inverts and the camera smoothly runs away from the target.