Skip to content
AbhiramJayasankarPublic

About

Local Wi-Fi camera viewer and control panel with auto-level, snapshots and recording. Built for the BEBIRD protocol; tested on Portronics XLife X0 and open to compatible rebrands.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Latest commit

 

History

2 Commits

Folders and files

Repository files navigation

Scopy — Wi-Fi Camera Viewer

A local desktop viewer and control panel for Wi-Fi cameras using the BEBIRD protocol. Watch the live feed, keep it level as the camera rotates, and save photos or videos without the phone app. Built and tested with the Portronics XLife X0; rebranded cameras using the same local protocol may also work.

Checks License: MIT

Built with Python's standard library and plain HTML/CSS/JavaScript. No Python packages, build step, account, or cloud service required.

Scopy control panel

The existing interface, shown without camera footage.

Features

  • Live MJPEG video, with automatic reconnection and battery/light readouts.
  • Tilt-based auto-level, manual rotation, mirror, zoom, circle/full-frame views, freeze, and fullscreen.
  • Brightness, contrast, warmth, and saturation adjustments for the preview and saved photos.
  • JPEG photos and MJPEG AVI recordings, with a local gallery, thumbnails, and downloads.
  • Tip-light control, HD JPEG quality, nickname, keep-awake switch, and an idle power-off timer.
  • Advanced device settings and experimental Wi-Fi/LED controls; confirmation for power-off, reset, network joining, and setting writes.

Tested hardware: XLife X0, BEBIRD firmware 2.1.90; observed stream 480 × 480 at roughly 12 fps. Other models and firmware versions may use different protocols. HD quality reduces JPEG compression; it does not increase resolution. Recordings preserve the camera feed; preview adjustments apply to photos only.

Compatible cameras and rebrands

Scopy connects directly to a compatible camera over local Wi-Fi. It lets you use the tested XLife device without its mobile app and try other cameras with the same BEBIRD protocol.

Compatibility depends on the firmware protocol, rather than the name on the box:

Camera family Support
Portronics XLife X0, BEBIRD firmware 2.1.90 Tested with live video, battery, tilt, photos, and recording
Rebranded cameras exposing the same BEBIRD HTTP/UDP protocol Candidates for compatibility; not individually tested
Cameras using different protocols, including the NE7 port mapping investigated during development Not currently supported by this implementation

The expected endpoints are HTTP MJPEG on port 58050 at /live, UDP commands on 58090, and UDP tilt on 58098. The tested camera uses IP 192.168.5.1; --ip and --path let you change its address and video path. Video and sensor ports are fixed in the current implementation. A BEBIRD name or a similar-looking camera alone does not establish compatibility.

To try a rebrand, join its hotspot and query device information:

python tools/get_device_info.py --ip 192.168.5.1
python ear_cam.py --ip 192.168.5.1 --ssid "YOUR_CAMERA_SSID"

Replace the IP and SSID with your device's values. A device-info reply is a useful first check; video, tilt, and controls still need to be verified separately. If your model works, open an issue with its brand/model, firmware, and working features so other owners can find it. Redact serial numbers, UUIDs, and MAC addresses from device dumps.

Quick start

You need Python 3.10+, a Wi-Fi adapter, and the camera. Windows is the primary platform. On Linux/macOS, join the camera Wi-Fi manually; the viewer and downloads use portable Python/browser APIs.

Get the project:

git clone https://github.com/AbhiramJayasankar/scopy.git
cd scopy
  1. Turn on the camera and disconnect the phone app from it.

  2. Join the camera's open Wi-Fi hotspot (xlife-X0-...) in your computer's Wi-Fi settings.

  3. From this project folder, run:

    python ear_cam.py
  4. Open localhost:8090 in your browser.

The camera network has no internet. Video and controls work offline. Optional Google Fonts fall back to system fonts without internet. If you want to stay online, use Ethernet, USB tethering, or a second network adapter. Only one client was supported by the tested camera.

On Windows, the app automatically rejoins its configured camera Wi-Fi profile. The default SSID is the original test unit's xlife-X0-968936; for your own camera, save its profile by connecting once, then supply the exact name:

python ear_cam.py --ssid "YOUR_CAMERA_SSID"

Replace YOUR_CAMERA_SSID with the exact name shown in Wi-Fi settings. This may switch your Wi-Fi adapter away from another network. Stop the panel with Ctrl+C; active recordings are finalized on a normal exit.

Controls and captures

Key Action
Space Take photo
R Start/stop recording
C Circle/full-frame view
L Toggle auto-level
T Rotate 90°
F Fullscreen
Escape Close capture viewer

Photos and videos are created in captures/photos/ and captures/videos/. AVI playback uses your video player; browsers show a thumbnail and offer a download. Opening files/folders through the panel is Windows-only. Keep awake prevents the camera's usual idle shutdown; switching it off pauses video and sensor traffic. Stop recording before letting the camera sleep. Wake a sleeping camera with its physical button.

Run python ear_cam.py --help for all options:

python ear_cam.py --ip 192.168.5.1 --http-port 8090 --captures "./captures"

How it works

flowchart LR
    Camera["Compatible Wi-Fi camera"] -->|"HTTP MJPEG :58050"| Python["ear_cam.py"]
    Camera -->|"UDP tilt :58098"| Python
    Python <-->|"UDP commands :58090"| Camera
    Python <-->|"localhost:8090"| Browser["Browser control panel"]
    Python --> Files["Local JPEG / AVI captures"]
Loading

The Python process maintains the camera connection, sends device commands, writes captures, and serves the UI on 127.0.0.1. The browser applies view adjustments and consumes tilt updates through server-sent events. Camera video and network credentials stay between your computer and the camera. The page may request fonts from Google Fonts. The camera's own Wi-Fi protocol is unencrypted; this panel is intended for local use.

Project layout

ear_cam.py                 Camera client, capture writer, and local HTTP server
ear_cam_ui.html            Responsive browser control panel
docs/SETUP.md               Connection guide and troubleshooting
docs/PROTOCOL.md            Protocol findings and command support
docs/DEVELOPMENT.md         Tests, design notes, and GitHub publishing
tools/                     Optional diagnostic and Windows setup tools
tests/                     Hardware-free regression tests
.github/workflows/ci.yml    Linux/Windows checks on Python 3.10 and 3.14

Captures, logs, device dumps, and private research are excluded by .gitignore.

Development

python -m unittest discover -s tests -v
python -m compileall -q ear_cam.py tools tests

The optional JavaScript syntax check requires Node.js: python tools/check_ui.py. The app itself does not require Node.js. Tests run without a camera; live hardware checks are described in development notes.

Background and license

This mini project grew from investigating the XLife camera's local protocol. Research starting points include NE3-Scope and bebird-viewer; implementation findings are documented in the protocol guide. Vendor apps, decompiled sources, and third-party viewers are not distributed here.

MIT license. An independent project, unaffiliated with Portronics or BEBIRD. Compatibility reports for other generic or rebranded Wi-Fi cameras are welcome.

About

Local Wi-Fi camera viewer and control panel with auto-level, snapshots and recording. Built for the BEBIRD protocol; tested on Portronics XLife X0 and open to compatible rebrands.

Topics

Resources

Stars

2 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages