API réception alertes chute (SmartEye/YOLO), analyse IA (Gemini 2.5 Flash), gestion alertes avec escalade (watchdog), notifications Firebase, dashboard web, documentation MkDocs. Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
283 lines
20 KiB
PHP
283 lines
20 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="fr">
|
|
<head>
|
|
<meta charset="UTF-8">
|
|
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
|
<title>SmartEye — Configuration Caméra</title>
|
|
<script src="https://cdn.tailwindcss.com"></script>
|
|
<style>
|
|
body { background: #0a0e1a; }
|
|
.flux-1 { border-left: 3px solid #ef4444; }
|
|
.flux-2 { border-left: 3px solid #3b82f6; }
|
|
.badge-flux1 { background: #ef444422; color: #f87171; border: 1px solid #ef444444; }
|
|
.badge-flux2 { background: #3b82f622; color: #60a5fa; border: 1px solid #3b82f644; }
|
|
</style>
|
|
</head>
|
|
<body class="min-h-screen text-slate-200">
|
|
|
|
<!-- HEADER -->
|
|
<nav class="bg-slate-900/80 backdrop-blur border-b border-slate-800 px-6 py-4 sticky top-0 z-50">
|
|
<div class="max-w-5xl mx-auto flex justify-between items-center">
|
|
<div class="flex items-center gap-4">
|
|
<div class="w-3 h-3 rounded-full bg-red-500"></div>
|
|
<span class="font-bold text-xl tracking-wider text-white">CONFIG <span class="text-slate-500 text-sm font-normal">CAMÉRA</span></span>
|
|
</div>
|
|
<div class="flex gap-3">
|
|
<a href="checklist.php" class="text-slate-400 hover:text-white text-sm border border-slate-700 px-3 py-2 rounded transition">Checklist</a>
|
|
<a href="admin.php" class="text-slate-400 hover:text-white text-sm border border-slate-700 px-3 py-2 rounded transition">Admin</a>
|
|
</div>
|
|
</div>
|
|
</nav>
|
|
|
|
<div class="max-w-5xl mx-auto px-6 py-8 space-y-8">
|
|
|
|
<!-- CONCEPT : LES 2 FLUX -->
|
|
<div class="bg-slate-900 rounded-xl border border-slate-800 overflow-hidden">
|
|
<div class="px-6 py-4 bg-slate-800/50 border-b border-slate-800">
|
|
<h2 class="font-bold text-white text-lg">Comprendre les 2 flux vidéo</h2>
|
|
<p class="text-slate-400 text-sm mt-1">Chaque caméra IP diffuse 2 flux RTSP simultanés, utilisés pour des besoins différents.</p>
|
|
</div>
|
|
<div class="p-6 grid grid-cols-2 gap-6">
|
|
<!-- FLUX 2 = Détection -->
|
|
<div class="bg-slate-950 rounded-lg border border-blue-500/30 p-5 space-y-3">
|
|
<div class="flex items-center gap-3">
|
|
<span class="badge-flux2 px-3 py-1 rounded font-bold text-sm">Flux 2 — Détection</span>
|
|
<span class="font-mono text-xs text-slate-500">/cam/realmonitor?channel=1&subtype=<span class="text-blue-400 font-bold">1</span></span>
|
|
</div>
|
|
<div class="text-sm text-slate-300 space-y-2">
|
|
<p><span class="text-blue-400 font-bold">Usage :</span> Flux analysé en continu par YOLO sur le Jetson pour détecter les chutes.</p>
|
|
<p><span class="text-blue-400 font-bold">Pourquoi basse résolution ?</span> YOLO n'a pas besoin de HD pour détecter une personne. Un flux léger (800x448) permet :</p>
|
|
<ul class="list-disc list-inside text-slate-400 text-xs space-y-1 ml-2">
|
|
<li>Moins de charge GPU sur le Jetson</li>
|
|
<li>Analyse plus rapide (+ de FPS traités)</li>
|
|
<li>Plusieurs caméras en parallèle</li>
|
|
</ul>
|
|
</div>
|
|
<div class="bg-blue-950/30 rounded p-3 text-xs font-mono text-blue-300 flex items-center gap-2">
|
|
<span class="text-blue-500">CAM</span> → <span class="text-blue-400">Flux 2 (SD)</span> → <span class="text-slate-400">Jetson YOLO</span> → <span class="text-red-400">Chute ?</span>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- FLUX 1 = Preuve HD -->
|
|
<div class="bg-slate-950 rounded-lg border border-red-500/30 p-5 space-y-3">
|
|
<div class="flex items-center gap-3">
|
|
<span class="badge-flux1 px-3 py-1 rounded font-bold text-sm">Flux 1 — Preuve HD</span>
|
|
<span class="font-mono text-xs text-slate-500">/cam/realmonitor?channel=1&subtype=<span class="text-red-400 font-bold">0</span></span>
|
|
</div>
|
|
<div class="text-sm text-slate-300 space-y-2">
|
|
<p><span class="text-red-400 font-bold">Usage :</span> Quand YOLO détecte une chute, SmartEye capture une image <strong>HD</strong> depuis ce flux et l'envoie au serveur Lucas.</p>
|
|
<p><span class="text-red-400 font-bold">Pourquoi haute résolution ?</span> L'image de preuve doit être nette pour :</p>
|
|
<ul class="list-disc list-inside text-slate-400 text-xs space-y-1 ml-2">
|
|
<li>Analyse précise par Gemini (position, visage, contexte)</li>
|
|
<li>Preuve visuelle pour la famille dans l'app AVA</li>
|
|
<li>Archivage en qualité</li>
|
|
</ul>
|
|
</div>
|
|
<div class="bg-red-950/30 rounded p-3 text-xs font-mono text-red-300 flex items-center gap-2">
|
|
<span class="text-red-500">CHUTE</span> → <span class="text-red-400">Capture HD</span> → <span class="text-emerald-400">Lucas (Gemini)</span> → <span class="text-indigo-400">AVA</span>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- Schéma résumé -->
|
|
<div class="px-6 pb-6">
|
|
<div class="bg-slate-950 rounded-lg border border-slate-700 p-4">
|
|
<pre class="text-xs text-slate-400 font-mono leading-relaxed">
|
|
CAMÉRA IP (ex: 192.168.1.196)
|
|
│
|
|
├── <span class="text-blue-400">Flux 2 (subtype=1)</span> — 800x448, 15fps, 300kbps —→ <span class="text-amber-400">Jetson YOLO</span> (détection continue 24/7)
|
|
│ │
|
|
│ <span class="text-red-400">Chute détectée !</span>
|
|
│ │
|
|
└── <span class="text-red-400">Flux 1 (subtype=0)</span> — 2880x1620, 20fps, 6Mbps —→ <span class="text-amber-400">Capture screenshot HD</span>
|
|
│
|
|
POST image → <span class="text-emerald-400">Lucas api.php</span>
|
|
│
|
|
<span class="text-emerald-400">Gemini analyse</span> → <span class="text-indigo-400">Push AVA</span></pre>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- PARAMÈTRES RECOMMANDÉS -->
|
|
<div class="bg-slate-900 rounded-xl border border-slate-800 overflow-hidden">
|
|
<div class="px-6 py-4 bg-slate-800/50 border-b border-slate-800">
|
|
<h2 class="font-bold text-white text-lg">Paramètres recommandés</h2>
|
|
<p class="text-slate-400 text-sm mt-1">Configuration optimale pour le système SmartEye. Accessible via l'interface web de la caméra.</p>
|
|
</div>
|
|
|
|
<!-- Paramètres généraux -->
|
|
<div class="p-6 space-y-6">
|
|
<div>
|
|
<h3 class="text-sm font-bold text-slate-300 uppercase tracking-wider mb-3">Paramètres généraux</h3>
|
|
<div class="grid grid-cols-2 gap-4">
|
|
<div class="bg-slate-950 rounded border border-slate-700 p-4">
|
|
<table class="w-full text-sm">
|
|
<tr class="border-b border-slate-800">
|
|
<td class="py-2 text-slate-500">Format vidéo</td>
|
|
<td class="py-2 text-white font-bold text-right">50Hz</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="py-2 text-slate-500">Codage vidéo</td>
|
|
<td class="py-2 text-white font-bold text-right">H.264 Main Profile</td>
|
|
</tr>
|
|
</table>
|
|
</div>
|
|
<div class="bg-slate-950 rounded border border-slate-700 p-4 flex items-center">
|
|
<p class="text-xs text-slate-500"><span class="text-amber-400 font-bold">H.264</span> est indispensable. Le H.265 n'est pas supporté par tous les lecteurs RTSP. Le Main Profile offre le meilleur compromis qualité/compatibilité.</p>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- FLUX 1 : HD -->
|
|
<div>
|
|
<div class="flex items-center gap-3 mb-3">
|
|
<h3 class="text-sm font-bold text-red-400 uppercase tracking-wider">Premier flux — Preuve HD</h3>
|
|
<span class="badge-flux1 px-2 py-0.5 rounded text-xs font-bold">subtype=0</span>
|
|
</div>
|
|
<div class="bg-slate-950 rounded border border-red-500/20 overflow-hidden">
|
|
<table class="w-full text-sm">
|
|
<thead class="bg-red-950/30 text-xs text-red-300 uppercase">
|
|
<tr>
|
|
<th class="px-4 py-2 text-left">Paramètre</th>
|
|
<th class="px-4 py-2 text-left">Valeur</th>
|
|
<th class="px-4 py-2 text-left">Explication</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-slate-800">
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Résolution</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">2880 x 1620</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Résolution max de la caméra. Image nette pour Gemini et la famille.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Débit binaire</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">6144 kbps</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Débit max. Qualité optimale pour la capture de preuve.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Fréquence</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">20 fps</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Suffisant pour capturer un screenshot net. Pas besoin de 25fps.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Intervalle image clé</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">20</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">1 image clé par seconde (= intervalle / fps). Capture plus rapide.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Contrôle débit</td>
|
|
<td class="px-4 py-3 text-white font-bold">CBR</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Débit constant. Qualité stable même en mouvement.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Qualité image</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">1 <span class="text-xs text-slate-500 font-normal">(meilleure)</span></td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Valeur la plus basse = qualité max.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- FLUX 2 : Détection -->
|
|
<div>
|
|
<div class="flex items-center gap-3 mb-3">
|
|
<h3 class="text-sm font-bold text-blue-400 uppercase tracking-wider">Deuxième flux — Détection YOLO</h3>
|
|
<span class="badge-flux2 px-2 py-0.5 rounded text-xs font-bold">subtype=1</span>
|
|
</div>
|
|
<div class="bg-slate-950 rounded border border-blue-500/20 overflow-hidden">
|
|
<table class="w-full text-sm">
|
|
<thead class="bg-blue-950/30 text-xs text-blue-300 uppercase">
|
|
<tr>
|
|
<th class="px-4 py-2 text-left">Paramètre</th>
|
|
<th class="px-4 py-2 text-left">Valeur</th>
|
|
<th class="px-4 py-2 text-left">Explication</th>
|
|
</tr>
|
|
</thead>
|
|
<tbody class="divide-y divide-slate-800">
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Résolution</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">800 x 448</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">YOLO détecte très bien en basse résolution. Économise le GPU.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Débit binaire</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">300 kbps</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">20x moins que le flux HD. Bande passante négligeable.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Fréquence</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">15 fps</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Suffisant pour détecter un mouvement. Plus = plus de charge GPU inutile.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Intervalle image clé</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">30</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">1 image clé toutes les 2 secondes. Acceptable pour la détection.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Contrôle débit</td>
|
|
<td class="px-4 py-3 text-white font-bold">VBR</td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">Débit variable. Économise la bande passante quand rien ne bouge.</td>
|
|
</tr>
|
|
<tr>
|
|
<td class="px-4 py-3 text-slate-400">Qualité image</td>
|
|
<td class="px-4 py-3 text-white font-bold font-mono">1 <span class="text-xs text-slate-500 font-normal">(meilleure)</span></td>
|
|
<td class="px-4 py-3 text-xs text-slate-500">On garde la meilleure qualité même en SD pour la détection.</td>
|
|
</tr>
|
|
</tbody>
|
|
</table>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- URLs RTSP -->
|
|
<div class="bg-slate-900 rounded-xl border border-slate-800 overflow-hidden">
|
|
<div class="px-6 py-4 bg-slate-800/50 border-b border-slate-800">
|
|
<h2 class="font-bold text-white text-lg">URLs RTSP</h2>
|
|
<p class="text-slate-400 text-sm mt-1">Format des URLs pour caméras Dahua. Remplacer l'IP par celle de la caméra.</p>
|
|
</div>
|
|
<div class="p-6 space-y-4">
|
|
<div class="bg-slate-950 rounded border border-red-500/20 p-4">
|
|
<div class="flex items-center gap-2 mb-2">
|
|
<span class="badge-flux1 px-2 py-0.5 rounded text-xs font-bold">Flux 1 — HD</span>
|
|
<span class="text-xs text-slate-500">Capture de preuve</span>
|
|
</div>
|
|
<code class="text-sm text-red-300 font-mono">rtsp://admin:password@192.168.1.196/cam/realmonitor?channel=1&subtype=0</code>
|
|
</div>
|
|
<div class="bg-slate-950 rounded border border-blue-500/20 p-4">
|
|
<div class="flex items-center gap-2 mb-2">
|
|
<span class="badge-flux2 px-2 py-0.5 rounded text-xs font-bold">Flux 2 — SD</span>
|
|
<span class="text-xs text-slate-500">Détection YOLO 24/7</span>
|
|
</div>
|
|
<code class="text-sm text-blue-300 font-mono">rtsp://admin:password@192.168.1.196/cam/realmonitor?channel=1&subtype=1</code>
|
|
</div>
|
|
<div class="bg-amber-950/20 border border-amber-500/30 rounded p-3 text-xs text-amber-300">
|
|
<strong>Note :</strong> Le <span class="font-mono">channel</span> correspond au numéro de canal de la caméra (1 pour une caméra mono-objectif). Le <span class="font-mono">subtype</span> sélectionne le flux : <strong>0</strong> = principal (HD), <strong>1</strong> = secondaire (SD).
|
|
</div>
|
|
</div>
|
|
</div>
|
|
|
|
<!-- CHECKLIST RAPIDE -->
|
|
<div class="bg-slate-900 rounded-xl border border-slate-800 overflow-hidden">
|
|
<div class="px-6 py-4 bg-slate-800/50 border-b border-slate-800">
|
|
<h2 class="font-bold text-white text-lg">Checklist configuration caméra</h2>
|
|
</div>
|
|
<div class="p-6">
|
|
<ol class="space-y-3 text-sm text-slate-300">
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">1.</span> Accéder à l'interface web de la caméra <span class="font-mono text-xs text-slate-500">(http://IP_CAM)</span></li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">2.</span> Aller dans <strong>Paramètres → Caméra → Vidéo</strong></li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">3.</span> Configurer le <span class="text-red-400 font-bold">Premier flux</span> (HD) selon le tableau ci-dessus</li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">4.</span> Configurer le <span class="text-blue-400 font-bold">Deuxième flux</span> (SD) selon le tableau ci-dessus</li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">5.</span> Cliquer <strong>Appliquer</strong></li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">6.</span> Tester les 2 flux RTSP avec VLC <span class="font-mono text-xs text-slate-500">(vlc rtsp://...)</span></li>
|
|
<li class="flex gap-3"><span class="text-slate-600 font-bold w-6">7.</span> Vérifier que SmartEye reçoit le flux 2 et détecte correctement</li>
|
|
</ol>
|
|
</div>
|
|
</div>
|
|
|
|
</div>
|
|
</body>
|
|
</html>
|