Dernières nouvelles

Stocker les photos de sa caméra IP sur Dropbox et FTP

Que vous ayez mis en place une Webcam publique, une station de surveillance de vols de condors au-dessus de votre village, ou tout simplement un système de surveillance, vous avez peut-être déjà eu envie de pouvoir stocker quelque part les photos prises par votre caméra IP, par simple déclenchement ?

Voici comment faire, en profitant du très pratique service Dropbox, ce service qui vous permet d’échanger des fichiers de n’importe quel PC ou appareil mobile, directement via l’appli dédiée ou par le web !

Pour mettre ceci en place, il vous faudra :

  • Une caméra IP (et ses identifiants)
  • Un compte dropbox (gratuit ou pas)
  • Un serveur php (vous pouvez l’installer sur une RaspberryPi, ou utiliser un hébergement)
  • Éventuellement une box domotique pour lancer la prise de photo à distance

Je vous conseille de lire l’article en entier avant de choisir votre méthode, car sur la fin nous indiquons la méthode la plus simple, et c’est peut-être celle qui vous conviendra le mieux !

Le numéro d’API Dropbox

Identifiez-vous à votre compte Dropbox et créez une Application en allant sur la page https://www.dropbox.com/developers/apps

Acceptez les conditions d’utilisation et cliquez sur Create App :

Sauvegarde Camera IP sur Dropbox - créer application

Ensuite, configurez l’application comme suit :


Sauvegarde Camera IP sur Dropbox - configuration

  • What type of app do you want to create? : Dropbox API app
  • What type of data does your app need to store on Dropbox? : Files and Datastores
  • Can your app be limited to its own, private folder? : No
  • What type of files does your app need access to? : All File Types
  • Provide an app name, and you’re on your way. : Camera_Save

Validez, et gardez la page de l’application sous la main.

Le script

Récupérez le script « Camera Dropbox » sur le Github de Planète Domotique (script réalisé par les bons soins de Mickael, et avec un script d’identification Dropbox par Fabian Schlieper) :

Script Camera IP/Dropbox sur le Github de Planète Domotique

Faire une copie du fichier config_sample.php que vous appellez config.php.

Ouvrez-le dans un éditeur de texte, et indiquez les paramètres demandés.

Pour les identifiants d’API DropBox :

define("DROPBOX_APP_KEY", "xxxxxxxxxx");
define("DROPBOX_APP_SECRET", "xxxxxxxxxxx");

Référez-vous à l’onglet « Settings » de votre application, où ils sont présents :

Sauvegarde Camera IP sur Dropbox - Clé d'api dropbox

 

Pour chaque caméra, vous devez spécifier nom d’utilisateur, mot de passe, adresse IP et port.

Sur la ligne suivante, vous pouvez spécifier le répertoire dans lequel les images seront placées. L’adresse est basée sur le répertoire Public, ce qui signifie qu’avec la valeur par défaut « Camera/ », l’image est placée dans le répertoire /Public/Camera/ de la Dropbox. Il faut au préalable créer le répertoire ou les répertoires en question pour que l’envoi fonctionne.

define("DROPBOX_UPLOAD_DIR", "Camera/");

Il est possible d’envoyer l’image de la caméra dans un autre répertoire que le répertoire public, cela dit, on ne pourra pas faire de lien vers l’image dans l’e-mail envoyé par le script. Pour ce faire, allez dans mail_camera.php et modifiez la ligne suivante :

$dropbox->UploadFile($tmpfilename, "Public/".DROPBOX_UPLOAD_DIR.$img_name[$i]);

Encore une fois, il est nécessaire d’indiquer un chemin de répertoires qui existe sur la Dropbox

Le fichier de base vous propose une section pour Edimax et une section pour Foscam. Notez que selon la caméra, la ligne $full_url est à adapter :

Code selon le type de caméra

Code selon le type de caméra

Caméras de type Foscam / Apexis / Heden :

$full_url[x] = "http://".$cam_ip.":".$cam_port."/snapshot.cgi?user=".$cam_user."&pwd=".$cam_pwd;

Caméras de type Edimax :

$full_url[x] = "http://".$cam_user.":".$cam_pwd."@".$cam_ip.":".$cam_port."/jpg/image.jpg";

Caméras de type Trendnet :

$full_url[x] = "http://".$cam_user.":".$cam_pwd."@".$cam_ip.":".$cam_port."/cgi/jpg/image.cgi";

 

