209 lines
6.1 KiB
Markdown
209 lines
6.1 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 (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<kamera>.MP4
|
|
```
|
|
|
|
- `YYYYMMDDHHMMSS` — datum + tijd van opname
|
|
- `XXXXXXXX` — sequentieel nummer
|
|
- `<kamera>`:
|
|
- `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
|
|
|
|
```
|
|
/mnt/ultratouch/dashcam/
|
|
├── 20250808/
|
|
│ ├── chauffeur/ ← 56 GB
|
|
│ └── weg/
|
|
├── 20250811/ ← 72 GB
|
|
│ ├── chauffeur/
|
|
│ └── weg/
|
|
├── ...
|
|
├── 20260328/
|
|
│ ├── front/
|
|
│ └── rear/
|
|
├── ...
|
|
└── 20260425/ ← 59 GB
|
|
├── front/
|
|
└── rear/
|
|
```
|
|
|
|
- 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
|
|
|
|
### Gewenste structuur (bij nieuwe transfers)
|
|
|
|
```
|
|
/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
|
|
```
|
|
|
|
---
|
|
|
|
## 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] <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 |
|