Surveillance Station + Telegram

Hello ,

J 'aimerai savoir si avec le plugin surveillance station on peut faire comme avec le plugin camera .

C 'est à dire , faire un snapshot et /ou vidéo suite à déclenchement d 'un capteur et envoyer les prises de vues dans telegram. ?

Exemple Ci-dessous avec le plugin Camera:

Merci par avance,

Minos

Oui, mais avec modification de code, voir mon sujet Instantané pour MMS

Ok merci , mais tu aurais un exemple plus " concret " stp , un imprime ecran ?

Merci par avance,

Voici ma commande pour envoyer une image via MMS :

Fichier à modifier :
fichier

Voici le code des commandes :

		$cmd = $this->getCmd(null, 'snapshotsend');
		if (!is_object($cmd)) {
			$cmd = new surveillanceStationCmd();
           	$cmd->setEqLogic_id($this->getId());
			$cmd->setLogicalId('snapshotsend');
			$cmd->setName(__('Envoi Instantané', __FILE__));
			$cmd->setOrder(20);
		}     
       	$cmd->setType('action');
		$cmd->setSubtype('other');
		$cmd->setIsVisible(0);
		$cmd->save();
      
      	$cmd = $this->getCmd(null, 'snapshotsendURL');
		if (!is_object($cmd)) {
			$cmd = new surveillanceStationCmd();
          	$cmd->setEqLogic_id($this->getId());
			$cmd->setLogicalId('snapshotsendURL');
			$cmd->setName(__('URL instantané', __FILE__));
			$cmd->setOrder(21);
		}
		$cmd->setType('info');
		$cmd->setSubType('string');
		$cmd->setEqLogic_id($this->getId());
		$cmd->setIsVisible(0);
		$cmd->save();

Voici le code derrière l’action :

		if ($this->getLogicalId() == 'snapshot') {
			if ($statecam == 'Activée'){
				log::add('surveillanceStation', 'debug', 'lancement de l\'action Instantané caméra '.$eqLogic->getName(). '(id:'.$eqLogic->getConfiguration('id').')');
				$eqLogic->callUrl(array('api' => 'SYNO.SurveillanceStation.SnapShot', 'method' => 'TakeSnapshot', 'dsId' => '0', 'camId' => $eqLogic->getConfiguration('id')));
			} else {
				throw new Exception('Commande impossible, la caméra est désactivée');
			}
		}
		if ($this->getLogicalId() == 'snapshotsend') {
			if ($statecam == 'Activée'){
				log::add('surveillanceStation', 'debug', 'lancement de l\'action Envoi Instantané '.$eqLogic->getName(). '(id:'.$eqLogic->getConfiguration('id').')');
                $urlSnapshot = $eqLogic->callUrl(array('api' => 'SYNO.SurveillanceStation.SnapShot', 'method' => 'TakeSnapshot', 'dsId' => '0', 'camId' => $eqLogic->getConfiguration('id')));     			
              	$idSnapShot = $urlSnapshot['data']['id'];
				log::add('surveillanceStation', 'debug', 'résultat ID Snapshot '.$this->getName(). '(id:'.$eqLogic->getConfiguration('id').') -> ' .print_r($idSnapShot, true));      			
				$urlRecupSnapshot = $eqLogic->getUrl() . '/webapi/entry.cgi?api=SYNO.SurveillanceStation.SnapShot&version=1&method=LoadSnapshot&id='.$idSnapShot.'&imgSize=2&_sid='.$eqLogic->getSid();
                $eqLogic->checkAndUpdateCmd('snapshotsendURL', $urlRecupSnapshot);              
				log::add('surveillanceStation', 'debug', 'résultat URL du Snapshot '.$this->getName(). '(id:'.$this->getConfiguration('id').') -> ' .print_r($urlRecupSnapshot, true));
			} else {
				throw new Exception('Commande impossible, la caméra est désactivée');
			}
		}

Ok merci je regarderai ça à tête reposée … :grin:

As-tu réussi? Je comprends rien sur qu’il faut faire…

Hello,

non je me suis pas penché sur le sujet à vrai … pas eu le temps …

Il faut ajouter le code des commandes dans surveillanceStation.class.php :
dans la section « Méthodes d’instance », juste après le code commenté commençant par $cmd = $this->getCmd(‹ action ›, ‹ snapshotsend ›);

