Fonctions
Vidéosurveillance
Caméras, enregistrements, détection et analyse IA.
Le menu Sécurité (ancien menu « Alarme ») réunit une alarme à secteurs proche des centrales professionnelles et un enregistreur vidéo intégré (NVR) : caméras en direct, enregistrement, détections, relecture sur une frise, exports.
Alarme et vidéosurveillance domotiques : non certifiées (NF&A2P, EN 50131), elles ne remplacent ni une alarme certifiée ni une télésurveillance.
Alarme
Vocabulaire
| Terme | Sens |
|---|---|
| Secteur | Partie de la maison armée indépendamment (Maison, Garage, Atelier…). Une seule par défaut : l'interface reste simple tant qu'il n'y en a qu'un. |
| Modes | Totale (vous partez : tout est surveillé), Partielle (vous êtes là : ouvertures surveillées), Nuit (ouvertures et pièces de vie ; chambres libres). |
| Détecteur | Un capteur déclaré dans un secteur, avec un type et les modes où il surveille. |
| Personne | Quelqu'un qui utilise l'alarme, avec un ou plusieurs codes. Peut être reliée à un compte My Habita (notifications sur ses téléphones). |
| Incident | Un déclenchement ou une alerte, avec sa chronologie, ses détecteurs et ses images de caméras. |
Types de détecteurs
| Type | Comportement |
|---|---|
| Entrée / sortie (temporisé) | Porte d'entrée : ouvre le délai d'entrée (désarmer avant la fin). |
| Instantané | Fenêtres, baies : déclenche aussitôt. |
| Intérieur suiveur | Détecteur de passage sur le chemin de l'entrée : suit le délai d'entrée en cours, sinon déclenche aussitôt. |
| Intrusion 24 h/24 | Coffre, local technique : surveillé même désarmé. |
| Incendie, gaz, inondation | Toujours actifs : alerte (sirènes selon réglage), même désarmé. |
| Panique, assistance | Bouton d'urgence : alerte immédiate, sonore ou silencieuse. |
| Sabotage | Alarme si armée, alerte sinon. |
| Technique | Simple notification. |
| Carillon seulement | Ne déclenche jamais ; carillon à l'ouverture quand l'alarme est désarmée. |
Options par détecteur : modes, délai d'entrée propre, carillon, contournable, silencieux, double détection (deux activations en 2 min), caméras associées, inversé, hors service.
Comportements
- Délai de sortie par mode : les détecteurs d'intrusion sont ignorés. À la fin, une ouverture restée ouverte ouvre un délai d'entrée ; un détecteur de mouvement encore actif est ignoré jusqu'à sa prochaine détection.
- Armement avec ouvertures : refus avec la liste (ou contournement explicite / automatique selon le réglage). Un détecteur non contournable bloque.
- Armer est refusé pendant un délai d'entrée ou un déclenchement : il faut désarmer avec un code.
- Limite de déclenchements par détecteur et par armement (3 par défaut).
- Intrusion confirmée : un second détecteur différent dans la fenêtre de confirmation (10 min).
- Alarme annulée : désarmée dans la minute qui suit le déclenchement → notification « annulée ».
- Sirènes par nature d'alarme et par secteur, avec un retard possible (levée de doute) ; relancées après un redémarrage, et dès qu'une sirène redevient disponible.
- Mode test d'un secteur (30 min au plus) : chaque activation est notée, rien ne sonne.
- Programmation : armer, désarmer ou rappeler d'armer à heure fixe (éventuellement seulement si tout le monde est parti).
- Présence : quand tout le monde est parti (téléphones), rappel ou armement Totale automatique ; au retour d'une personne alors que l'alarme est armée, rappel de désarmer.
- Défauts : capteur indisponible, supprimé, pile faible (< 15 %), sirène indisponible.
- Redémarrage : l'état est restauré ; les délais reprennent ; un délai d'entrée échu pendant l'arrêt déclenche l'alarme.
Personnes et codes
- Plusieurs codes par personne, 4 à 8 chiffres, jamais stockés en clair (empreinte HMAC-SHA256 avec une clé propre à l'installation,
<données>/alarm-codes.key) ; deux codes identiques sont refusés. - Types : habituel, sous contrainte (désarme en apparence, prévient discrètement les contacts choisis, rien n'apparaît sur les écrans), temporaire (dates, et plages horaires possibles), à usage unique (ou nombre d'utilisations).
- Droits par code : armer, désarmer, modes permis ; par personne : secteurs permis.
- Blocage du clavier après N codes erronés (5 par défaut, 2 min) ; alerte sabotage possible.
- Le code personnel des comptes My Habita reste accepté (réglable).
Vidéosurveillance
Architecture
caméra ──RTSP──► go2rtc (lancé par le moteur, 127.0.0.1) ──┬── direct : WebRTC / MSE (relais du moteur) / HLS (Android)
├── ffmpeg « Recorder » : segments MP4 → stockage
└── ffmpeg « Analyzer » : 5 images/s 160×120 (mouvement) + vignette
+ 2 images/s couleur ≤ 416 px ──► analyse IA (ai-worker)
caméra ──ONVIF──► My Habita : profils, PTZ, préréglages, événements (personne, véhicule…)
- Une seule connexion à la caméra, partagée par le direct, l'enregistrement et l'analyse.
- go2rtc écoute sur 127.0.0.1 (API 1984, RTSP 8554) avec un mot de passe tiré au hasard à chaque lancement ; seul le port WebRTC 8555 (TCP/UDP) est ouvert au réseau local.
- Enregistrement sans réencodage (
-c:v copy), son converti en AAC, segments MP4 fragmentés de 10 s :<stockage>/<caméra>/<AAAA-MM-JJ>/<ms>.mp4, indexés dans<données>/video.db(reconstructible : Relire les dossiers). - Aperçus de la frise : une petite image par segment (240 px de large, 2 à 8 Ko),
<ms>.jpgà côté du<ms>.mp4, faite par ffmpeg dès que le segment est terminé (première image clé, ≈ 60 ms), ou à la demande pour un segment plus ancien (par lots de 6 dans un même ffmpeg) ; effacée avec son segment par la conservation, les aperçus orphelins par Relire les dossiers. - Mode événements : l'enregistreur tourne en continu mais seuls les segments autour des événements (secondes avant / après) sont gardés ; les autres sont effacés après quelques minutes.
- Conservation par caméra (jours en continu, jours pour les événements), favoris jamais effacés, quotas par stockage (taille maximale, espace libre minimal).
- Mode privé (manuel, alarme désarmée, quelqu'un à la maison) : ni direct, ni enregistrement, ni analyse par My Habita.
Ajouter une caméra
Sécurité → Caméras → Ajouter. Choisissez la marque (Tapo, VIGI, Reolink, Hikvision, Dahua, Amcrest, Axis, Foscam, Uniview, EZVIZ, Imou, UniFi Protect, eufy, ONVIF générique, autre RTSP), saisissez l'adresse IP et les identifiants, puis Tester : My Habita interroge la caméra en ONVIF (ou essaie les adresses habituelles de la marque), ouvre les flux, affiche une image, le codec et la définition.
TP-Link Tapo : dans l'application Tapo, Réglages → Paramètres avancés → Compte de la caméra ; ONVIF sur le port 2020, flux stream1 (principal) et stream2 (secondaire).
Rechercher : WS-Discovery (ONVIF) sur le réseau local ; pour des caméras sur un autre VLAN, indiquez le réseau (192.168.50.0/24) : sondes ONVIF et test du port RTSP sur chaque adresse.
Stockages
Le stockage par défaut est /var/lib/myhabita/recordings. Pour enregistrer ailleurs (disque, partage réseau), le dossier doit être autorisé pour le service (protection systemd) :
sudo myhabitactl nvr-storage add /srv/videos
sudo myhabitactl nvr-storage nfs 192.168.1.10:/volume1/cameras
sudo myhabitactl nvr-storage smb //nas/cameras utilisateur
puis, dans Sécurité → Réglages → Stockages, ajoutez le dossier et choisissez-le pour les caméras.
Analyse IA (personnes, véhicules, animaux)
Reconnaissance d'objets par le serveur lui-même (processeur, sans carte graphique, sans cloud) :
- Moteur : ONNX Runtime (
onnxruntime-node1.30.0, Microsoft, licence MIT), installé à part dans/opt/myhabita/vendor/ai/(pas dans les dépendances du moteur) et chargé dynamiquement (createRequire) ; configurationvideo.aiDir, variableMYHABITA_AI_DIR. Sans lui, rien ne change et l'interface donne la commande d'installation. - Modèle : YOLOX-Tiny (Megvii, licence Apache-2.0, 80 classes COCO, entrée 416 × 416), fichier ONNX officiel. Classes retenues : personne →
person; vélo, voiture, moto, bus, camion →vehicle; oiseau, chat, chien, cheval, mouton, vache →animal. - Images : l'analyseur de la caméra (ffmpeg, déjà lancé pour le mouvement) ajoute une sortie couleur à 2 images/s, réduite pour tenir dans 416 × 416 (PPM sur le descripteur 3). Le moteur ne les analyse que pendant un mouvement (et 5 s après), tant qu'un objet suivi bouge ou reste à confirmer, ou en continu si la caméra le demande. Sans détection de mouvement, le mouvement sert quand même de déclencheur (sans créer d'événement « Mouvement »).
- Calcul : un processus séparé (
dist/ai-worker.mjs), lancé à la première image utile, priorité basse (nice 10), 2 fils de calcul, arrêté après 10 min sans travail ; relancé s'il s'arrête ou se bloque (20 s). Une analyse à la fois pour toutes les caméras ; seule la dernière image de chaque caméra attend (les images de plus de 2 s sont écartées). - Tri : natures cherchées, score minimal (0,6 par défaut), zones et masques de la caméra : le point de référence d'un objet est le milieu du bas de son rectangle (pieds, roues).
- Suivi (IoU d'une image à l'autre) : un objet compte après 2 détections de suite ; objets immobiles (voiture garée, statue) : après 30 s (véhicule), 1 min (animal) ou 3 min (personne) sans bouger, ils ne comptent plus et ne déclenchent rien tant qu'ils ne bougent pas.
- Événements : un par nature (
person,vehicle,animal), sourceai, score (confiance en %), zones, rectangle ; il se termine quand plus rien n'est vu depuis le délai « Fin d'un événement » de la caméra. L'image de l'événement est prise en pleine définition, puis le rectangle y est recalculé pour lui correspondre. Les entitésdet_person,det_vehicle,det_animalde la caméra sont créées d'avance (identifiants stables) ; notifications, automatisations (déclencheur « caméra ») et alarme les utilisent comme les autres détections. - Mesures (serveur de développement : 4 processeurs virtuels QEMU sans AVX) : ≈ 100 ms par image avec 2 fils (≈ 200 ms avec 1, ≈ 60 ms avec 4) ; chargement du modèle ≈ 0,2 s ; ≈ 180 Mo de mémoire pour le processus d’analyse. Un processeur avec AVX2 (type « host » de l'hyperviseur) est 2 à 3 fois plus rapide.
Réglages par caméra (CameraDef.detection.ai, valeurs par défaut pour les caméras plus anciennes) :
| Champ | Défaut | Rôle |
|---|---|---|
enabled |
true |
analyse IA de la caméra (effective si elle est installée) |
labels |
['person','vehicle','animal'] |
natures cherchées |
minScore |
0.6 |
score minimal (0,3 à 0,95) |
onMotion |
true |
seulement pendant un mouvement (sinon en continu) |
ignoreStationary |
true |
objets immobiles ignorés |
faces |
true |
reconnaissance des visages sur cette caméra (si elle est activée globalement) |
leftObjects |
false |
signaler les objets laissés |
État (VideoSystemStatus.ai) : installed, dir, runtime, model, faceModels, lookModel, running, cameras, inferenceMs (moyenne des 50 dernières), faceMs, lookMs, framesPerMin, droppedPerMin, lastError, installHint.
Analyse IA : visages, animaux et véhicules nommés, objets (Sécurité → Analyse IA)
Onglet Analyse IA (/securite/ia) : aperçu du jour, personnes, animaux et véhicules, inventaire des objets, objets surveillés, réglages. Lecture : cameras.view (limitée aux caméras visibles) ; modification : cameras.configure.
- Visages (désactivé par défaut ; interrupteur global et case par caméra) : sur l'image pleine définition d'un événement « Personne », le haut de chaque personne est recadré ; YuNet (OpenCV Zoo, MIT) y cherche les visages (score ≥ 0,8, largeur ≥ 40 px), ils sont alignés sur les 5 repères d'ArcFace (similitude aux moindres carrés, 112 × 112) puis décrits par SFace (OpenCV Zoo, Apache-2.0 : 128 nombres). Comparaison (cosinus) aux visages confirmés des personnes nommées : nom donné au-delà du seuil (0,42 par défaut, réglable de 0,28 à 0,65) et seulement si aucune autre personne n'est presque aussi proche (écart ≥ 0,04). Sinon le visage rejoint un groupe à nommer (le plus ressemblant, une photo par passage). Jusqu'à 4 nouvelles tentatives, toutes les 3 s, tant que la personne est là et n'est pas reconnue. Un visage très ressemblant et net devient une référence de plus (30 au plus par personne, les meilleures).
- Animaux et véhicules (approximatif) : apparence décrite par MobileNetV2 (OpenCV Zoo, Apache-2.0 ; caractéristiques du « pooling » global, 1 280 nombres — la sortie est ajoutée au modèle ONNX en mémoire), comparée seulement entre objets de la même classe (chat, voiture…), seuil 0,80.
- Nommer un groupe ou des photos : identité existante ou nouvelle ; les photos deviennent des références et les passages déjà enregistrés prennent le nom. Fiche d'une identité : photos (photo principale, « ce n'est pas elle », supprimer), passages, renommer, réunir deux identités, supprimer (photos et empreintes effacées, événements gardés sans nom).
- Événements : champ
subject: { id, name } | null(personne reconnue, animal ou véhicule nommé, objet surveillé) ; « Personne · Gaël » dans les listes ; notification « Personne reconnue : Gaël » (la notification d'une personne attend la reconnaissance, 6 s au plus). - Inventaire : toutes les 15 min (réglable) et après un mouvement, l'image actuelle est analysée avec les 80 classes COCO (noms en français) ; relevés gardés 30 jours ; statistiques sur 24 h ou 7 jours (plus grand nombre vu ensemble, part des relevés), passages des personnes, animaux, véhicules et identités.
- Objets surveillés : objet choisi dans l'inventaire (classe + position, apparence de référence) ou zone dessinée (apparence seule). Vérifiés toutes les 2 min (30 s pendant une confirmation) et après chaque mouvement ; jamais pendant un mouvement ni quand une personne recouvre l'objet (rectangle agrandi de 20 %). À sa place (même classe, recouvrement ≥ 0,4) : en place ; ailleurs et ressemblant : déplacé ; sinon disparu. Un changement n'est retenu qu'après 3 vérifications concordantes étalées sur au moins 60 s (réglables). Événements
object_moved/object_missing(sourceai, sujet = l'objet ; image « avant » :/ai/watched/:id/image.jpg, « après » : l'image de l'événement), notification selon l'objet, entitéobj_<id>« en place » sur l'appareil de la caméra (alarme, automatisations). « C'est normal » : l'apparence actuelle devient une référence de plus (nuit, infrarouge, objet remis un peu ailleurs). - Objets laissés (par caméra) : sac, valise, parapluie, bouteille, tasse, ordinateur portable, téléphone, livre… absent du premier relevé, revu à la même place pendant au moins 5 min sans personne dessus → événement
object_left. - Données : tables
ai_identities,ai_samples(vecteurs en float32),ai_inventory,ai_watched,ai_watch_loget colonnessubject_id/subject_namedes événements, dansvideo.db(version 2 ; copie « pre-migration » faite avant) ; photos dans<données>/video/ai/(samples/,inventory/,watched/). Conservation : photos non nommées 30 jours (réglable), photos non confirmées supprimées avec leur événement, relevés 30 jours, historique des objets 90 jours.video.dbn'est pas sauvegardée : les identités ne le sont pas non plus. - Mesures (même serveur) : description d'un visage ≈ 40 à 50 ms (SFace), détection des visages dans une personne ≈ 50 à 100 ms (YuNet), apparence ≈ 15 à 35 ms par objet (MobileNetV2) ; tout passe par le même processus d'analyse, une demande à la fois. Mémoire du processus : ≈ 145 Mo avec le seul détecteur d'objets, ≈ 235 Mo avec les visages, ≈ 310 Mo avec les apparences (modèles chargés à leur première utilisation, tout est rendu après 10 min sans travail).
- Réglages globaux (
GET/PUT /ai/settings, défautsDEFAULT_AI_SETTINGS) :faces(false),faceThreshold(0,42),faceMinPx(40),looks(true),lookThreshold(0,80),inventoryMin(15),inventoryScore(0,4),watchEveryS(120),watchConfirmS(60),watchChecks(3),unknownDays(30).
Installation des programmes vidéo
sudo myhabitactl nvr-install --restart # ou --no-ai pour se passer de l'analyse IA
Installe ffmpeg (paquet Debian), go2rtc (publication officielle, empreinte SHA-256 vérifiée) dans /opt/myhabita/vendor/go2rtc/ et l'analyse IA (scripts/install-ai.sh : archives npm onnxruntime-node et onnxruntime-common 1.30.0, modèles yolox_tiny.onnx, face_detection_yunet_2026may.onnx, face_recognition_sface_2021dec.onnx, image_classification_mobilenetv2_2022apr.onnx, empreintes SHA-256 épinglées, aucun script npm exécuté, seule la bibliothèque de l'architecture du serveur gardée : ≈ 115 Mo dans /opt/myhabita/vendor/ai/ ; seuls les éléments absents ou différents sont téléchargés). Sans eux, My Habita fonctionne normalement et l'interface explique quoi faire. --check indique ce qui est présent.
API
Préfixe /api/v1. Droits : alarm.*, cameras.view, recordings.view, recordings.export, cameras.configure (voir permissions.ts).
Alarme
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /alarm |
{ status, config (admin), layout (secteurs, modes, détecteurs), events, people (admin), me } |
| PUT | /alarm/config |
configuration (v2 ; l'ancien format à zones est converti) |
| GET | /alarm/check?mode=away&partitions= |
ouvertures et défauts qui empêchent d'armer |
| POST | /alarm/arm |
{ mode: 'away'|'home'|'night' (ou armed_*), partitions?, force?, code? } — 409 arm_refused avec details (détecteurs) |
| POST | /alarm/disarm |
{ code, partitions? } — erreurs pin_required, bad_pin, code_refused, code_forbidden, locked (429) |
| POST | /alarm/panic |
{ silent, category: 'panic'|'medical' } |
| POST | /alarm/ack |
{ code, alertId? } acquitte les alertes |
| POST | /alarm/test |
{ partitionId, on } (admin) |
| GET | /alarm/events?limit&before&kinds&partition&incident&since |
journal |
| GET | /alarm/incidents, /alarm/incidents/:id |
incidents ; détail : { incident, events, cameraEvents, cameras } |
| POST | /alarm/incidents/:id/review |
{ note } |
| GET/POST/PUT/DELETE | /alarm/people[/:id], /alarm/people/order |
personnes (admin) |
| POST/PUT/DELETE | /alarm/people/:id/codes, /alarm/codes/:id |
codes (code en clair à l'envoi seulement) |
État en direct : événement WebSocket alarm (AlarmStatus : état global, partitions, alerts, ready, open, lockedUntil), alarm_chime (carillon).
Caméras
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /cameras |
{ cameras: CameraPublic[], status: CameraStatus[], system (admin) } |
| GET | /cameras/:id |
{ camera, status } |
| POST/PUT/DELETE | /cameras[/:id] |
{ camera, password? } ; DELETE ?recordings=1 efface aussi les enregistrements |
| POST | /cameras/probe |
{ brand, connection, password?, cameraId? } → CameraProbeResult (étapes, profils, flux, aperçu) |
| POST | /cameras/discover |
{ subnet? } → caméras trouvées |
| GET | /cameras/:id/snapshot.jpg?w=&fresh=1 |
image actuelle |
| WS | /cameras/:id/ws?stream=main|sub |
direct (protocole go2rtc : {type:'mse',value:codecs} → {type:'mse',value:mime} + fragments binaires ; webrtc/offer, webrtc/candidate) |
| GET | /cameras/:id/live.m3u8?stream= (+ /cameras/:id/hls/*) |
direct HLS (fMP4) |
| GET | /cameras/:id/live.mp4?stream= |
direct MP4 progressif |
| POST | /cameras/:id/ptz |
{ action:'move', pan, tilt, zoom }, { action:'stop' }, { action:'preset', token }, { action:'home' } |
| POST/DELETE | /cameras/:id/presets[/:token] |
préréglages (admin) |
| POST | /cameras/:id/mark |
repère « manuel » (30 s) |
| POST | /cameras/:id/privacy |
{ on: true|false|null } (null : revenir au réglage automatique) |
| POST | /cameras/:id/recording, /detection, /reboot, /refresh |
suspendre, analyse, redémarrer, relire les capacités |
| POST | /cameras/:id/ai-test |
essai de l'analyse IA sur l'image actuelle → { result: { image, ms, detections: [{ label, kind, score, box, kept, reason }] } } (admin ; 409 si non installée) |
| GET | /cameras/:id/diagnostics |
état, flux go2rtc, journal |
État en direct : camera, camera_removed, camera_status, camera_event (filtrés selon les droits sur chaque caméra).
Enregistrements et événements
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /recordings/timeline?cameras=a,b&from&to |
plages enregistrées et événements (31 j au plus) |
| GET | /recordings/segments?camera&from&to |
segments { id, start, end, bytes, mime } |
| GET | /recordings/segments/:id.mp4 |
segment (plages HTTP) |
| GET | /recordings/frame.jpg?camera&at&w&download=1 |
image d'un instant enregistré |
| GET | /recordings/preview.jpg?camera&at |
aperçu de la frise : petite image du segment qui couvre l'instant (sinon du plus proche à moins de 5 s), bornes du segment dans X-Segment-Start / X-Segment-End, Cache-Control: private ; 404 sans enregistrement |
| GET/POST/DELETE | /recordings/exports[/:id], /recordings/exports/:id/file |
exports MP4 |
| GET | /camera-events?cameras&labels&from&to&before&limit&favorite=1&reviewed=0&counts=1 |
événements |
| GET/PATCH/DELETE | /camera-events/:id |
{ favorite, reviewed, note } |
| POST | /camera-events/review |
tout marquer comme vu |
| GET | /camera-events/:id/snapshot.jpg?thumb=1, /camera-events/:id/clip.mp4?download=1 |
image, séquence |
| GET/POST/PUT/DELETE | /video/storage[/:id], POST /video/storage/check |
stockages |
| GET/PUT | /video/settings ; GET /video/system ; POST /video/reindex, /video/retention/run |
réglages et maintenance |
Analyse IA
| Méthode | Chemin | Rôle |
|---|---|---|
| GET | /ai/overview |
{ overview: AiOverview, status: VideoAiStatus, settings (admin) } : aujourd'hui, identités vues, objets surveillés, groupes à nommer, caméras |
| GET/PUT | /ai/settings |
réglages globaux (admin) |
| PATCH | /ai/cameras/:id |
{ faces?, leftObjects?, enabled? } (admin) |
| DELETE | /ai/faces |
effacer toutes les données des visages (admin) |
| GET | /ai/identities?kind=person|animal|vehicle ; GET /ai/identities/:id |
identités ; fiche { identity, samples, sightings } |
| POST | /ai/identities |
nommer { clusterId?, sampleIds?, identityId? | name? } (admin) |
| PATCH/DELETE | /ai/identities/:id ; POST /ai/identities/:id/merge |
{ name?, note?, cover? } ; { into } (admin) |
| GET | /ai/clusters?kind=face|look ; DELETE /ai/clusters/:id |
groupes à nommer (avec proposition) ; ignorer (admin) |
| POST/DELETE | /ai/samples/:id/unassign, /ai/samples/:id ; GET /ai/samples/:id/image.jpg |
photo retirée d'une identité, supprimée ; image |
| GET | /ai/subjects |
identités et objets surveillés (déclencheur des automatisations) |
| GET | /ai/inventory?cameras= ; GET /ai/inventory/stats?period=24h|7d&cameras= |
derniers relevés ; statistiques |
| POST | /ai/inventory/:camera/refresh ; GET /ai/inventory/:camera/image.jpg |
relevé immédiat (admin) ; image analysée |
| GET/POST | /ai/watched |
objets surveillés ; { cameraId, name, cls | null, box, notify } (admin) |
| PATCH/DELETE | /ai/watched/:id |
{ name?, notify? } (admin) |
| POST | /ai/watched/:id/check, /ai/watched/:id/confirm |
vérifier maintenant ; « c'est normal » (admin) |
| GET | /ai/watched/:id/log, /ai/watched/:id/image.jpg |
historique ; image de référence |
Lecture d'un enregistrement dans le navigateur
Les segments sont des MP4 fragmentés autonomes, horodatés à partir de 0 : le lecteur web les ajoute un à un dans un SourceBuffer (MediaSource, mode segments) avec timestampOffset = (début du segment − début de la lecture) / 1000, saute les trous et précharge la suite. Android enchaîne les segments dans ExoPlayer.
La frise montre au survol (et pendant qu'on fait glisser le curseur, à la souris ou au doigt) l'aperçu de l'instant pointé : le navigateur garde les images par segment (les bornes reçues servent pour tout instant du segment), arrondit l'instant demandé selon le zoom, annule les requêtes dépassées et précharge les segments voisins ; la lecture part au relâchement du curseur.
Automatisations
- Déclencheurs : alarme (armée, désarmée, armement, délai d'entrée, déclenchée, intrusion confirmée, défaut, alerte, contrainte ; secteur facultatif), caméra (caméra, natures de détection et, avec l'analyse IA, une personne, un animal, un véhicule ou un objet surveillé précis :
subjectId; une personne reconnue après coup déclenche alors au moment de la reconnaissance). - Actions : alarme (Totale, Partielle, Nuit, désarmer ; secteurs), caméra (repère, mode privé, enregistrement, position mémorisée), notification avec image d'une caméra.
- Entités de chaque caméra (intégration « Caméras de surveillance ») : caméra (état, enregistrement, détection, mode privé, orientation, positions), mouvement, et une entité par nature détectée (personne, véhicule…) ; avec l'analyse IA, les entités personne, véhicule et animal existent dès la configuration, et chaque objet surveillé a son entité « en place » (
obj_<id>).