# 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 - **URL:** http://octopi.sethpc.xyz (port 5000 on Pi) - **API key:** see `octopi.sethpc.xzy_api_key.md` ### go2rtc on Pi (v1.9.14) Restreams both cameras with H.264 hardware transcoding and MJPEG fallback. - **API:** http://192.168.0.102:1984 — **IMPORTANT: 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 - **Repo:** https://git.sethpc.xyz/Seth/3d-printing - **Remote:** `https://Seth:REDACTED_GITEA_TOKEN@git.sethpc.xyz/Seth/3d-printing.git` ## 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.