Skip to main content

Reusable primitives for IP-camera clip tools (Tesla, Wyze, Reolink, UniFi, Ring, Nest, Eufy, Frigate).

Project description

tesla-clip-tools

PyPI CI

Reusable primitives for building tools that read Tesla TeslaCam, SentryClips, and SEI data — plus the same Source/Event/sampler/vlm/notify pipeline applied to Wyze, Reolink, UniFi Protect, Ring, Nest, Eufy, and Frigate.

Extracted from sentrytriage v0.2 → v0.3 so that future projects (planned: an FSD-Disengagement Studio, a Wyze/Reolink/UniFi port of sentrytriage) can share the same primitives without forking.

Install

pip install tesla-clip-tools                      # base
pip install 'tesla-clip-tools[sei]'               # adds protobuf+pandas for sei_dataframe()

Or with uv:

uv add tesla-clip-tools
uv add 'tesla-clip-tools[sei]'

Until the first PyPI release lands, install directly from GitHub:

uv add git+https://github.com/Raymondriter/tesla-clip-tools

What's inside

tesla_clip_tools/
├── sources/
│   ├── base.py          Abstract Source + Event dataclass
│   ├── tesla.py         SentryClips/<YYYY-MM-DD_HH-MM-SS>/{cam}.mp4 (HW3 4-cam + HW4 6-cam)
│   ├── wyze.py          Wyze SD-card / RTSP folder layout
│   ├── reolink.py       Reolink NVR folder layout
│   ├── unifi_protect.py UniFi Protect export layout
│   ├── ring.py          Ring downloads layout
│   ├── nest.py          Nest / Google Home downloads layout
│   ├── eufy.py          Eufy app / HomeBase NAS export layout
│   └── frigate.py       Frigate NVR clips/ layout (+ sibling .json metadata)
├── sampler.py           Frame extraction via imageio (bundled ffmpeg, no system dep)
├── vlm/
│   ├── base.py          Generic VLMBackend protocol parameterised on a Pydantic response_format
│   ├── openai.py        gpt-4o-mini default, structured outputs via beta.chat.completions.parse
│   └── ollama.py        Local Qwen2.5-VL etc. via the Ollama HTTP API + JSON-schema format
├── notify/
│   ├── base.py          Notifier protocol
│   ├── pushover.py
│   └── telegram.py
├── sei.py               SEI metadata extraction from Dashcam (Saved/Recent) clips
└── dashcam.proto        Tesla's published proto schema (vendored)

Generating the SEI protobuf module

For the SEI dataframe convenience function, you also need to generate the protobuf module once:

protoc --python_out=src/tesla_clip_tools src/tesla_clip_tools/dashcam.proto

iter_sei_payloads() works without protobuf — it just yields raw protobuf-encoded byte payloads.

Minimal example

from pathlib import Path
from tesla_clip_tools.sources.tesla import TeslaSource
from tesla_clip_tools.sampler import sample_keyframes
from tesla_clip_tools.vlm.openai import OpenAIBackend
from pydantic import BaseModel

class MyVerdict(BaseModel):
    is_interesting: bool
    why: str

source = TeslaSource(Path("~/Tesla/SentryClips"))
vlm = OpenAIBackend(model="gpt-4o-mini")

for event in source.discover():
    samples = sample_keyframes(event.cams, n_per_cam=4)
    captions = [f"[{s.cam} t={s.timestamp_seconds:.1f}s]" for s in samples]
    verdict = vlm.classify(
        images=[s.image for s in samples],
        captions=captions,
        system_prompt="Decide if this Sentry event deserves attention. Default to false.",
        response_format=MyVerdict,
    )
    print(event.id, verdict.is_interesting, verdict.why)

Design choices

  • Generic VLM API. Every backend takes a response_format: type[BaseModel] so different consumers (sentrytriage, FSD-Disengagement Studio, future tools) define their own verdict schema without forking the backend.
  • No state. No SQLite, no daemon, no notifications-orchestration. Those are application concerns; the library is just primitives. Use notify/ if you want one of the included notifiers, but it's optional.
  • No system ffmpeg required for the read path. sampler.py uses imageio[ffmpeg] which bundles its own ffmpeg binary. (Tools that build filter graphs — the highlight reel in sentrytriage, e.g. — still need system ffmpeg.)
  • Source-pluggable. tesla.py implements the canonical TeslaCam folder layout; wyze.py, reolink.py, unifi_protect.py, ring.py, nest.py, eufy.py, and frigate.py ship in 0.4. Add a new vendor by subclassing Source — the rest of the pipeline doesn't care.

Status

v0.4 — alpha, API may still change. Used in production by sentrytriage v0.3+ and fsd-disengagement-studio.

Changelog

See CHANGELOG.md for the version history. Releases are cut following the steps in RELEASE.md.

License

MIT.

CI

ci

GitHub Actions runs ruff + pytest on Python 3.12 and 3.13 against every push and PR. See .github/workflows/ci.yml. The same tests also run as part of the workspace-level monorepo CI at C:\Dev\tesla\.github\workflows\ci.yml.

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

tesla_clip_tools-0.4.0.tar.gz (25.0 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

tesla_clip_tools-0.4.0-py3-none-any.whl (28.4 kB view details)

Uploaded Python 3

File details

Details for the file tesla_clip_tools-0.4.0.tar.gz.

File metadata

  • Download URL: tesla_clip_tools-0.4.0.tar.gz
  • Upload date:
  • Size: 25.0 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for tesla_clip_tools-0.4.0.tar.gz
Algorithm Hash digest
SHA256 a7b26587668483eba1cc1526493446dd7ff1e219c7de0822e8867b72f3017689
MD5 f3a0a76745ed044f6ce75e12f7e1b82f
BLAKE2b-256 b525555836c6e0193752a70ac707f43df0c6375119cd25ef90287a63ee4899e0

See more details on using hashes here.

File details

Details for the file tesla_clip_tools-0.4.0-py3-none-any.whl.

File metadata

  • Download URL: tesla_clip_tools-0.4.0-py3-none-any.whl
  • Upload date:
  • Size: 28.4 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: uv/0.11.12 {"installer":{"name":"uv","version":"0.11.12","subcommand":["publish"]},"python":null,"implementation":{"name":null,"version":null},"distro":null,"system":{"name":null,"release":null},"cpu":null,"openssl_version":null,"setuptools_version":null,"rustc_version":null,"ci":null}

File hashes

Hashes for tesla_clip_tools-0.4.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d2cb8891e3e469e998934d0c9c997021c8f0861385dc564e01f6fb4a4baea024
MD5 abcfaeb86a19fe34ba29b6325bf75be9
BLAKE2b-256 66ae3f636b72c2ae7bef009a6d09bb0c6af3af0ae66c589d5caf7f3284dc3636

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page