My Habita Installer

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-node 1.30.0, Microsoft, licence MIT), installé à part dans /opt/myhabita/vendor/ai/ (pas dans les dépendances du moteur) et chargé dynamiquement (createRequire) ; configuration video.aiDir, variable MYHABITA_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), source ai, 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és det_person, det_vehicle, det_animal de 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 (source ai, 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_log et colonnes subject_id / subject_name des événements, dans video.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.db n'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éfauts DEFAULT_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>).