From fc43381ed98b2a0f5cddeea0d2eedbb96a622b75 Mon Sep 17 00:00:00 2001 From: OpenClaw Date: Sat, 18 Apr 2026 23:03:30 +0000 Subject: [PATCH] Add Frigate-backed starter camera config --- README.md | 18 +++++++++++------- components/MainScene.xml | 2 +- config/cameras.json | 41 ++++++++++++++++++++++++---------------- docs/FRIGATE_SETUP.md | 37 ++++++++++++++++++++++++++++++++++++ docs/ROADMAP.md | 5 +++-- 5 files changed, 77 insertions(+), 26 deletions(-) create mode 100644 docs/FRIGATE_SETUP.md diff --git a/README.md b/README.md index aaae813..d64ae04 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,8 @@ visionLabs Roku is a private Roku app scaffold for viewing home security cameras on a TV. +The current starter path is Frigate-backed, with Roku reading a static inventory of cameras that are managed by Frigate instead of embedding raw camera credentials in the app. + ## Product direction - Brand family follows the user's existing `Labs` naming pattern. @@ -12,7 +14,7 @@ visionLabs Roku is a private Roku app scaffold for viewing home security cameras ## Technical direction - Roku SceneGraph app -- Camera feeds delivered as HLS where possible +- Camera feeds delivered from Frigate in a Roku-friendly format, ideally HLS - Static JSON config for the first prototype - Future backend for editing, persistence, and auth @@ -22,16 +24,18 @@ visionLabs Roku is a private Roku app scaffold for viewing home security cameras - `source/main.brs` - app entry point - `components/MainScene.xml` - initial SceneGraph UI - `components/MainScene.brs` - scene behavior -- `config/cameras.json` - static sample camera config +- `config/cameras.json` - static Frigate-backed starter camera config +- `docs/FRIGATE_SETUP.md` - notes for mapping cameras through Frigate - `docs/ROADMAP.md` - delivery phases and constraints ## Notes -Roku is not a great target for raw RTSP feeds. The clean path is to expose camera streams as HLS, either directly from the NVR or through a relay/transcoder layer. +Roku is not a great target for raw RTSP feeds. With Frigate in the middle, the clean path is to let Frigate manage discovery, auth, and stream brokering, then expose a Roku-friendly live feed format from there. ## Next steps -1. Replace sample camera URLs in `config/cameras.json` -2. Load config into the UI -3. Render a static multi-camera grid -4. Add edit mode and persistence strategy +1. Set the real Frigate base URL in `config/cameras.json` +2. Map the four starter cameras in Frigate using the same IDs as the Roku config +3. Load config into the UI +4. Render a static multi-camera grid +5. Add edit mode and persistence strategy diff --git a/components/MainScene.xml b/components/MainScene.xml index b09e3a6..bb12668 100644 --- a/components/MainScene.xml +++ b/components/MainScene.xml @@ -25,7 +25,7 @@ translation="[80, 260]" width="1760" height="120" - text="Project scaffold is live. Next step: load static cameras.json and render HLS camera tiles." + text="Project scaffold is live. Next step: load Frigate camera config and render the first Roku camera grid." font="font:MediumSystemFont" color="0x8B949EFF" /> diff --git a/config/cameras.json b/config/cameras.json index 75b30af..78dcfce 100644 --- a/config/cameras.json +++ b/config/cameras.json @@ -1,5 +1,10 @@ { "appName": "visionLabs", + "backend": { + "type": "frigate", + "baseUrl": "http://YOUR-FRIGATE-HOST:5000", + "notes": "Keep raw camera credentials in Frigate or go2rtc, not in the Roku repo." + }, "layout": { "type": "grid", "columns": 2, @@ -7,28 +12,32 @@ }, "cameras": [ { - "id": "front-door", - "name": "Front Door", - "streamUrl": "https://example.invalid/front-door/index.m3u8", - "snapshotUrl": "https://example.invalid/front-door.jpg" + "id": "cam195", + "name": "Cam 195", + "frigateCamera": "cam195", + "host": "192.168.0.195", + "onvif": true }, { - "id": "driveway", - "name": "Driveway", - "streamUrl": "https://example.invalid/driveway/index.m3u8", - "snapshotUrl": "https://example.invalid/driveway.jpg" + "id": "cam196", + "name": "Cam 196", + "frigateCamera": "cam196", + "host": "192.168.0.196", + "onvif": true }, { - "id": "garage", - "name": "Garage", - "streamUrl": "https://example.invalid/garage/index.m3u8", - "snapshotUrl": "https://example.invalid/garage.jpg" + "id": "cam201", + "name": "Cam 201", + "frigateCamera": "cam201", + "host": "192.168.0.201", + "onvif": true }, { - "id": "back-yard", - "name": "Back Yard", - "streamUrl": "https://example.invalid/back-yard/index.m3u8", - "snapshotUrl": "https://example.invalid/back-yard.jpg" + "id": "cam228", + "name": "Cam 228", + "frigateCamera": "cam228", + "host": "192.168.0.228", + "onvif": true } ] } diff --git a/docs/FRIGATE_SETUP.md b/docs/FRIGATE_SETUP.md new file mode 100644 index 0000000..a8466ab --- /dev/null +++ b/docs/FRIGATE_SETUP.md @@ -0,0 +1,37 @@ +# visionLabs Frigate setup + +This project now assumes Frigate is the backend that owns camera auth, camera discovery, and stream handling. + +## Starter inventory + +The first four cameras are currently modeled as: + +- `cam195` -> `192.168.0.195` +- `cam196` -> `192.168.0.196` +- `cam201` -> `192.168.0.201` +- `cam228` -> `192.168.0.228` + +All four are ONVIF-capable and should be added to Frigate using matching camera IDs where possible. + +## Important rule + +Do not commit raw camera passwords to this repo. + +Keep camera credentials inside: + +- Frigate config +- go2rtc config +- a local secret file outside version control + +## What to update next + +1. Set the real Frigate base URL in `config/cameras.json` +2. Confirm the Frigate camera IDs match `cam195`, `cam196`, `cam201`, and `cam228` +3. Decide which Frigate live endpoint format the Roku app should consume first +4. Add snapshot and live tile loading in the SceneGraph UI + +## Why this shape works + +- Roku does not want to manage ONVIF directly +- Roku is happier when Frigate handles the camera-side protocol mess +- This keeps the app focused on layout, browsing, and playback diff --git a/docs/ROADMAP.md b/docs/ROADMAP.md index b3df4bf..e82d6ed 100644 --- a/docs/ROADMAP.md +++ b/docs/ROADMAP.md @@ -2,10 +2,10 @@ ## Phase 1 -- Static packaged camera config +- Static packaged Frigate-backed camera config - Simple Roku SceneGraph shell - One screen with a fixed camera grid -- HLS-backed streams only +- Frigate-managed live feeds in a Roku-friendly format ## Phase 2 @@ -28,5 +28,6 @@ ## Constraints - Roku does not directly fit raw RTSP workflows well +- Frigate should own camera auth and camera-side protocol details - HLS is the safest first-class playback target - Packaged JSON is fine for V1 but not enough for runtime editing