Skip to content

Add self-hosted camera dashboard using go2rtc + WebRTC#1

Open
dlfoster311 wants to merge 12 commits intomainfrom
claude/self-hosted-camera-app-fUHLl
Open

Add self-hosted camera dashboard using go2rtc + WebRTC#1
dlfoster311 wants to merge 12 commits intomainfrom
claude/self-hosted-camera-app-fUHLl

Conversation

@dlfoster311
Copy link
Copy Markdown
Owner

Adds a cameras/ page that streams Wyze RTSP feeds directly in the
browser via go2rtc — no Wyze cloud, no subscription required.

Features:

  • Live WebRTC streams from go2rtc (converts RTSP → WebRTC locally)
  • 1×1, 2×2, 1+3 grid layouts
  • Per-camera connect/disconnect, mute, and fullscreen controls
  • Settings panel to configure go2rtc host and camera list (localStorage)
  • Setup guide with Frigate NVR recommendation and step-by-step go2rtc setup
  • Dark theme, mobile-responsive

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz

Adds a cameras/ page that streams Wyze RTSP feeds directly in the
browser via go2rtc — no Wyze cloud, no subscription required.

Features:
- Live WebRTC streams from go2rtc (converts RTSP → WebRTC locally)
- 1×1, 2×2, 1+3 grid layouts
- Per-camera connect/disconnect, mute, and fullscreen controls
- Settings panel to configure go2rtc host and camera list (localStorage)
- Setup guide with Frigate NVR recommendation and step-by-step go2rtc setup
- Dark theme, mobile-responsive

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Configured for 2 Wyze cameras with RTSP. Addresses the specific Wyze
pain points: accurate cat/dog/person/car detection via local AI (no
cloud), motion masks for wind chimes and shadows, zone-based alerting
so the street doesn't trigger, and configurable confidence thresholds
to cut false positives.

Includes:
- docker-compose.yml with sensible defaults, hardware accel comments
- config/config.yml with go2rtc stream setup, per-object score filters,
  motion threshold tuning, snapshot/recording retention, and zone examples

User needs to fill in camera IPs and draw masks/zones in the Frigate UI.

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Wires up the full notification pipeline:
- mosquitto: MQTT broker that Frigate publishes detection events to
- notifier: Python service that reads MQTT events and sends push
  notifications to ntfy (iOS/Android app, free)

Notification rules (all configurable in docker-compose env vars):
- Only alert on specified objects (default: person, car — not cat/dog)
- Minimum AI confidence threshold (default: 75%)
- Only fire when object is inside a defined zone (ignores the street)
- Per-camera+object cooldown to prevent notification spam (default: 2min)
- Links back to the Frigate event in the UI on tap

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Full feature stack:

Face recognition (DeepStack + Double-Take)
- DeepStack runs the AI face recognition model locally
- Double-Take orchestrates: watches Frigate person events, sends
  snapshots to DeepStack, publishes results to MQTT
- Known family members → quiet "arrived home" notification
- Unrecognized face → urgent "Stranger at [camera]" alert
- Train faces via the Double-Take UI at http://localhost:3000

HomeKit + Google Home (Scrypted)
- Native iOS Home app, Apple Watch, and Siri camera access
- "Hey Siri, show me the front door" works
- Add via Scrypted UI → Frigate NVR plugin → HomeKit plugin

Self-hosted ntfy
- Push notifications now served locally (no cloud dependency)
- Snapshot images embed in notifications (ntfy fetches directly
  from Frigate on the same Docker network)
- Subscribe via Tailscale IP so it works away from home too

Tailscale VPN (tailscale-setup.sh)
- Secure, encrypted access to all services from iPhone/Android
- No port forwarding, no public exposure
- Run once on host, install app on phones, done

Notifier updates
- Routes persons through Double-Take instead of generic Frigate alerts
- Dedicated package delivery notification ("Package delivered at...")
- Family vs stranger alert logic with configurable KNOWN_PEOPLE

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Replaces manual config editing with an interactive setup wizard:

- Asks 8 questions (camera IPs, RTSP password, names, GPU, timezone)
- Writes a .env file — docker-compose reads it automatically, no YAML editing
- Camera IPs/credentials flow through FRIGATE_* env vars into config.yml
- Applies hardware acceleration preset via sed (default: CPU-only safe mode)
- Runs docker compose pull + up -d
- Installs Tailscale and updates .env with the Tailscale IP
- Restarts ntfy and notifier with the correct external URL
- Prints all service URLs and next steps at the end

Also:
- Updated for 4 cameras (front_door, backyard, front_yard, side_yard)
- shm_size raised to 512mb (recommended for 4 cameras)
- num_threads raised to 4
- .gitignore added to exclude .env (contains credentials)
- double-take/config.yml pre-populated with all 4 camera names
- All ⚠️ manual-edit markers removed from docker-compose.yml and config.yml

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
- setup.sh now asks per-camera whether it's pan/tilt
- PTZ cameras get ONVIF + autotracking config blocks auto-generated
  (Wyze Pan Cam uses ONVIF port 2020, reuses RTSP credentials)
