Files
3d-printing/CLAUDE.md
T
Mortdecai a4797227ea docs: comprehensive session documentation for handoff
Full documentation of Frigate NVR setup, cam-control webapp architecture,
PTZ CGI command reference, OctoPrint timelapse storage, gotchas and
lessons learned. Ready for cold pickup in a future session.

Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
2026-03-26 19:17:25 -04:00

6.5 KiB

3D Printing Project

Project Overview

3D printing setup and management for a Creality Ender 3 V3 SE, with OctoPrint remote control and IP camera monitoring via a Raspberry Pi proxy.

Hardware

Printer

Printer Speed Extruder Auto-Level Build Volume Hot End
Creality Ender 3 V3 SE 250 mm/s Sprite Direct Drive CR Touch 220x220x250 mm Standard

Filament Inventory

Material Color Brand Diameter
PLA White OVERTURE 1.75 mm
PLA Black OVERTURE 1.75 mm
PLA Black ELEGOO 1.75 mm
PLA Dark Blue ELEGOO 1.75 mm
PLA Transparent SUNLU 1.75 mm
ABS Black Creality 1.75 mm
PETG Red Creality 1.75 mm
PETG Black Creality 1.75 mm

Accessories

  • Creality Hardened Steel MK8 Nozzles (5-pack)

Remote Printing Infrastructure

Raspberry Pi 3 B+ (seth-pi)

  • Hostname: seth-pi
  • OS: Debian 13 (Raspberry Pi OS Lite)
  • User: seth (key-only SSH, no root login)
  • wlan0: 192.168.0.102 (main network, DHCP) — default route
  • eth0: 192.168.0.101/24 (isolated camera router subnet)
  • WiFi SSID: WiFrei

OctoPrint

go2rtc on Pi (v1.9.14)

Restreams both cameras with H.264 hardware transcoding and MJPEG fallback.

  • API: http://192.168.0.102:1984IMPORTANT: binds to 127.0.0.1 only, not accessible from other hosts
  • RTSP: rtsp://192.168.0.102:8554 (binds to all interfaces, works remotely)
  • Config: /etc/go2rtc/go2rtc.yaml
  • Service: go2rtc.service (systemd)
  • Streams:
    • cam1 / cam1_mjpeg — Camera 1 (192.168.0.100)
    • cam2 / cam2_mjpeg — Camera 2 (192.168.0.103)

IP Cameras — TENVIS (on isolated eth0 subnet)

Both TENVIS cameras use credentials admin:admin and expose RTSP on port 554 (/11 path), HTTP on 80, and ONVIF on 8080.

  • Internal model: C9F0SeZ0N0P4L0 (Hi3510-based SoC)
  • Firmware: V9.1.6.1.24-20170925
  • Hardware version: V1.0.0.1
  • CGI interface: /cgi-bin/hi3510/param.cgi
  • cam2 has an SD card inserted (59GB)
Camera Isolated IP Proxy Ports (on .102)
cam1 192.168.0.100 HTTP:18080, ONVIF:18081, RTSP:18554
cam2 192.168.0.103 HTTP:28080, ONVIF:28081, RTSP:28554

Proxy Architecture

The Pi bridges two networks:

  • eth0 (192.168.0.101) connects to an isolated router with the two IP cameras
  • wlan0 (192.168.0.102) connects to the main homelab network
  • socat systemd services proxy each camera port from the isolated subnet to the main network
  • Port scheme: 1xxxx = cam1, 2xxxx = cam2

Proxy services (all systemd, auto-restart):

  • ipcam-proxy-http.service — 18080 -> 192.168.0.100:80
  • ipcam-proxy-onvif.service — 18081 -> 192.168.0.100:8080
  • ipcam-proxy-rtsp.service — 18554 -> 192.168.0.100:554
  • ipcam2-proxy-http.service — 28080 -> 192.168.0.103:80
  • ipcam2-proxy-onvif.service — 28081 -> 192.168.0.103:8080
  • ipcam2-proxy-rtsp.service — 28554 -> 192.168.0.103:554

