Utiliser l’API de Synology Surveillance Station 7

Nouvel article pour les heureux propriétaires de serveurs Synology et de caméras IP.

Synology a mis à jour son API avec la nouvelle version 7 de SurveillanceStation, qui pour mémoire est un paquet officiel permettant de mettre en place un système de vidéo surveillance très abouti sur son NAS.

Cette nouvelle API est documenté dans ce PDF de 370 pages. Je l’héberge aussi sur mon serveur pour archive ici : Surveillance_Station_Web_API_v2.0.
D’ailleurs, Synology prend d’avantage soin des développeurs à présent, en leur consacrant une page dédiée.

Malgré les efforts de Synology pour assurer une compatibilité à long terme, un récent changement s’est avéré destructif. Contrairement à ce qui est indiqué dans la documentation (!) il faut passer à priori systématiquement par /webapi/entry.cgi au lieu de /webapi/SurveillanceStation/extrecord.cgi comme indiqué page 115 … Effectivement, on avait une jolie 404 et pour cause, il n’y a pas de extrecord.cgi  dans /usr/syno/synoman/webapi/SurveillanceStation/ExternalRecording .

Autres changements au programme :

  • il faut à présent se logout lorsque l’on a terminé nos actions
  • la méthode pour récupérer les informations des caméras s’est considérablement enrichie (et malheureusement complexifié aussi)

Voici un exemple de script permettant d’activer ou désactiver l’enregistrement manuel de toutes vos caméras actives. Le paramètre $actionRecord  sert à choisir si l’on veut activer ou desactiver l’enregistrement. Vous pouvez simplement l’externaliser pour en faire un paramètre d’appel de votre script par $_GET[‘action’] par exemple.

 

<?php

$server = "http://localhost:5000";
$login = "loginSYNO";
$pass = "passwordSYNO";

/* API VERSIONS */
//SYNO.API.Auth
$vAuth = 2;
//SYNO.SurveillanceStation.Camera
$vCamera = 6;
//SYNO.SurveillanceStation.ExternalRecording
$vExternalRecording = 2;
//action : start / stop recording
$actionRecord = "stop";