- Frigate will physically rotate the camera to follow detected people
- calibrate_on_startup: true automatically finds pan/tilt limits
- Confirm screen shows "(pan/tilt + autotracking)" for PTZ cameras
- Final summary prints Wyze conflict warning + home preset instructions
- PTZ flags saved to .env for reference

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Frigate listens to camera microphones and fires MQTT events on specific sounds.
The notifier subscribes to frigate/+/audio/+ and routes them to ntfy.

Supported and wired up:
  glass_breaking       → urgent alert  "Glass breaking"
  screaming            → urgent alert  "Screaming detected"
  fire_alarm           → urgent alert  "Fire alarm"
  smoke_detector_alarm → urgent alert  "Smoke alarm"
  bark                 → default alert "Dog barking"
  speech, motorcycle   → low-priority (can filter out in future)

Note: gunshot detection is not in Frigate's built-in audio model. The default
model covers the above list only.

Two-way audio works via Scrypted + HomeKit (Apple Home app intercom).
Frigate itself doesn't implement audio talk-back.

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Default ntfy cache_duration is 12h, which means notifications disappear
from history quickly. 168h (7 days) keeps a full week of alert history
visible in the ntfy app and web UI.

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Daily digest (new service: digest/):
- Runs every morning at 8am (configurable via DIGEST_HOUR in .env)
- Fetches all of yesterday's Frigate events via API
- Sends an ntfy notification: "14 people · 3 cars · 1 package"
- Attaches a ghost composite image: all person snapshots overlaid with
  transparency so every position shows at once (the "multiple people" effect)
- Falls back to a thumbnail grid if fewer than 3 person detections
- ntfy attachment expiry set to 72h so images are accessible for 3 days

Quiet hours (notifier):
- New QUIET_HOURS_START / QUIET_HOURS_END env vars (default: 10pm–7am)
- During quiet hours: car, package, family arrival, bark alerts are suppressed
- Strangers, glass breaking, screaming, fire/smoke alarms always fire
- Set both to the same value to disable quiet hours entirely

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
License plate recognition (new service: lpr/):
- Listens for car events via MQTT; on event end, downloads the snapshot
  and posts to Plate Recognizer API (free tier: 2,500 reads/month)
- Sends ntfy notification: "ABC-1234 · White Sedan · Ontario" + snapshot
- Per-plate cooldown (default 1hr) prevents repeat alerts for parked cars
- Appends every detected plate to /data/plates.log for later review
- Gracefully disabled if PLATE_RECOGNIZER_TOKEN is not set in .env

Spatial awareness (notifier):
- Reads each event's bounding box height as a fraction of the frame
- Classifies distance: "close" (>55%), "mid" (25-55%), "far" (<25%)
- Proximity phrase appended to notification body:
    "Stranger — right at the camera" vs "Stranger — far edge of view"
- Close detections bump priority one level (close stranger → max urgency)
- Thresholds tunable via PROXIMITY_CLOSE / PROXIMITY_MID in .env

Twin composite / pan cameras (digest):
- Replace semi-transparent ghost with full-opacity twin effect:
  crops each person's bounding box region at 100% opacity and pastes
  onto a base frame — literally looks like multiple people in yard
- Deduplicates positions that overlap (15% threshold) so twins spread out
- Add TWIN_CAMERAS env var: only list static cameras in the composite
  (exclude PTZ/pan cameras whose background shifts between shots)

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
New service (species/):
- Subscribes to Frigate MQTT events for configurable animal labels
  (bird, cat, dog, deer, bear, raccoon, fox, squirrel by default)
- On event end, downloads the cropped animal snapshot from Frigate
- Sends to iNaturalist computer vision API for species identification
- The iNat model is trained on tens of millions of wildlife photos and
  covers birds, mammals, reptiles, insects, amphibians — all of nature
- Sends ntfy notification: "Northern Cardinal at Backyard"
  with the snapshot attached and scientific name in the body
- 30-minute per-species cooldown so you're not spammed when the same
  bird hangs out at the feeder all morning
- Logs every sighting to /data/sightings.log with timestamp + confidence
- Gracefully disabled if INAT_TOKEN is not set in .env

Optional accuracy improvement: set INAT_LAT + INAT_LNG in .env so the
model can use local species range data to pick between similar-looking
birds/animals (e.g. Cooper's Hawk vs Sharp-shinned Hawk)

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Explains that "bash is not recognized" on Windows means bash isn't in
PATH, and gives two options: Git Bash (quickest) or WSL (recommended).

https://claude.ai/code/session_013Uou3hhxTzooTKyGfBkoLz
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants