From bc8139f2f1a05685c510c70eb311ec2556e70349 Mon Sep 17 00:00:00 2001 From: Eddy de Vink Date: Fri, 29 May 2026 19:21:19 +0200 Subject: [PATCH] Volledig ontwerp dashcam-transfer: structuur, logica, automatisering --- .../2026-05-29-dashcam-transfer-design.md | 221 +++++++++++++++--- 1 file changed, 186 insertions(+), 35 deletions(-) diff --git a/docs/superpowers/specs/2026-05-29-dashcam-transfer-design.md b/docs/superpowers/specs/2026-05-29-dashcam-transfer-design.md index 7374081..3dee5dc 100644 --- a/docs/superpowers/specs/2026-05-29-dashcam-transfer-design.md +++ b/docs/superpowers/specs/2026-05-29-dashcam-transfer-design.md @@ -1,24 +1,67 @@ # Dashcam Transfer — Ontwerp -## Huidige situatie (29 mei 2026) +## 1. Doel -### Hardware -- **Remote server**: Fedora Linux (`nextcloud`) -- **SSD (USB)**: 4TB, automatisch gemount op `/mnt/ultratouch` via systemd automount (transient) - - Bestandssysteem: exfat - - 602 GB vrij (84% vol) - - Device: `/dev/sdc2` -- **SD-kaart (USB reader)**: Automatisch gemount op `/mnt/sdcard` via systemd automount (transient) - - Momenteel **niet ingeplugd** — automount faalt met "Dependency failed" - - SD-kaart moet nog worden geïnspecteerd op mappenstructuur +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 (82%) | +| 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.MP4 +``` + +- `YYYYMMDDHHMMSS` — datum + tijd van opname +- `XXXXXXXX` — sequentieel nummer +- ``: + - `F` — **Front**camera + - `B` — **Back**camera (rear) +- 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) + +### Bestaande data -### Bestaande mappenstructuur op SSD ``` /mnt/ultratouch/dashcam/ ├── 20250808/ -│ ├── chauffeur/ +│ ├── chauffeur/ ← 56 GB │ └── weg/ -├── 20250811/ +├── 20250811/ ← 72 GB │ ├── chauffeur/ │ └── weg/ ├── ... @@ -26,33 +69,141 @@ │ ├── front/ │ └── rear/ ├── ... -└── 20260425/ +└── 20260425/ ← 59 GB ├── front/ └── rear/ ``` -- **2025**: `chauffeur/` en `weg/` (vouwfiets dashcam?) -- **2026**: `front/` en `rear/` (auto dashcam met voor- en achtercamera) +- 2025: mappen `chauffeur/` en `weg/` — oude dashcam +- 2026: mappen `front/` en `rear/` — huidige dashcam +- Totale grootte: **3,0 TB** +- Oudste map: ~56 GB, nieuwste: ~59 GB -### Bestandseigenschappen -- Formaat: `.MP4` -- Grootte: ~381 MB per bestand -- Naamgevingsformaat: `YYYYMMDDHHMMSS_XXXXXXXXX.MP4` (bv. `20260425060958_0000001F.MP4`) -- Opname-interval: ~5 minuten per clip +### Gewenste structuur (bij nieuwe transfers) -### Transfer eisen (nog te verfijnen) -- **Detectie**: Automatisch bij inpluggen SD-kaart -- **Modus**: Verplaatsen (move, niet copy) -- **Organisatie**: `YYYYMMDD/front/` en `YYYYMMDD/rear/` op SSD -- **Filter**: Alleen `.mp4` bestanden -- **Opschonen**: Alleen overgezette bestanden verwijderen van SD-kaart +``` +/mnt/ultratouch/dashcam/ +└── YYYYMMDD/ ← datum uit bestandsnaam (bv. 20260529) + ├── front/ ← bestanden met suffix F + │ └── YYYYMMDDHHMMSS_XXXXXXXXF.MP4 + └── rear/ ← bestanden met suffix B + └── YYYYMMDDHHMMSS_XXXXXXXXB.MP4 +``` -### Automount configuratie -- Beide mount points via systemd transient units (geen statische unit-bestanden) -- Aanmaak via `systemd-mount` of udev-regels +--- -## Volgende stappen -1. SD-kaart inspecteren op mappenstructuur na inpluggen -2. Transfer-script schrijven (bash of Python) -3. Service/trigger configureren (udev, systemd path unit, of systemd service) -4. Testen met echte data +## 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 → rear) uit laatste char voor .MP4 + c. Maak target map aan: /mnt/ultratouch/dashcam/YYYYMMDD/{front,rear}/ + 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] ` +- **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 |