Envoyez le tout (fichiers du script et config.php paramétré correctement) sur votre serveur php. Créez également, au même niveau que les scripts, un répértoire « tokens » qui servira à stocker  les jetons d’authentification à Dropbox, et un repertoire « tmp » qui servira à stocker les photos avant leur envoi sur Dropbox. Mettez les droits d’accès en écriture au groupe (chmod 757 ou 777) pour ces deux dossiers.

Chargez une première fois la page http://[adresse de votre serveur web]/mail_camera.php : une authentification du script vous sera demandé (il faut être identifié au compte Dropbox créateur de l’application pour l’accepter).

Et voilà, c’est opérationnel !

Le petit oiseau va sortir !

Il ne vous reste plus qu’à charger la page http://[adresse de votre serveur web]/mail_camera.php, et la photo prise par la caméra apparaîtra directement dans la Dropbox (plusieurs photos si vous avez indiqué plusieurs caméras), tout en vous envoyant un e-mail pour vous donner le lien des photos envoyées.

Une autre petite astuce en complément de cette méthode : vous pouvez très bien utiliser un déclencheur http dans votre box domotique (ou un scénario qui lance la requête http) pour y faire un composant d’interface sur lequel il suffit de cliquer pour prendre une photo.

 

Enregistrer directement l’image sur le même serveur que le script

Si le script est hébergé lui-même sur l’espace web où vous voulez stocker vos photos, vous pouvez directement y enregistrer les photos en ne gardant que la partie du script où le fichier récupère l’image et créée un fichier temporaire (avant l’envoi sur la Dropbox).

Ça se situe à cet endroit dans mail_camera.php :

$content = file_get_contents($full_url[$i]);
$tmpfilename = dirname(__FILE__) ."/tmp/".$img_name[$i];

file_put_contents($tmpfilename, $content);

Il suffit de remplacer /tmp/ par un répertoire de votre cru. La photo est directement sous la forme image avec un numéro de caméra, une date l’heure. Bien sûr, le repertoire en question doit avoir les droits d’écriture (chmod 777 comme vu ci-dessus).

À la place de la fonction de classe $dropbox->UploadFile() appelée juste en-dessous (qu’on peut enlever si on n’envoie pas les fichiers sur Dropbox), vous pouvez par exemple faire un affichage de l’image qui vient d’être envoyée (voir code ci-dessous), ou un message de statut qui pourra être utilisé comme capteur HTTP dans certaines box.

if (file_exists($tmpfilename))
{
  echo '<h1> Image enregistrée sur la caméra '.$i.' :</h1><br/><img src="tmp/'.$img_name[$i].'"/><br/>';
}

Gardez le reste du code, il vous préviendra si l’image n’a pas été envoyé et enverra un e-mail avec les liens vers les photos. Il faudra cependant l’adapter un peu pour qu’il fasse un lien non pas vers les images de la dropbox, mais les images ftp.

Et pour l’envoi par FTP ?

En plus d’envoyer sur une DropBox, vous pouvez directement envoyer le fichier sur un serveur ftp. Pour ce faire, copiez le contenu ci-dessous dans un fichier ftp_upload.php à mettre à côté des autres fichiers du script.

Pensez à changer les lignes $ftp_server, $ftp_user_name et $ftp_user_pass respectivement par l’adresse ftp de votre serveur, votre nom d’utilisateur et votre mot de passe.

<?php
function envoi_ftp($src_file, $dst_file)
{
  $ftp_server='adresse.fr';
  $ftp_user_name='login';
  $ftp_user_pass='mot de passe';

  // Mise en place d'une connexion basique
  $conn_id = ftp_connect($ftp_server);

  // Identification avec un nom d'utilisateur et un mot de passe
  $login_result = ftp_login($conn_id, $ftp_user_name, $ftp_user_pass);

  // Verification de la connexion
  if ((!$conn_id) || (!$login_result)) 
  {
      echo "La connexion FTP a &eacute;chou&eacute; !";
      echo "Tentative de connexion au serveur $ftp_server pour l'utilisateur $ftp_user_name";
      exit;
  } 
  else 
  {
    echo "Connexion au serveur $ftp_server, pour l'utilisateur $ftp_user_name";
  }

  $destination_file = '/'.$dst_file;

  // Chargement d'un fichier
  $upload = ftp_put($conn_id, $destination_file, $src_file, FTP_BINARY);

  // Verification du status du chargement
  if (!$upload) {
      echo "Le chargement FTP a echoue";
    } else {
      echo "Chargement de $source_file vers $ftp_server en tant que $destination_file";
    }

  // Fermeture du flux FTP
  ftp_close($conn_id);
}
?>

