# Dashcam Transfer Automatisch dashcam-opnames (MP4) overzetten van een SD-kaart naar een USB-SSD, met organisatie per datum en camera-positie (front/back). ## Werking ### Hardware setup | Component | Mount | Doel | |---|---|---| | USB-SSD (4TB) | `/mnt/ultratouch` | Opslag | | SD-kaart (USB reader) | `/mnt/sdcard` | Bron | Beide worden automatisch gemount via systemd automount units. ### SD-kaart structuur (bron) De Novatek dashcam slaat opnames op in de volgende structuur: ``` /mnt/sdcard/Novatek/Movie/ ├── 20260529085848_0003363F.MP4 ← front camera ├── 20260529085848_0003364B.MP4 ← back camera ├── 20260529090348_0003365F.MP4 ├── 20260529090348_0003366B.MP4 └── ... ``` **Bestandsnaam conventie:** ``` YYYYMMDDHHMMSS_.MP4 ``` - `YYYYMMDDHHMMSS` — datum + tijd van opname - `` — oplopend nummer - ``: `F` = **front**, `B` = **back** - Bestandsgrootte: ~381 MB per clip (~5 minuten) ### SSD structuur (doel) Na transfer worden de bestanden georganiseerd in een uniforme structuur: ``` /mnt/ultratouch/dashcam/ └── YYYYMMDD/ ← datum uit bestandsnaam ├── front/ ← bestanden met suffix F │ ├── YYYYMMDDHHMMSS_1234567F.MP4 │ └── ... └── back/ ← bestanden met suffix B ├── YYYYMMDDHHMMSS_1234567B.MP4 └── ... ``` ## Het script `dashcam-transfer.py` — Python 3 script (stdlib only, geen externe dependencies). ### Stappenplan 1. **Mount check** — controleert of `/mnt/sdcard` en `/mnt/ultratouch` gemount zijn 2. **Scan** — zoekt `.MP4` bestanden in `Novatek/Movie/` 3. **Ruimte check** — berekent totale benodigde ruimte en vergelijkt met vrije ruimte 4. **Ruimte maken** — als er te weinig ruimte is, worden de oudste datum-mappen op de SSD verwijderd tot er genoeg ruimte is 5. **Transfer** — voor elk bestand: - Kopieer naar `dashcam/YYYYMMDD/{front,back}/` - Verifieer bestandsgrootte (bron vs doel) - Verwijder bronbestand alleen bij succesvolle verificatie 6. **Logging** — elk bestand wordt gelogd met datum, tijd en status ### Gebruik ```bash # Alle bestanden overzetten /usr/local/bin/dashcam-transfer # Beperkt tot eerste N bestanden (handig voor testen) /usr/local/bin/dashcam-transfer --limit 10 ``` ### Logbestand ``` /tmp/dashcam-transfer.log ``` Voorbeeld: ``` [2026-05-29 19:54:29] INFO Transfer voltooid: 303 ok, 0 fouten [2026-05-29 19:54:29] INFO Overgezet: 20260529112143_0003403F.MP4 → 20260529/front/ (381203172 bytes) ``` ## Herstructurering Bestaande data op `/mnt/ultratouch/dashcam/` was oorspronkelijk inconsistent: - 2025: mappen `chauffeur/` en `weg/` (oude dashcam) - Begin 2026: platte bestanden (direct in datum-map) - Vanaf maart 2026: mappen `front/` en `rear/` Het `restructure.py` script heeft alle historische data omgezet naar de uniforme `front/`/`back/` structuur. Hierbij zijn bestanden gesorteerd op basis van de camera-suffix in de bestandsnaam. ## Automatisering ### Architectuur ``` USB insert → udev detecteert vendor:product 14cd:1212 → systemd-run start mount script (niet direct vanuit udev i.v.m. rechten) → wacht tot /dev/disk/by-uuid/00D3-7715 verschijnt → umount eventuele stale mounts → mount UUID op /mnt/sdcard → start dashcam-transfer service → Python script kopieert MP4's naar SSD ``` **SD kaart wordt altijd op UUID gemount** — ongeacht USB poort. ### Configuratiebestanden op de server #### `/etc/udev/rules.d/99-dashcam-trigger.rules` ```udev # Super Top microSD reader ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*[0-9]", ENV{ID_VENDOR_ID}=="14cd", ENV{ID_MODEL_ID}=="1212", RUN+="/usr/bin/systemd-run --no-block --collect /usr/local/bin/dashcam-transfer-mount" # Genesys Logic microSD reader ACTION=="add", SUBSYSTEM=="block", KERNEL=="sd*[0-9]", ENV{ID_VENDOR_ID}=="05e3", ENV{ID_MODEL_ID}=="0751", RUN+="/usr/bin/systemd-run --no-block --collect /usr/local/bin/dashcam-transfer-mount" ``` `systemd-run` draait het script in systemd context (niet udev) — essentieel voor correcte `mount`/`umount` rechten. #### `/usr/local/bin/dashcam-transfer-mount` ```bash #!/bin/bash UUID=/dev/disk/by-uuid/00D3-7715 logger -t dashcam-transfer Trigger: SD card detected # Wacht tot UUID symlink beschikbaar is for ((i=0; i<60; i++)); do if [ -e "$UUID" ]; then break; fi sleep 1 done # Verwijder stale mounts van eerdere USB-poort while mountpoint -q /mnt/sdcard; do umount /mnt/sdcard || break done # Mount via UUID (werkt ongeacht /dev/sdb1/sdd1/sde1) mount "$UUID" /mnt/sdcard -o uid=1000,gid=1000,fmask=0000,dmask=0000 systemctl start dashcam-transfer ``` #### `/etc/systemd/system/dashcam-transfer.service` ```ini [Unit] Description=Dashcam SD card transfer After=mnt-sdcard.mount [Service] Type=oneshot ExecStart=/usr/local/bin/dashcam-transfer User=root ``` #### `/etc/fstab` (SD card niet in fstab — wordt gemount door trigger) ```ini UUID=3027-8ECA /mnt/ultratouch exfat noauto,x-systemd.automount,uid=1000,gid=1000,dmask=0000,fmask=0000 0 0 ``` SSD wordt gemount via systemd automount (permanent aangesloten). ### SD kaart UUID Bij format verandert de UUID. Om de juiste UUID te vinden: ```bash sudo blkid /dev/sdX1 ``` Update vervolgens de `UUID=...` variabele in `/usr/local/bin/dashcam-transfer-mount`.