**Structure & Task**

- **Auto-detects** the port (`/dev/serial/by-id/...`, then `ttyACM0` / `ttyUSB0`)
- **Sends `log on`** on connect (no manual step)
- **Adds `wall_time`** (UTC ISO timestamp) as the first column — better than `ms` alone for long runs
- **`scripts/requirements.txt`** — `pip install -r scripts/requirements.txt`
- **`scripts/dryer-logger.service`** — optional systemd unit for logging at boot

**On the Pi (one-time setup)**

```bash
git clone <your-repo> ~/voron-filament-dryer   # or copy the repo over
cd ~/voron-filament-dryer
pip install -r scripts/requirements.txt
sudo usermod -aG dialout $USER   # then log out/in
```

**Manual run**

```bash
# Interactive dashboard (set target, presets, fan, CSV logging)
python3 scripts/capture_csv.py tui

# Headless CSV capture only
python3 scripts/capture_csv.py log
# logs/dryer_YYYYMMDD_HHMMSS.csv
```

**TUI keys:** `0` idle · `t` target · `p` presets · `f` fan on · `F` fan off · `l` CSV log · `a` autotune · `c` fanchars · `:` command · `q` quit

**Always-on logging**

```bash
# Edit User/WorkingDirectory paths in scripts/dryer-logger.service if needed
sudo cp scripts/dryer-logger.service /etc/systemd/system/
sudo systemctl enable --now dryer-logger.service
```

No firmware changes needed — the Arduino still streams `csv,...` every 2 s when logging is on. If the Pi and your PC both try to use the same USB cable, only one can hold the serial port at a time.