# SESSION.md — 3D Printing Project ## Context Files - `./CLAUDE.md` — full project docs (printer, cameras, Pi, Frigate, cam-control, PTZ commands) - `./CONTEXT.md` — raw hardware purchase inventory (Amazon order data) - `./GITEA_API.md` — Gitea push credentials and commit convention ## Project Summary 3D printing setup with one Creality Ender 3 V3 SE, remotely managed via OctoPrint on a Raspberry Pi 3 B+. Two TENVIS IP cameras on an isolated router subnet are proxied through the Pi (socat) and fed to Frigate NVR + a custom PTZ control webapp. Timelapses stored on tank (node-173) via SMB. ## Memory Discipline - Update `SESSION.md` immediately when a durable fact, decision, or fix is discovered. - Before every final reply, run a memory check and append any missing durable notes. - End every reply with one line: `Session memory: updated` or `Session memory: no new durable facts.` ## Hardware ### Printer | Printer | Speed | Extruder | Auto-Level | Build Volume | |---|---|---|---|---| | Creality Ender 3 V3 SE | 250 mm/s | Sprite Direct Drive | CR Touch | 220 x 220 x 250 mm | ### 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) — for abrasive filaments ## Gitea - Repo: https://git.sethpc.xyz/Seth/3d-printing - Remote: `https://Seth:REDACTED_GITEA_TOKEN@git.sethpc.xyz/Seth/3d-printing.git` - API key: see `./GITEA_API.md` ## Session Notes ### Initial setup (2026-03-17) - Created SESSION.md from template in SESSION.default.md - Organized CONTEXT.md inventory data into structured hardware/filament tables ### Camera/Pi discovery (2026-03-24) - Pi 3B+ (`seth-pi`) found at 192.168.0.102 (wlan0) / 192.168.0.101 (eth0) - eth0 connects to isolated router with 2 IP cameras (192.168.0.100, 192.168.0.103) - 6 socat proxy services bridge camera HTTP/RTSP/ONVIF to main network - go2rtc v1.9.14 restreams both cameras (H.264 hw + MJPEG) - OctoPrint running on port 5000 - Camera creds: admin/admin (default, isolated subnet) - Created CLAUDE.md with full infrastructure documentation - [x] Document OctoPrint setup — done, documented in CLAUDE.md - Camera make: TENVIS (both cameras) ### Frigate NVR setup (2026-03-24) - Added both cameras to Frigate 0.17 on CT 241 (192.168.0.220) - Config at `/opt/frigate/config/config.yml`, docker-compose at `/opt/frigate/docker-compose.yml` - Added port 1984 mapping to docker-compose (go2rtc API, needed for cam-control) - Streams: `printer_cam1`, `printer_cam2` — pulled from Pi socat RTSP proxies - Object tracking disabled, CPU detector only - Gotcha: Frigate 0.17 changed record config schema — no `retain.days` or `events`, use `continuous.days`/`motion.days` ### Camera control panel (2026-03-24) - Built single-page PTZ control webapp (`cam-control/server.py`) - Deployed to Frigate CT 241 at http://192.168.0.220:8090 - systemd service `cam-control.service` enabled and running - Features: snapshot-polled live feeds (~5fps), PTZ D-pad, speed, flip/mirror - Uses Frigate's go2rtc frame.jpeg endpoint (not MJPEG stream — MJPEG proxy through Python urllib doesn't work reliably) - Must use ThreadingMixIn — single-threaded HTTPServer blocks on stream connections - cam2 flipped 180 (flip=on, mirror=on) ### OctoPrint timelapse fix (2026-03-24) - Pi fstab pointed to pve197 for tank SMB — updated to node-173 post-migration - Created octoprint Samba user on node-173 (creds: octoprint/octoprint) - Timelapses dir at /tank/Timelapses now accessible, OctoPrint restarted ### Gotchas & Lessons Learned - Pi's go2rtc API binds to `127.0.0.1` only — not accessible remotely. Use Frigate's go2rtc instead. - Pi's wlan0 is DHCP (192.168.0.102 last seen) — may change. Use `nmap -sn 192.168.0.0/24 | grep Raspberry` from a node to find it. - Pi SSH is key-only as `seth` — reachable via `ssh seth-pi` from steel141, or hop through pve197. - MJPEG streaming through Python urllib is unreliable (0 bytes returned) — use snapshot polling (frame.jpeg) instead. - Frigate 0.17 config schema differs from older docs online — query the Python schema if unsure: `docker exec frigate python3 -c 'from frigate.config import FrigateConfig; ...'` - OctoPrint SMB mount must point to wherever tank lives (currently node-173 at .173). If tank moves again, update Pi fstab. - Caddy config for `octopi.sethpc.xyz` is on CT 600 (192.168.0.185) at `/etc/caddy/Caddyfile` — includes camera stream rewrites at `/cam1.mjpeg`, `/cam2.mjpeg`, `/cam1.jpg`, `/cam2.jpg`. ### Open threads - [ ] Add slicer profiles and recommended print settings per filament type - [ ] Change default camera passwords (admin/admin) — update in: go2rtc.yaml (Pi), Frigate config, cam-control server.py - [ ] Make Pi wlan0 IP static (currently DHCP, could change) - [ ] Fix Pi's go2rtc to bind to 0.0.0.0 if remote MJPEG streaming is ever needed - [ ] OctoPrint config location unknown — not at default `/home/seth/.octoprint/`. Find with: `find / -name config.yaml -path '*octoprint*'` — it's at `/home/octoprint/.octoprint/` (runs as `octoprint` user, venv at `/home/octoprint/venv/`) ### Completed - [x] Document OctoPrint setup - [x] Identify cameras: TENVIS, model C9F0SeZ0N0P4L0 (Hi3510 SoC), firmware V9.1.6.1.24-20170925 - [x] Set up Gitea repo — https://git.sethpc.xyz/Seth/3d-printing - [x] Add cameras to Frigate NVR - [x] Build PTZ camera control webapp - [x] Fix OctoPrint timelapse mount (pve197 → node-173)