dashcam-transfer/docs/superpowers/specs/2026-05-29-dashcam-transfer-design.md

196 lines
5.9 KiB
Markdown

# Dashcam Transfer — Ontwerp
## 1. Doel
Automatisch dashcam-opnames (MP4) verplaatsen van een SD-kaart naar een USB-SSD op een
remote Fedora Linux server (`nextcloud`), met organisatie per datum en camera-positie.
---
## 2. Hardware & Mounts
| Component | Mount point | Device | Bestandssysteem | Status |
|---|---|---|---|---|
| USB-SSD (4TB) | `/mnt/ultratouch` | `/dev/sdc2` | exfat | ✅ Gemount, 3,0T / 3,7T (83%) |
| SD-kaart (via USB reader) | `/mnt/sdcard` | `/dev/sdd1` | exfat | ✅ Gemount, 116G / 117G (100%) |
Beide mounts worden automatisch beheerd door systemd transient automount units.
---
## 3. SD-kaart structuur (bron)
```
/mnt/sdcard/
├── Novatek/
│ ├── Movie/ ← MP4 opnames (338 bestanden, 116 GB)
│ ├── Photo/ ← leeg
│ └── EMR/ ← leeg
├── hitlittlev1.0.exe ← firmware-update tool
└── .Trash-1000/ ← macOS verborgen map
```
### Bestandsnaam conventie
```
YYYYMMDDHHMMSS_XXXXXXXX<kamera>.MP4
```
- `YYYYMMDDHHMMSS` — datum + tijd van opname
- `XXXXXXXX` — sequentieel nummer
- `<kamera>`:
- `F` — **Front**camera
- `B` — **Back**camera
- Grootte: ~381 MB per bestand, ~5 minuten opname
### Voorbeelden
```
20260529085848_0003363F.MP4 → front camera, 29-05-2026 08:58:48
20260529085848_0003364B.MP4 → back camera, 29-05-2026 08:58:48
```
---
## 4. SSD structuur (doel)
### Huidige data (na herstructurering)
```
/mnt/ultratouch/dashcam/
├── YYYYMMDD/ ← 55 datum-mappen (20250808 t/m 20260425)
│ ├── front/ ← hernoemd van chauffeur (2025) of bestond al (2026)
│ └── back/ ← hernoemd van weg/rear (2025/2026)
```
- Alle mappen nu uniform: `front/` en `back/`
- Platte mappen (20260301-20260311) gesorteerd op F/B suffix
- Totale grootte: **3,0 TB**
- Oudste map: ~56 GB, nieuwste: ~59 GB
```
/mnt/ultratouch/dashcam/
└── YYYYMMDD/ ← datum uit bestandsnaam (bv. 20260529)
├── front/ ← bestanden met suffix F
│ └── YYYYMMDDHHMMSS_XXXXXXXXF.MP4
└── back/ ← bestanden met suffix B
└── YYYYMMDDHHMMSS_XXXXXXXXB.MP4
```
---
## 5. Transfer logica
### 5.1 Handmatige uitvoering
Eerste implementatie: een bash-script dat handmatig gestart kan worden.
```bash
/usr/local/bin/dashcam-transfer
```
### 5.2 Automatische trigger (later)
**Aanbevolen**: udev rule + systemd service.
- udev detecteert wanneer `/dev/sdd1` verschijnt (SD-kaart reader)
- Start een systemd oneshot service die het transfer-script uitvoert
- Eventueel: vertraging van 10-30 seconden zodat de automount klaar is
Alternatief: systemd path unit die `/mnt/sdcard/Novatek/Movie/` monitort.
### 5.3 Stappenplan
```
1. Controleer of /mnt/sdcard gemount is
2. Scan /mnt/sdcard/Novatek/Movie/ op *.MP4 bestanden
2a. Als er geen MP4 bestanden zijn → stop
3. Bereken totale grootte van de te verplaatsen bestanden
4. Controleer vrije ruimte op /mnt/ultratouch
5. Als niet genoeg ruimte:
a. Bepaal benodigde ruimte (totale grootte MP4 + 5% marge)
b. Sorteer /mnt/ultratouch/dashcam/ mappen op naam (YYYYMMDD)
c. Verwijder oudste mappen één voor één tot vrije ruimte >= benodigd
d. Log welke mappen verwijderd zijn
6. Voor elk MP4 bestand:
a. Parse datum (YYYYMMDD) uit bestandsnaam (eerste 8 chars)
b. Parse camera-positie (F → front, B → back) uit laatste char voor .MP4
c. Maak target map aan: /mnt/ultratouch/dashcam/YYYYMMDD/{front,back}/
d. Verplaats bestand: mv "$bron" "$doel/"
e. Log de transfer
f. Bij fout: log error, ga verder met volgend bestand
7. Na alle transfers:
a. Verwijder lege submappen in /mnt/sdcard/Novatek/ (Movie, Photo, EMR)
b. Optioneel: unount /mnt/sdcard (alleen bij udev-trigger)
8. Log samenvatting: aantal files, totale grootte, eventuele fouten
```
### 5.4 Overwegingen
- **Alleen `.MP4`** (hoofdlettergevoelig: `*.MP4` en `*.mp4`)
- **Verplaatsen (mv)**, niet kopiëren — SD-kaart wordt niet gekloond
- Alleen **overgezette bestanden** worden verwijderd (via mv, niet aparte rm)
- Vreemde bestanden (`hitlittlev1.0.exe`, macOS `._` bestanden) worden **niet** aangeraakt
- Oude mappen (2025, `chauffeur/`/`weg/`) blijven intact — worden niet overschreven
- **Lockfile** voorkomt dubbele uitvoering (bijv. via flock)
---
## 6. Automatisering
### 6.1 Udev rule (gepland)
```udev
# /etc/udev/rules.d/99-dashcam-sdcard.rules
ACTION=="add", KERNEL=="sdd1", RUN+="/usr/local/bin/dashcam-transfer-trigger"
```
### 6.2 Systemd service
```ini
[Unit]
Description=Dashcam SD card transfer
After=mnt-sdcard.mount
[Service]
Type=oneshot
ExecStart=/usr/local/bin/dashcam-transfer
User=root
```
---
## 7. Logging & Rapportage
- **Logbestand**: `/var/log/dashcam-transfer.log`
- **Formaat**: `[YYYY-MM-DD HH:MM:SS] <niveau> <bericht>`
- **Niveaus**: INFO, WARNING, ERROR
- **Inhoud per bestand**: `[2026-05-29 19:00:00] INFO Verplaatst: Novatek/Movie/20260529085848_0003363F.MP4 → dashcam/20260529/front/`
- **Samenvatting**: aantal bestanden, totale grootte, duur, eventuele fouten
---
## 8. Foutafhandeling
| Scenario | Actie |
|---|---|
| SD-kaart niet gemount | Foutmelding + exit code 1 |
| Ultratouch niet gemount | Foutmelding + exit code 1 |
| Geen MP4 bestanden gevonden | INFO log + exit code 0 |
| Onvoldoende ruimte + geen mappen te verwijderen | ERROR + exit code 1 |
| Bestand kan niet gelezen worden | ERROR log + skip |
| Lockfile aanwezig (al bezig) | WARNING log + exit code 1 |
| Onbekende camera-letter (niet F/B) | FILE overslaan naar onbekend/ map |
---
## 9. Implementatie volgorde
| Stap | Wat | Status |
|---|---|---|
| 1 | Bash script: basale transfer (parsen + mv) | 📝 Te doen |
| 2 | Bash script: schijfruimte-check + cleanup | 📝 Te doen |
| 3 | Bash script: logging + lockfile | 📝 Te doen |
| 4 | Systemd service voor handmatig starten | 📝 Te doen |
| 5 | Udev rule voor automatische trigger | 📝 Te doen |
| 6 | Testen met huidige SD-kaart | 📝 Te doen |