Frigate NVR

  • URL: https://frigate.sethpc.xyz (port 5000 in CT 241 on node-241)
  • Container: CT 241 (192.168.0.220) — Docker-in-LXC
  • Config: /opt/frigate/config/config.yml
  • Docker Compose: /opt/frigate/docker-compose.yml
  • Storage: /opt/frigate/storage/
  • Version: 0.17.0
  • Streams: printer_cam1, printer_cam2 (via go2rtc section in config, pulls from Pi socat proxies)
  • Exposed ports: 5000 (web), 1984 (go2rtc API), 8554 (RTSP), 8555 (WebRTC)
  • Detector: CPU only (3 threads) — no GPU in this CT
  • Object tracking: Disabled (track: []) — monitoring only, no person/car detection
  • Recording: 7 days continuous, 14 days motion

Frigate Config Gotchas (v0.17)

  • record.retain is NOT valid — use record.continuous.days and record.motion.days
  • record.events is NOT valid — use record.detections and record.alerts
  • Config errors → safe mode (cameras don't start but web UI does)

Camera Control Panel

  • URL: http://192.168.0.220:8090
  • Location: /opt/cam-control/server.py on CT 241 (Frigate)
  • Service: cam-control.service (systemd, enabled)
  • Features: Snapshot-polled live feeds (~5fps), PTZ D-pad (continuous/step), speed control, flip/mirror toggles
  • Source: ./cam-control/server.py
  • Feeds: Proxied from Frigate's go2rtc at 127.0.0.1:1984 (frame.jpeg endpoint, not MJPEG stream)
  • PTZ proxy: Routes commands to cameras via Pi socat HTTP proxies (18080/28080)
  • Threading: Uses ThreadingMixIn — required because feeds are long-polling

Gitea

OctoPrint Timelapse Storage

  • Mount: /mnt/tank on Pi → SMB share //192.168.0.173/tank (node-173)
  • Credentials file: /etc/samba/tank.creds (username=octoprint, password=octoprint)
  • fstab: Uses x-systemd.automount, _netdev, nofail
  • Timelapse dir: /tank/Timelapses on node-173 (owned by octoprint user)
  • Samba user octoprint exists on node-173 (created 2026-03-24)
  • GOTCHA: Was originally pointed at pve197 (.197) — updated to node-173 (.173) after tank migration

PTZ Camera Control (CGI)

Base URLs from main network (via Pi socat proxies):

  • cam1: http://192.168.0.102:18080
  • cam2: http://192.168.0.102:28080

All CGI commands use HTTP basic auth admin:admin at path /cgi-bin/hi3510/param.cgi.

Command Parameters
Move cmd=ptzctrl&-step=0&-act=left/right/up/down (continuous, send stop)
Step cmd=ptzctrl&-step=1&-act=left/right/up/down (auto-stops)
Stop cmd=ptzctrl&-step=0&-act=stop
Home cmd=ptzctrl&-step=0&-act=home
Set speed cmd=setptzspeed&-panspeed=N&-tiltspeed=N (1-5)
Get speed cmd=getptzspeed
Flip/mirror cmd=setimageattr&-flip=on/off&-mirror=on/off
Get image settings cmd=getimageattr
Get device info cmd=getserverinfo

Current State (as of 2026-03-26)

  • cam2 is flipped 180 (flip=on, mirror=on)
  • cam1 is default orientation
  • Both cameras at speed 2

Conventions

  • Camera credentials: admin/admin (default, isolated network only)
  • Pi SSH: key-only as seth, no password auth — reach via ssh seth-pi from steel141
  • Internal password for homelab services: REDACTED_PASSWORD
  • Samba user for timelapse storage: octoprint/octoprint on node-173
  • Pi's wlan0 IP (.102) is DHCP — may change after reboot. Check with nmap if unreachable.