Aller au contenu

Contrôle de Surveillance Station depuis box domotique Lifedomus


Jojo (BE)

Messages recommandés

Bonjour,

Voici donc ma première contribution au forum.

A la demande de certain, je partage ce que j'ai développé sur la box domotique Lifedomus (Deltadore) pour contrôler mes caméras connectées à Surveillance Station.

La discussion originale se trouve ici.

Tout d'abord, un grand merci à Grichka, sans l'aide de qui je ne serais jamais arrivé au terme de ce projet.
 
Note : étant donné le nombre important de copies d'écran, il y a en pièce jointe un fichier pdf avec ce texte complet ET les images. J'y ai également joint un second fichier .zip contenant les icônes pour illuster les automates, etc.
 
L'idée est donc de construire une solution qui permettra de contrôler les caméras branchées sur un NAS Synology. Donc également en protocole H.264 ;-)
 
Pour chaque caméra vous aurez :
  • Son ID
  • Son nom
Vous pourrez également :
  • l'activer / la désactiver
  • Démarrer / arrêter un enregistrement
  • Avoir un retour de son statut en temps réel (délais = 5 secondes)
 
Connecteur
Il faut d'abord créer un connecteur universel http: (Universel -> TCP/IP Universel -> Universel HTTP)

Et y importer (en cliquant sur le bouton encadré en rouge ci-dessus) le code JavaScript ci-dessous
 
maxcameras = 4
obj = JSON.parse(trame)
if (typeof obj.data != "undefined") {
// Update SID
if (typeof obj.data.sid != "undefined") {
Idsession = obj.data.sid
ldprint ("ID : " + Idsession)
// Status of cameras
} else if (typeof obj.data.total != "undefined") {
ldprint ("data.total (cameras) : " + obj.data.total)
if (obj.data.total > maxcameras) {
total = maxcameras
} else {
total = obj.data.total
}
ldprint ("total = " + total)
for (i=0; i < total; i++) {
ldprint ("data.cameras[" + i + "].id : " + obj.data.cameras.id)
eval ("Cameras" + i + "_id = obj.data.cameras[" + i + "].id")
ldprint ("data.cameras[" + i + "].name : " + obj.data.cameras.name)
eval ("Cameras" + i + "_name = obj.data.cameras[" + i + "].name")
ldprint ("data.cameras[" + i + "].recStatus : " + obj.data.cameras.recStatus)
eval ("Cameras" + i + "_recStatus = obj.data.cameras[" + i + "].recStatus")
ldprint ("data.cameras[" + i + "].enabled : " + obj.data.cameras.enabled)
eval ("Cameras" + i + "_enabled = obj.data.cameras[" + i + "].enabled")
}
}
}
success = obj.success
 
Equipement
Il faut créer un équipement générique (Equipements -> Universel -> Equipement (Générique)).

Créez les 5 commandes (ASCII) à l'aide du bouton encadré en rouge ci-dessus
Voici le contenu de ces commandes :
Activer / Désactiver : (SS_Camera_action = Enable / Disable)
----------------------
/entry.cgi?api=SYNO.SurveillanceStation.Camera&method={SS_Camera_action}&version=3&cameraIds={SS_Camera_id}&_sid={SS_sid}
 
Record Start/Stop : (SS_Camera_action = start / stop)
-------------------
/entry.cgi?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version=1&cameraId={SS_Camera_id}&action={SS_Camera_action}&_sid={SS_sid}
 
Liste des caméras : (SS_Camera_action = List)
-------------------
/entry.cgi?api=SYNO.SurveillanceStation.Camera&method={SS_Camera_action}&version=4&_sid={SS_sid}
 
Update SID :
------------
/auth.cgi?api=SYNO.API.Auth&method=Login&version=2&account={SS_account}&passwd={SS_passwd}&session=SurveillanceStation&format=sid
 
Logout :
--------
/auth.cgi?api=SYNO.API.Auth&method=Logout&version=2&session=SurveillanceStation&_sid={SS_sid}
 
Dans cet équipement, il faut également créer plusieurs variables
Liste des variables :
  • Idsession
success Cameras#_id Cameras#_name Cameras#_recStatus Cameras#_enabled Où # est à remplacer par le numéro de la caméra, de 0 à (cfr JavaScript) maxcameras-1.
 
Utilisateur Surveillance Station
Créer un utilisateur dans Surveillance Station qui a les droits de Directeur pour toutes les caméras. 
Variables
Il faut créer les variables suivantes dans la LD
  1. SS_account - type = Chaîne - nom de l'utilisateur dans Surveillance Station (ici Utilisateur)
