a doorbell that pretends to be a camera
Eufy’s battery doorbells have no RTSP stream. No local stream of any kind. Scan one and the only open port is UDP 32108, Eufy’s own P2P protocol, and it only talks when the doorbell is awake. An NVR wants the opposite: a camera that’s always there and never stops.
eufy-bridge is the thing in between. It turns a Eufy battery doorbell (tested on the T8214) into an ordinary, always-on RTSP camera for Shinobi, or Frigate, or VLC, and only wakes the doorbell when there’s something to see.
How it fakes it
The bridge logs into Eufy as a second account the doorbell is shared to. When Eufy pushes a motion, person or ring event, or when someone opens the live view, it starts the P2P stream for 45 seconds and re-encodes it into one RTSP feed.
Between events it doesn’t go dark. It plays a five-second loop of the last frame it saw, dimmed, blurred, and stamped idle - last live HH:MM. The NVR never knows the camera went to sleep.
The trick is that the switch is invisible to the decoder. The idle loop and the live re-encode share an identical SPS, checked byte for byte: same geometry, profile, level, no B-frames. Every cut lands on a keyframe and one 10 fps clock paces both, so the muxer only ever copies and the timestamps never wobble. -tune zerolatency would have made the live path faster, but it flips one bit in the SPS, so it’s out.
What it costs
- Idle: ~0.2% of one core, 28 kbps, about 0.3 GB a day on the NVR’s disk
- Live: ~1.4 Mbps, about 8 MB per 45-second event
- Tap “live” to picture: 1.3 seconds, via an nginx
mirrorthat wakes the doorbell whenever someone opens the video stream while the JPEG snapshot stays free
What it isn’t yet
It’s 0.1.0 and the README says so plainly. The library underneath, eufy-security-client, was archived in September. The bridge stays pinned to a version that works, and when Eufy changes their protocol, somebody gets to port it. Nobody’s watched a real motion event go end to end yet; so far it’s been driven by the manual trigger and the viewer hook. No audio. Nothing restarts it after a reboot.
The README also has a section called Traps found on the way, which is the part I’d read first. Shinobi saves snap: "1" as the number 1, then only builds the JPEG output for the string. Nothing errors. The snapshot just isn’t there.
Built on eufy-security-client. If you’ve got one of these doorbells and an NVR that’s been ignoring it, it’s on GitHub.