Scaling & Monitoring

Sync vidéo et journaux de tests

Découvrez comment joindre des enregistrements vidéo, des fichiers journaux et des données complémentaires aux exécutions de tests hardware dans TofuPilot.

JJulien Buteau
intermediate9 min de lecture14 mars 2026

Synchronisation vidéo et journaux pour les tests hardware

Les mesures vous disent ce qui s'est passé. Les vidéos et les journaux vous disent pourquoi. Un test de vibration échoué prend tout son sens quand vous pouvez voir l'unité se desserrer. Un crash firmware est plus facile à déboguer quand le journal de la console série est juste à côté du résultat de test. TofuPilot stocke les pièces jointes aux côtés des mesures.

Pourquoi les pièces jointes sont importantes

Une valeur de mesure « ÉCHEC » vous dit que quelque chose a cassé. Mais elle ne vous dit pas :

  • À quoi ressemblait physiquement l'unité pendant le test
  • Ce que le firmware a enregistré avant le crash
  • À quoi ressemblait la forme d'onde de l'oscilloscope
  • Ce que l'opérateur a vu sur son écran

Les pièces jointes comblent cette lacune. Elles transforment un résultat de test d'un simple chiffre en un enregistrement complet de ce qui s'est passé.

Types de pièces jointes de test

Type de pièce jointeCas d'utilisationFormat
Enregistrement vidéoInspection visuelle, tests mécaniquesMP4, AVI
Journal de console sérieDébogage firmware, séquence de démarrageTXT, LOG
Capture d'oscilloscopeAnalyse de formes d'onde, timingPNG, CSV
Image thermiqueDétection de points chaudsJPEG, PNG
Journal de la station de testDébogage du logiciel de testTXT, LOG
Fichier de configurationParamètres du DUT ou du montageJSON, YAML
PhotoDocumentation de défaut physiqueJPEG, PNG

Joindre des fichiers aux exécutions de test

Avec le client Python

test_with_attachments.py
from tofupilot import TofuPilotClient

client = TofuPilotClient()

client.create_run(
    procedure_id="VIBRATION-SCREENING",
    unit_under_test={"serial_number": "UNIT-7832"},
    run_passed=False,
    steps=[{
        "name": "Random Vibration 20-2000Hz",
        "step_type": "measurement",
        "status": False,
        "measurements": [{
            "name": "resonance_freq_hz",
            "value": 847,
            "unit": "Hz",
            "limit_low": 900,
            "limit_high": 1500,
        }],
    }],
    attachments=[
        "recordings/unit-7832-vibration.mp4",
        "logs/unit-7832-accel.csv",
        "captures/unit-7832-spectrum.png",
    ],
)

Capturer la vidéo automatiquement

Enregistrer la vidéo pendant le test et la joindre à l'exécution.

video_capture.py
import subprocess
import os

def start_recording(output_path):
    """Démarrer l'enregistrement depuis une caméra USB."""
    proc = subprocess.Popen([
        "ffmpeg", "-f", "v4l2", "-i", "/dev/video0",
        "-t", "120",  # maximum 2 minutes
        "-y", output_path,
    ], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL)
    return proc

def stop_recording(proc):
    """Arrêter l'enregistrement."""
    proc.terminate()
    proc.wait()

# Utilisation dans un test
video_path = f"/tmp/test_{serial}.mp4"
recorder = start_recording(video_path)

# Exécuter le test...
run_test()

stop_recording(recorder)

# Joindre à l'exécution TofuPilot
client.create_run(
    procedure_id="MECHANICAL-TEST",
    unit_under_test={"serial_number": serial},
    run_passed=passed,
    steps=steps,
    attachments=[video_path],
)

Capturer les journaux de console série

serial_logger.py
import serial
import threading

class SerialLogger:
    def __init__(self, port, baudrate=115200):
        self.ser = serial.Serial(port, baudrate, timeout=1)
        self.log = []
        self.running = False

    def start(self):
        self.running = True
        self.log = []
        self.thread = threading.Thread(target=self._read_loop)
        self.thread.start()

    def stop(self):
        self.running = False
        self.thread.join()
        self.ser.close()

    def _read_loop(self):
        while self.running:
            line = self.ser.readline().decode("utf-8", errors="replace")
            if line:
                self.log.append(line)

    def save(self, path):
        with open(path, "w") as f:
            f.writelines(self.log)

# Utilisation
logger = SerialLogger("/dev/ttyUSB0")
logger.start()

# Exécuter le test...
run_test()

logger.stop()
log_path = f"/tmp/console_{serial}.log"
logger.save(log_path)

# Joindre à TofuPilot
client.create_run(
    procedure_id="FIRMWARE-VALIDATION",
    unit_under_test={"serial_number": serial},
    run_passed=passed,
    steps=steps,
    attachments=[log_path],
)

Revue synchronisée

Lorsque vous ouvrez une exécution de test dans TofuPilot, toutes les pièces jointes sont disponibles aux côtés des mesures. Cette vue synchronisée vous permet de :

  1. Voir que resonance_freq_hz a échoué à 847 Hz (en dessous de la limite de 900 Hz)
  2. Regarder la vidéo pour voir le boîtier fléchir pendant le test
  3. Ouvrir le CSV de l'accéléromètre pour voir les données brutes de vibration
  4. Consulter le tracé du spectre pour identifier le mode résonant

Le tout au même endroit, pour une même exécution, en un seul clic.

Quand joindre quoi

Tous les tests n'ont pas besoin de vidéo et de journaux. Les pièces jointes ajoutent du stockage et de la complexité. Utilisez-les là où elles apportent une valeur diagnostique.

Type de testPièces jointes recommandées
Vibration/chocVidéo, données d'accéléromètre
Validation firmwareJournal de console série
Inspection visuellePhoto du DUT
Test de puissanceCaptures d'oscilloscope
Test environnementalJournaux de température/humidité
Déverminage (burn-in)Tous les journaux (longue durée, difficile à reproduire)

Pour les tests de production de routine (ICT, fonctionnel basique), les mesures seules sont généralement suffisantes. Réservez les pièces jointes aux tests où le contexte visuel ou les journaux aident au débogage.

Considérations de stockage

PratiquePourquoi
Compresser les vidéos avant de les joindreRéduire les coûts de stockage
Limiter les pièces jointes à moins de 50 Mo par exécutionVitesse pratique d'envoi/téléchargement
Utiliser PNG pour les graphiques, JPEG pour les photosPNG pour la clarté, JPEG pour la taille
Ne joindre qu'aux exécutions en échec (optionnellement)Économiser du stockage sur les exécutions réussies où les pièces jointes sont rarement consultées
Inclure des horodatages dans les fichiers journauxCorréler les événements du journal avec le timing des étapes de test

Plus de guides

Mettez ce guide en pratique