SS_passwd - type Chaine - mot de passe de l'utilisateur dans Surveillance Station (ici … non, je ne vous le donnerai pas ) SS_sid - type Chaîne - rempli automatiquement = token d'autorisation reçu du Synology SS_Camera_action - type Chaîne - contiendra le type d'action demandée à la caméra (Enable/ Disable / start / stop) SS_Camera_id - type Chaîne - contiendra l'ID (Synology) de la caméra pour laquelle l'action définie dans (SS_Camera_action) sera exécutée SS_Cameras#_id - type Numérique - remplie automatiquement lorsqu'on utilise la commande List. C'est ce numéro qu'il faut préciser dans SS_Camera_id. SS_Cameras#_name - type Chaîne - remplie automatiquement lorsqu'on utilise la commande List SS_Cameras#_enabled - type Booléen - remplie automatiquement par l'automate de mise à jour du statut des caméras SS_Cameras#_record - type Booléen - remplie automatiquement par l'automate de mise à jour du statut des caméras Où # est à remplacer par le numéro de la caméra, de 0 à (cfr JavaScript) maxcameras-1.
Dans mon exemple, où J'ai 4 caméras, j'ai créé (5 + 4*4 = ) 21 variables avec # qui va de 0 à 3.

Automates
Différents automates nous permettrons de prendre les actions nécessaires et de mettre à jour les variables de statut.
  • SS_actions : gère les actions définies : à reproduire à l'identique
SS_actions_Send_Manual : exemple d'automate pour lancer une action particulière sur une caméra SS_UpdateSid : génération d'un nouveau token par Synology : à reproduire à l'identique SS_status : mise à jour les variables (SS_Cameras#_enabled & SS_Cameras#_record) avec le statut effectif des caméras. SS_status_autorun : lance l'automate SS_status à fréquence régulière (par défaut 5 secondes), SANS passer par le planificateur de tâches. N.B. : après chaque appel à l'équipement SS HTTP, faite un petit wait de 100 ms pour que la box ait le temps de traiter toutes les commandes / variables.
 
SS_actions
On teste si SS_Camera_action = Enable ou Disable. Les deux tests suivants c'est si on a mis des minuscules au lieu de majuscules à Enable et Disable.
Ensuite il lance la commande (Activer/Désactiver) au niveau de l'équipement SS HTTP.
 
Après le groupe des 3 premiers IF (pour la gestion des actions Enable/Disable), on gère les actions d'enregistrement (start/stop) suivant le même principe.
Enfin, on teste l'action List (ou list), qui récupérera les informations à propos des caméras existantes sur le Synology (leur id et leur nom).

Ensuite il lance la commande (List) au niveau de l'équipement SS HTTP.
Ensuite, mais ici ce n'est PAS optionnel, il met à jour les informations d'id et de nom des caméras.
 
SS_actions_Send_Manual
Cet automate illustre comment utiliser le précédent.
 
SS_UpdateSid
On fait un logout, pour tuer le token (sid) existant qui n'est plus valide, et est la cause du non succès de l'action menée.
Puis on demande un nouveau token (sid) au Synology :
 
SS_status
"courage", c'est le dernier gros automate qui nous  permettra de connaitre le statut de toutes vos caméras.
Il y a 6 tests par caméra.
Car en fonction de la valeur de l'équipement, je teste la valeur de la variable qui va être mise à jour. Elle ne sera mise à jour que si elle est modifiée.
Le calcul est vite fait : pour 4 caméras il y aurait 138240 variables mises à jour par jour, et dans 99% des cas pour rien. Le petit Wait de 1ms à la fin de chaue groupe de caméra, c'est pour que ce soit plus joli au niveau graphique.
On envoie d'abord l'action List à l'équipement SS HTTP
Puis on traite les informations pour mettre à jour les variables de statut de chaque caméra (8 variables ici)
J'illustre ici pour Cameras0, mais ce sera exactement la même chose pour toutes les autres.
Premier test pour savoir si la caméra est activée ou pas :
Ensuite, quelle que soit la réponse, on teste la valeur de la variable, avant d'éventuellement la mettre à jour.
Le second groupe de tests est pour savoir si la caméra enregistre ou pas :
En fonction de l'humeur du Synology, il retourne soit un champ vide, soit 0 si la caméra n'enregistre pas, d'où le ou dans le test.
Ensuite, quelle que soit la réponse, on teste la valeur de la variable, avant d'éventuellement la mettre à jour.
 
SS_status_autorun
Ce dernier automate, démarre comme un service Windows avec la box, et tourne en continu pour exécuter le précédent toutes les 5 secondes. Ainsi si vous modifiez quelque-chose à une caméra, même sans passer par la LD, dans les 5 secondes la LD en est informée.
Il ne fallait surtout pas planifier le précédent automate toutes les 5 secondes, la planification de la LD serait morte.
Par ailleurs, l'avantage de faire un automate séparé, est de pouvoir modifier plus facilement l'automate appelé.
 
Vous remarquerez que j'ai commencé tous mes objets  (Variables, automates, équipement sauf le connecteur) par SS. Ainsi c'est plus facile de les retrouver avec les filtres.

Tuto - Surveillance Station.pdf

Lien vers le commentaire
Partager sur d’autres sites