Dans ce fichier, à la ligne $destination_file = ‘/’.$dst_file;, vous pouvez indiquer tout un chemin de répertoires de la forme /Repertoire1/Repertoire2/Repertoire3/. Par exemple :

$destination_file = '/Cameras/Photos/'.$dst_file;

Il va sans dire qu’il vous faudra aussi faire un chmod 777 sur le repertoire cible pour que notre script puisse y accéder en écriture !

Ouvrez le fichier mail_camera.php et ajoutez un appel à ce fichier avec la fonction require_once() :

<?php

require_once("DropboxClient.php");
require_once("config.php");
require_once("upload_ftp.php");

Ensuite, recherchez la ligne  if (file_exists($tmpfilename, « )) et ajoutez l’appel de la fonction envoi_ftp(); comme suit :

if (file_exists($tmpfilename, "))
  {
    $dropbox->UploadFile($tmpfilename, "Public/".DROPBOX_UPLOAD_DIR.$img_name[$i]);
    envoi_ftp($tmpfilename, $img_name[$i]);
  }

Désormais, le script enverra pour chaque caméra l’image à la fois sur la Dropbox et par FTP.

Sur le même principe, vous pouvez faire en sorte que l’image prise par la caméra soit uniquement envoyée par FTP en enlevant tout ce qui concerne Dropbox dans les scripts. Il est cependant important de conserver la partie sur la configuration des caméras et la partie du script qui récupère l’image auprès des caméras.

Sur ces bases, à vous d’accommoder votre enregistrement d’image à distance sur Caméra IP à votre bon plaisir : on peut par exemple imaginer une page complète montrant les dernières photos prises par la/les caméra(s), et avec un bouton de déclenchement qui appelle le script de capture d’image.

Nous espérons que ce guide vous aura été utile, et si quelque chose n’est pas clair, n’hésitez pas : direction les commentaires !

A propos de Pierre

Amateur de nouvelles technologies depuis très jeune, j'adore bidouiller les appareils qui m'entourent pour en tirer le maximum. La domotique est pour moi un moyen incontournable pour se faciliter la vie, et ses usages n'ont pas fini de nous surprendre !

8 commentaires

  1. Genialissime, bravo Pierre…

  2. En rubrique « SCRIPT » il est indiqué de Faire une copie du fichier config_sample.php que vous appellez config.php. »
    Par quel moyen cela peut se faire. Merci

  3. Il vous suffit de copier-coller le fichier Config_sample.php, vous obtiendrez un fichier appellé
    [Copie de config_sample.php], ou [config_sample - Copie.php] (ou autre nom selon le système).
    Sur ce fichier-là, vous faites clic-droit > renommer et vous remplacez tout le nom du fichier par « config » (ou config.php si l’extension s’affiche). Vous pouvez désormais éditer le fichier et personnaliser son contenu :)

  4. Bonjour,
    je me lance tout récemment dans la mise en place d’un système de surveillance par caméra IP.
    La caméra est une AXIS M1031, comment savoir de quel type elle est (heden, Foscam…)

    Merci de votre réponse.

  5. Bonjour Montus,
    En fait Axis c’est encore une autre marque de Caméra qui n’est pas citée dans ce tutorial.

    J’ai regardé comment étaient faites les URL de flux pour l’AXIS M1031 et ça devrait fonctionner en utilisant la ligne indiquée pour les caméras de type Edimax (adresse se terminant par « /jpg/image.jpg »).

    J’espère que ça fonctionnera ! ;)

  6. Bonjour Pierre,
    D’accord, je vais essayer ça alors :)

    Merci

  7. bonjour

    je voulais savoir si le script prévoit un écrasement si plus de place sur dropbox…ou comment ça se passe si dépasser mets 3Go.? meme si j’ai une synchronisation sur syno.(10 cams et beaucoupe de vent donc de detection de mouvement, donc beaucoup de pics….

    merci

  8. Bonjour Philippe,
    Non, ce script ne prévoit pas d’écrasement, une fois l’espace complétement occupé, le script aura un refus d’écriture. Il faut prévoir ce délestage d’une autre manière.

Répondre

Votre adresse email ne sera pas publiée. Les champs obligatoires sont marqués d'une étoile *

*

Vous pouvez utiliser ces balises et attributs HTML : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Revenir en haut de la page