Puis ajouter le code derrière l’action dans la section « Getteur Setteur » juste après le code commenté commençant par if ($this->getLogicalId() == ‹ snapshotsend ›) {

Ensuite, il faut aller dans Jeedom->Plugins->Sécurité->Surveillance Station et cliquer sur « Synchronisation ». Cela va récréer une commande « Envoi instantané » et une info « URL instantané » dans la liste des commandes de vos caméras que vous pouvez alors utiliser dans vos scénarios

Par exemple (ici avec Discord mais ça fonctionne pareil avec Télégram) :

Bonjour,

J’ai suivis tes indications et j’ai eu un « 500 : Internal Server Error » au moment de la synchronisation.

Dans la section « Getteur Setteur » il n’y avait pas le code commenté commençant par if ($this->getLogicalId() == ‹ snapshotsend ›) {. Il n’y avait aucun code commanté du tout d’ailleurs.

Peux-tu m’aider?

Il n’est pas nécessaire que le code ajouté soit exactement après celui qui (chez moi) est commenté. Ci-joint le code de surveillanceStation.class.php (rennommé en .txt pour qu’il puisse être joint ici) surveillanceStation.class.txt (54,6 Ko)

Essaie avec celui-ci…

Je comprends que ce code est utilisé pour envoyer un instantané, mais y a-t-il une possibilité qu’il envoie une vidéo d’une certaine heure?

Ok merci pour ton aide, j’ai réussi, je n’avais pas ajouté la seconde partie au bon endroit…

Ca marche bien, je recoit un snapshot avec le lien. Savez-vous si cette fonctionnalité fonctionnera toujours si je passe ma connexion dans le plugin en LAN?

Bonjour,
je viens de découvrir cette mise à jour. Merci pour l’évolution envoi snapshot. :clap:

J’en profite pour interconnecté un post que j’ai ouvert en décembre :

Je suis habitué sous telegram à recevoir les photos directement, plutôt qu’un lien. J’ai trouvé une bidouille pour le faire, mais cela ne marche plus en cas de reboot du synology.
Si quelqu’un a une idée je suis preneur.

Merci pour votre travail.

Aknot

Hello,

J’ai commencé à faire une PR pour pouvoir télécharger sur le jeedom, temporairement, un snapshot ou même une videos de quelques secondes.
L’objectif étant de pouvoir envoyé directement l’image ou la video et non pas un lien (dans mon cas le Syno n’est pas accessible d’internet).

Mais au passage, j’en profite pour revoir un peu les historiques de v3 pour le mettre vraiment au gout du jour v4.
Du coup je me demandais l’interet d’avoir 2 commandes :

  • snapshot
  • snapshotsend
    Vu que les 2 génère un snapshot mais que seule la seconde génère le lien ou trouver le snbapshot sur le syno pour la stocker dans la commande info snapshotsendURL, ce serait pas mieux d’avoir que la commande snapshot qui stocke systématiquement l’URL aussi ?

Ainsi ca permettrait de faire des scénarios par exemple, qui quand manuellement on fait un snapshot par Jeedom (sur le panel ou le widget par exemple) donc via la commande snapshot, ca permet d’updater la commande snapshotsendURL et si le scénario écoute les changement sur snapshotsendURL, il envoi automatiquement le message.
Enfin bref, je trouve que 2 commandes pour générer un snapshot peut perturber les utilisateurs (en tout cas moi il m’a fallu lire le code pour comprendre la diff) alors qu’une seule (snapshot) mais qui fait ce que fait (snapshotsend) serait suffisant et plus clair.

Je suis preneur de votre vision

Salut, où en es-tu du dévelloppement de l’envoie d’un snap direct plutôt qu’un lien?

Bonjour,

J’ai fait pour les screenshot mais j’essaye d’intégrer la récupération de video de quelques minutes aussi mais j’arrive pas à trouver un EndPoint API qui me le permette.

C’est déjà super pour les screenshot, du coup tu vas faire une maj?

Je ferais une PR mais cela fera une MaJ que lorsque l’auteur acceptera la PR.

Ah je croyais que c’était toi le développeur.

Hello
Vous n’êtes pas obligé de modifier le plugin … vous pouvez tout gérer par un scénario … enregistrement sur le jeedom d’une snapshot à partir d’une url …et si vous voulez vous pouvez prendre plein de snap et faire une vidéo et apres l’envoyer avec le canal que vous souhaitez …dans l’exemple ci-dessous via jeedomConnect

function sendvideo($scenario,$message) {
	$date = new DateTime();
    $dateMef=$date->format('Y-m-d H:i:s');

    //Build video from snapshot
    $filePath='/var/www/html/snapshots/records/';
    $fileName='_snap_record_Garage.jpg';
    $scenario->setLog($filePath.'temp');
    $scenario->setLog(str_pad($nb, 8, '0', STR_PAD_LEFT).$fileName);

    $startTime=strtotime("now");
    $endTime=$startTime+30;
    $nb=0;
    $nbSnapshot=30;
    //while ( strtotime("now") <= $endTime) {
    while ($nb <= $nbSnapshot) {
      $scenario->setLog(strtotime("now") .'| endtime : ' . $endTime);
      commonsFunction::get_file($scenario,'http://192.168.1.135:8765/picture/1/current/',$filePath.'/temp/',str_pad($nb++, 8, '0', STR_PAD_LEFT).$fileName);
      sleep(1);
    }

    if (file_exists($filePath.'/temp/')) {
      $output_file = 'buildVideo' . '_' . date('Y-m-d_H-i-s') . '.mp4';
      $files = scandir($filePath.'/temp/');
      if (count($files) > 1) {
        //$first_number = substr($files[2], 0, 6);
        $first_number = substr($files[2], 0, 1);
        $start = '-start_number ' . $first_number . ' ';
      }


      $framerate="1";
      $engine = config::byKey('rtsp::engine','camera','avconv');
      $scenario->setLog('engine : ' .$engine);
      $scenario->setLog('Start : ' . $start);
      $shellCmd=$engine.' -framerate ' . $framerate . ' ' . $start . ' -f image2 -i ' . $filePath .'temp/' . '%08d' . '_snap_record_Garage.jpg -pix_fmt yuv420p ' . '/var/www/html/snapshots/records/' .$output_file;
      $scenario->setLog($shellCmd);
      $result=shell_exec($shellCmd);
      notificationFunction::sendJeedomConnectMessage($scenario,'chris','Notif_Camera','/var/www/html/snapshots/records/' .$output_file,'Camera Garage Motion eye : '. $dateMef,$message);
      shell_exec(system::getCmdSudo() . 'rm -rf ' . $filePath.'/temp/*.jpg');
    }
}

La fonction commonsFunction::get_file permet d’enregistrer l’image à partir d’une url

public function get_file($scenario,$file, $local_path, $newfilename) {
        $err_msg = ''; 
        
        $out = fopen($local_path.$newfilename,"wb");
      	//$scenario->setLog("Attempting message download for $file to $out"); 
        if ($out == FALSE){ 
          $scenario->setLog("File not opened<br>"); 
          exit; 
        } 

        $ch = curl_init(); 

        curl_setopt($ch, CURLOPT_FILE, $out); 
        curl_setopt($ch, CURLOPT_HEADER, 0); 
        curl_setopt($ch, CURLOPT_URL, $file);
      	curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
		curl_setopt($ch, CURLOPT_HTTP_VERSION, CURL_HTTP_VERSION_1_1);

        curl_exec($ch); 
        //$scenario->setLog("Error is : ".curl_error($ch)); 

        curl_close($ch); 
    }
  

A ça il faut ajouter un pti script de purge des fichiers et le tour est joué … moi je fais une vidéo si une personne ouvre le garage et que l’alarme est activée… :slight_smile:

$scenario->setLog("Start script delete snapshots");

//31 jours
//$delta=2678400;
//16 jours
$delta=1382400;

//Delete videos
deleteFile($scenario,'/var/www/html/snapshots/records/',$delta);

$scenario->setLog(' ');

//delete snapshots
deleteFile($scenario,'/var/www/html/snapshots/',$delta);


function deleteFile($scenario,$path,$delta) {
	try {
      $nbDelete=0;
      $scenario->setLog('Function deleteFile : ' . $path . ' - delta : ' . $delta);
      $folder=new DirectoryIterator($path);
      $scenario->setLog('Path : ' . $path . ' -> esapce utilisé avant purge : ' . shell_exec('du -sh '. $path));
      foreach($folder as $file) {
        try {
          if($file->isFile() && !$file->isDot() && (time() - $file->getMTime() > $delta)) {
              unlink($path.$file->getFilename());
              $nbDelete++;
              $scenario->setLog("File : " . $file->getFilename()  . '| creation date : ' .  $file->getMTime() . '	==> deleted');
          }
        } catch (Exception $e) {
            $scenario->setLog('		=> Error on deleteFile function on a file : ' .  $e->getMessage());
        }
      }
      $scenario->setLog('	- Nb fichiers purgés : ' . $nbDelete);
      $scenario->setLog('Path : ' . $path . ' -> esapce utilisé après purge : ' . shell_exec('du -sh '. $path));
	} catch (Exception $e) {
    	$scenario->setLog('		=> Error on deleteFile function : ' .  $e->getMessage());
	}

}
$scenario->setLog("End script delete snapshots");

Avec ça peut importe le plugin vous etes en capacité de sauvegarder des snaps … de créer un ptite video et de l’envoyer

Si ça peut aider et que vous avez des soucis d’intégration hésitez pas par MP
@chris94440