Il n’y a pas tant de photo que ça, intègre les dans le topic, cela sera plus clair.

Par contre quel intérêt de logout et régénérer la cle sid ? De mémoire, sauf s’il y a eu changement depuis dans surveillance station, si aucun changement de mot de passe du compte, elle reste permanente.

Cela montre un exemple d’utilisation des api de surveillance station.

Lien vers le commentaire
Partager sur d’autres sites

@StéphanH,

Je ne connais pas les détails des autres box, je ne serais donc rien dire. Mais je dirais qu'elles sont fort proches, donc cela devrait s'y appliquer également.

@Einsteinium,

Je fais le logout, car c'est ce qui est expliqué dans le manuel de l'API.

Je ne regénère pas de nouveau SID à chaque fois, car le Syno n'aime pas ça du tout. Je réutilise chaque fois l'ancien, et seulement s'il retourne une erreur, il génère un nouvel SID. Et comme il m'envoie une notif à chaque génération de SID, et que je n'en reçois aucune, tout va bien :biggrin:.

Pour les images, c'est beaucoup de boulot, et j'ai déjà eu beaucoup de retour positifs d'avoir une version pdf complète téléchargeable, que les personnes peuvent facilement intégrer à leur documentation. De même si je le modifie, c'est beaucoup plus rapide (car je prépare tout à l'avance dans OneNote)

Lien vers le commentaire
Partager sur d’autres sites

Bonjour Jojo,

J'ai lu le post pour voir un peu ce que t'as mis en place, car j'ai moi même aussi mis en place la semaine dernière des outils pour piloter  Surveillance Station via ma domotique (box eedomus).

Ce que j'ai fais de mon côté et que j'ai finalisé cette semaine en réimportant l'ensemble du code de mon API sur le NAS Syno avec Web Station :

- développement d'un API avec des commandes basics :

  • activer les notifications sur la détection de mouvements
  • désactiver les notifications sur la détection de mouvements
  • démarrer l'enregistrement d'une caméra
  • arrêter l'enregistrement d'une caméra
  • + quelques services pour obtenir la liste des caméras et le status des notifications pour contrôler une peut l'état.

L'API peut piloter autant de caméras que j'ai (actuellement 3) et la ou je suis fier, c'est que sur la version beta, mon code était sur mon serveur web mutualisé

du coup lors des commandes, ça faisait : box eedomus (maison) > serveur mutualisé (internet) > API Surveillance Station (maison)

Les requêtes mettaient 2s pour répondre.

En mettant Web Station et en déplaçant les sources ça donne :

box eedomus (maison) > web station (maison) > API Surveillance Station (maison) du coup ça descend à 700ms les requêtes.

Pour ma part, côté API j'ai une classe dédiée pour communiquer avec API SS et une méthode principale pour exécuter une requête personnalisée.

Quand j'ai besoin d'exécuter une commande, ça fait :

  • login() pour récupérer le sid
  • command($query) pour exécuter ma requête
  • logout() pour forcer une déconnexion

Je préconise la déconnexion, pour des raisons évidentes de sécurité car entre 2 commandes, il peut très bien y avoir quelques minutes d'écart comme plusieurs jours.

Autant demander un nouveau sid quand vous en avez besoin, depuis le sid reste actif tant que le syno n'est pas redémarré de mémoire.

Pour la domotique, quand un détecteur infrarouge détecte un mouvement, il la box démarre l'enregistrement des caméras souhaités et arrête l'enregistrement 15s après la fin de détection du mouvement.

Pour le service de notification, quand j'utilise la détection par SS en cette période je me fais spam par des mails et ça consomme trop la batterie du tel, du coup, je peux désactiver quand je le souhaite les notifications SS

Voilou :)

Modifié par Michou
Lien vers le commentaire
Partager sur d’autres sites

mais alors, à quoi te sert ta détection via SS ?

Car si tu as des barrières infrarouges reliées à ta eedomus, c'est elle qui peut gérer les notifications et les enregistrements. Tes barrières infrarouges sont beaucoup plus fiables que la détections par SS.

Je vois en tout cas que tu as également fait un super projet, mais tu es développeur ...

Moi rien de tout ça, donc tes classes, .... c'est beaucoup trop compliqué pour moi :confused:

Par contre, si tu as également bien fouillé l'API de SS, je cherche à faire un truc :
1) commander à SS de prendre une photo
2) l'envoyer par mail

J'ai déjà beacoup cherché, mais pas trouvé; mais j'ai peut-être mal cherché ...

Lien vers le commentaire
Partager sur d’autres sites

Rejoindre la conversation

Vous pouvez publier maintenant et vous inscrire plus tard. Si vous avez un compte, connectez-vous maintenant pour publier avec votre compte.

Invité
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...

Information importante

Nous avons placé des cookies sur votre appareil pour aider à améliorer ce site. Vous pouvez choisir d’ajuster vos paramètres de cookie, sinon nous supposerons que vous êtes d’accord pour continuer.