$json = file_get_contents($server.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version='.$vAuth.'&account='.$login.'&passwd='.$pass.'&session=SurveillanceStation&format=sid');
$obj = json_decode($json);

if($obj->success != "true"){
	echo "error";
	exit();
}else{
	//authentification successful
	$sid = $obj->data->sid;
		
	//list of known cams 
	$json_listcam = file_get_contents($server.'/webapi/entry.cgi?privCamType=3&version="'.$vCamera.'"&blIncludeDeletedCam=false&streamInfo=false&api="SYNO.SurveillanceStation.Camera"&basic=true&method="List"&_sid='.$sid);
	$obj_cam = json_decode($json_listcam);
		
	foreach($obj_cam->data->cameras as $cam){
		$id_cam = $cam->id;
		
		if($cam->enabled ) {
			$json_set_record = file_get_contents($server.'/webapi/entry.cgi?api=SYNO.SurveillanceStation.ExternalRecording&method=Record&version='.$vExternalRecording.'&cameraId='.$id_cam.'&action='.$actionRecord.'&_sid='.$sid);
			$obj = json_decode($json_set_record);
			if($obj->success != "true"){echo "error set record on cam ".$id_cam;}else echo "<p>Cam ".$id_cam." ".$actionRecord." recording.</p>";
		}
		else{
			echo "<p>Cam " . $id_cam . " skipped</p>";
		}
	}

	//logout
	$json_logout = file_get_contents($server.'/webapi/auth.cgi?api=SYNO.API.Auth&method=Logout&version='.$vAuth.'&session=SurveillanceStation&_sid='.$sid);
	$obj_logout = json_decode($json_logout);

}

?>

37 thoughts to “Utiliser l’API de Synology Surveillance Station 7”

  1. Bonjour,

    Merci pour ton script.
    Comment fait-on pour juste « activer » ou « désactiver » la caméra avec ton script?

    1. Bonjour BBR,

      Comme indiqué dans l’article :

      Le paramètre $actionRecord sert à choisir si l’on veut activer ou desactiver l’enregistrement.

      Tu peux par exemple enregistrer 2 fichiers, un avec la variable à start que tu appelera « activer_cam.php » par ex et son alter ego pour stoper l’enregistrement.
      Sinon un seul script avec la variable en $_GET que tu pourras alors appeler en http://ton_serveur/script_cam.php?action=start

  2. Merci pour ta réponse, mais ma question porte sur la commande pour activer/désactiver la caméra plutôt que sur arrêter/lancer l’enregistrement.
    Est-ce que tu peux m’aider?

    1. Tu devrais trouver ton bonheur dans l’API SYNO.SurveillanceStation.Camera « Enable method » décrite page 48 de la doc.

      1. Oui j’ai écrit ça pour désactiver mais ça ne fonctionne pas:

        $json_desactivate = file_get_contents($server.’/webapi/entry.cgi?cameraIds=’.$id_cam.’&api= »SYNO.SurveillanceStation.Camera »&version= »8″&method= »Disable »‘);
        $obj = json_decode($json_desactivate);
        if($obj->success != « true »){echo « error set off cam « .$id_cam;}else echo « Cam « .$id_cam. »disabled. »;

          1. Lis bien la doc, elle est très bien faite, avec de nombreux exemples.
            Fais des essais, trompes toi et apprends de tes erreurs. Tu as tous les éléments en main pour faire ton propre script.
            Je ne te ferais pas ton script 🙂

          2. Franchement, je lutte, un petit coup de main serait le bienvenue.

            Qu’est ce qui ne va pas dans ma commande :
            file_get_contents($server.’/webapi/SurveillanceStation/camera.cgi?api= »SYNO.SurveillanceStation.Camera »&method= »Enable »&version= »3″&cameraIds= »‘.$id_cam.' »‘);

            ?

          3. Peut etre trop de double quote, sinon essai d’ajouter le paramètre _sid
            peut etre aussi faut il passer par entry.cgi

          4. En fait aprés analyse les lignes de commandes me retourne une erreur 105 : « Insufficient user privilege ».

            Des idées?

  3. Bonjour,
    Très intéressant.
    Merci !
    Savez-vous si on peut de la même façon enclencher l’enregistrement sur détection de mouvement uniquement ?
    Merci

    1. Il faudrait regarder plus précisément la doc que j’ai indiquée dans l’article. En survolant le sommaire, aucune action ne m’a sauté au yeux répondant à ta question. Cependant, tu pourrais peut etre activer toujours tes caméras en detection de mouvement et les activer/desactiver via l’API.

      1. Merci.
        C’est en effet ce que je souhaiterais faire : Activer / désactiver les caméras de Surveillance Station via un script inspiré du tien.
        Quelqu’un a trouvé comment activer / désactiver ?
        Merci

  4. Dans le cas de configuration de plusieurs caméras, y a t’il une info à modifier sur les php pour éviter que l’enregistrement se lance sur toutes les caméras lorsqu’une seule doit enregistrer ?

    1. Pour cela, il faut avoir un minimum de notion d’algorithmie 🙂
      Il suffit d’enlever la boucle et de ne lancer l’action que sur la caméra souhaitée.

  5. bonjour xavier,

    j’ai mis en place un script php inspiré par le tiens qui marchait bien jusqu’à quelques jours. Depuis, ça ne marche plus, pas plus qu’en copiant ton script.
    Par contre, quand je lance à la main une commande d’authentification, ça fonctionne.
    Y-a-t-il eu des changements récents ?

    par exemple le message de retour après authentification « à la main »:
    {« data »:{« sid »: »TU.Hqzzzzzzzzzzzzz »}, »success »:true}

    merci de ton retour

    1. Salut jibn,
      Je n’ai pas constaté de regression de mon côté.
      Je suis sur une version 7.1-4110 actuellement.
      Le sid que tu obtiens est bizarre 🙂 C’est statistiquement hautement improbable d’avoir autant de fois la même lettre dans un hash !
      Je pencherai sur un bug de ton côté.
      cdt

  6. Rebonsoir,

    Pour le sid, c’est moi qui l’ai modifié, désolé si cela t’as induit en erreur.

    Je ne comprends pas non plus, je me demandais si la structure du message de retour n’avait pas changée ?
    C’est pas une piste ?

  7. rebonjour,

    je me réponds à moi-même, ça venait effectivement de ma config. L’adresse ip du serveur était bloquée dans les paramètres du pare-feu.

    bonne soirée

  8. Bonjour, quand je regarde dans le repertoire webapi ou webapi/surveillancestation quelques cgi sont présents mais pas l’intégralité des cgi stipulés dans le pdf api officiel de surveillance station.

    Je souhaite par exemple piloter un mouvement de camera (Page 109) et cela implique l’utilisation de ptz.cgi. J’ai une erreur 404 car ce fichier n’existe pas dans cet emplacement.

    Il est dans:
    @appstore/SurveillanceStation/ui/cgi/ptz.cgi

    Dois-je faire un lien symbolique ou copier les fichiers au bon emplacement ?

    Merci Beaucoup

  9. Bonjour,
    Merci pour cet exemple qui m’a permis de me mettre aux API de Synology.
    La question que je me pose est relatif au sid.
    Lorsque l’on s’est authentifié, (auth.cgi/Login) et récupéré son sid, est ce que vous savez s’il y a un timeout sur le sid (dans le cas ou il n’y a pas eu de delog).

    Merci

    1. Bonjour,

      Vous trouverez sans doute cette information dans l’outil que vous utiliserez pour adresser les API. Sinon, si vous implémentez les cookies, il y a des chances que la durée de vie du jeton coïncide avec la date d’expiration du cookie.
      Pour ma part, je n’ai pas eu à m’en soucier car je ne cherchais pas à garder une session en vie.

  10. Bonjour à tous

    Est ce que quekqu’un pourrait m’aider à refaire marcher mon script pour déclencher mes cameras ? Ca marchait il y a quelques mois et mainteanant Synology aprés plusieurs update ca ne marche plus .

    Lors de la récupération du SID je suis systématuqment en Erreur.

    // Appel pour arreter l’enregistrement de la caméra 7 : http://192.168.1.2/Camera/StartStopRecording.php?actionRecord=stop&camera=7
    // Appel pour démarrer l’enregistrement de la caméra 7 : http://192.168.1.2/Camera/StartStopRecording.php?actionRecord=start&camera=7
    //
    // Voici un exemple de script permettant d’activer ou de désactiver l’enregistrement manuel d’une caméra active.
    // Le paramètre $actionRecord sert à choisir si l’on veut activer ou desactiver l’enregistrement.
    //
    // 7 => INTERIEUR COULOIR DU BAS
    // 8 => INTERIEUR COULOIR DU HAUT
    //
    //Action : start / stop recording
    $actionRecord = $_GET[‘actionRecord’];
    $numeroCamera = $_GET[‘camera’];

    $server = « http://localhost:5000 »;
    $login = « Login Syno »;
    $pass = « Mot de passe Syno »;

    /****************/
    /* API VERSIONS */
    /****************/

    //SYNO.API.Auth
    $vAuth = 2;
    //SYNO.SurveillanceStation.Camera
    $vCamera = 6;
    //SYNO.SurveillanceStation.ExternalRecording
    $vExternalRecording = 2;

    // Get API Info de surveillance station
    $json = file_get_contents($server.’/webapi/auth.cgi?api=SYNO.API.Auth&method=Login&version=’.$vAuth.’&account=’.$login.’&passwd=’.$pass.’&session=SurveillanceStation&format=sid’);
    $obj = json_decode($json);

    if($obj->success != « true »)
    {
    echo « Erreur lors de la recuperation du SID de l’API de Surveillance Station »;
    exit();
    }

    etc …

    Merci pour votre car je séche, je ne sais pas ou trouver l’info pour savoir ou ça cloche ?

    Merci d’avance à tous

    Salutations

  11. Bonjour,
    Je suis un vieux geek de 67 ans, je bricole la domotique et réalise quelques programmes en php.
    je vais tester le php de déclenchement des caméras qui parait intéressant , actuellement j’ai un petit projet sympa: j’utilise une barrière virtuelle sur une de mes caméras axis, et je souhaiterais piloter mon ampli pour le faire aboyer style « berger allemand », tous les appareils sont connectés sur le même réseau (caméras, synology, ampli denon, box domotique eedomus) je sais démarrer l’ampli, le mettre sur telle ou telle entrée, régler le volume, j’ai un enregistrement de chien, je sais envoyer des ordres http de la camera, mon soucis, c’est de « diriger » le chien vers l’ampli, je suis ouvert aux idées et suggestions
    D’avance merci
    Gilles

    1. Bonjour Gilles, pour envoyer le son sur l’ampli, vous pourriez utiliser un chromecast si vous avez un autre serveur sur votre réseau, sinon un raspberry pi avec une mini carte son usb pourrait faire l’affaire. Bon courage !

  12. Slt,
    je me suis fait la totalité de la dernière doc,
    je souhaite via l’API pouvoir simuler la détection d’un mouvement.

    J’ai des détecteurs PIR qui fonctionne avec ma box domotique.
    Ils sont bcp plus fiable que la détection de mouvement.

    Actuellement je déclenche l’enregistrement via une commande mais si on pouvait déclencher une détection,
    cela permettrai de recevoir une notif avec un snapshot !!

    je n’ai pas trouvé de commande permettant de le faire.
    Si quelqu’un a une idée pour contourner le truc ??

    Merci,

    julien.

    1. Hello Julien,
      Puisque tu as l’événement sur ta box domotique, pourquoi ne pas déclencher la prise de snapshot depuis celle ci ?
      En jeedom, cela se fait facilement 😉

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *