Comme annoncé, ce forum est passé en lecture seule au 1er janvier 2020. Désormais nous vous invitons à vous rendre sur notre nouvelle page communauté :
Image

A très bientôt !

Script Caméra Netatmo Présence

Réservé à l'utilisation et la programmation de scripts dans JEEDOM
damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 18:41

Edit:
!!! ATTENTION!!!
Dans la méthode qui suit, l'api se connecte très souvent au site Netatmo et il est possible que Netatmo vous coupe l'accès et il faudra alors changer d'adresse IP. Donc, si vous utilisez ce script, ne changez pas la fréquence du cron...
L'alternative est d'utiliser IFTTT pour rafraîchir les infos à chaque fois que la caméra détecte quelque chose




Bonjour à tous.

En attentant l'évolution du plugin Netatmo Welcome partagé par Loic dont la version beta reconnait la caméra Netatmo Présence, j'ai créé un script qui permet de lire les derniers événements qui ont été repérés par la caméra.
Présence_événements.JPG
Présence_événements.JPG (30.92 Kio) Consulté 8627 fois
Pour cela, j'ai créé un sous-répertoire Netatmo dans le répertoire des cripts et j'y ai placé plusieurs fichiers :

- Le 1er fichier est : NetatmoCameraAPI.php
que vous pourrez trouver ici : https://github.com/KiboOst/php-NetatmoCameraAPI

- Le 2e fichier est Netatmo_login.php (qui permet de se connecter à son compte Netatmo uniquement avec le 'User' et le 'pass'... pas besoin de clé API

Code : Tout sélectionner

<?php

// Basé sur l'API postée par KiboOst
// https://github.com/KiboOst/php-NetatmoCameraAPI

require('NetatmoCameraAPI.php');
$Netatmo_user = 'votre_user'; // insérez ici votre 'login' Netatmo
$Netatmo_pass = 'votre_mot_de_passe'; // insérez ici votre mot de passe
$Home = 'votre_maison';  // insérez ici le nom de maison que vous avez mentionné dans votre compte Netatmo
$_NAcams = new NetatmoCameraAPI($Netatmo_user, $Netatmo_pass,$Home);
if (isset($_NAcams->error)) die($_NAcams->error); 
?>
Le 3e fichier, je l'ai appelé Presence_last_event.php

Code : Tout sélectionner

<?php

// Basé sur l'API postée par KiboOst
// https://github.com/KiboOst/php-NetatmoCameraAPI


$Camera = $argv[1];  // Nom de la camera
$numberofevents = intval($argv[2]); // Nombre d'événements
if (!$numberofevents) {
  $numberofevents = 20;
}

require('Netatmo_login.php');  // connexion au compte Netatmo


// Settings 

$settings = $_NAcams->getCameraSettings($Camera); // récupère les données de la caméra
$status = $settings ['status'];
$SDstatus = $settings ['sd_status'];
$alim = $settings['alim_status'];
$light_mode_status = $settings['light_mode_status'];
$intensity = $settings['light']['intensity'];
$is_local = $settings['is_local'];
$error_status = $settings['error_status'];
$audio = $settings['audio'];


$result = 'Surveillance : '.$status.'  <br/>Alimentation : '.$alim.'   <br/>SD : '.$SDstatus.'<br/>';
$result = $result.'Eclairage : '.$light_mode_status.'<br/>Intensité Led :'.$intensity.' <br/>';
$result = $result.'Audio : '.$audio.'<br/>En local : '.$is_local.'<br/>'.$error_status.'<br/>';


// TimeLine
$result = $result.'<div class="timeline">';

for ($i=0 ; $i <= $numberofevents ; $i++) {  // boucle pour lire les derniers événements
  $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i]['title'];  // titre de l'événement sous format "description | date heure | nom de caméra"
  $movement_title = before ('|',$event);
  $date = between('|','|',$event);
  $camera=after_last ('|',$event);
   switch ($movement_title[1]) {  // définit la classe de l'événement pour afficher le bon pictogramme via le widget Presence Netatmo
    case 'P' : 
       $icon = 'human';
       break;
    case 'A' : 
       $icon = 'animal';
       break;
    case 'V' :
       $icon = 'car';
       break;
     default :
      $icon = 'human';
   }   
  $NextEventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i+1]["event_id"];	
  $eventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i]["event_id"];	
  $j = $i;
  $vignette = $snapshot = $vignetteIMG = '';
 if ( $NextEventID == $eventID ) {                        		        // s'il y a des sub_events
  while ( $NextEventID == $eventID ) {  					// tant qu'il y a des sub_events
  $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]['title'];
  $date_event = between('|','|',$event);
  $movement = before ('|',$event);

  $vignette = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["vignetteURL"];
    if (strstr($vignette,'vod')) {
       $videoURL = before ('vod', $vignette).'command/dl'.between('vod','/events',$vignette).'&filename_'.$date[1].$date[2].'_'.$date[4].$date[5].'_'.$date[7].$date[8].$date[9].$date[10].'_'.$date[12].$date[13].'_'.$date[15].$date[16].'.mp4';
        }
    else {$videoURL = $snapshot;}
  $snapshot = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["snapshotURL"];
  $eventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["event_id"];
  $NextEventID = $_NAcams->getOutdoorEvents('all',$numberofevents+1)[$j+1]["event_id"];
  if (strstr($vignette,'getcamera')) {    // si $vignette contient 'getcamera' il s'agit d'un lien vers une image 
           $vignetteIMG=$vignetteIMG.'<a href='.$snapshot.' target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'" /> </a>';
                 }
  if (strstr($vignette,'vod')) {         // si $vignette contient 'vod' il s'agit d'un lien vers une vidéo
      $vignetteIMG=$vignetteIMG.'<a href="/plugins/script/core/ressources/netatmo/openvideo.php?videoURL='.$videoURL.'&imageURL='.$snapshot.'" target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'"/> </a>';
                 }
   
  if (!strstr($vignette,'vod') && !strstr($vignette,'getcamera'))  {   // sinon la caméra n'a pas accès à la video ou à l'image - la caméra est sans doute éteinte
    $vignetteIMG=$vignetteIMG.'<img src="plugins/widget/core/template/dashboard/cmd.info.string.Presence/img/camera_off.png" />';
  }
  
  $j++;
  }
 }
  
  else {											// s'il n'y a pas de subevent, il n'y a qu'un événement à afficher 
      $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]['title'];
  $date_event = between('|','|',$event);
  $movement = before ('|',$event);

  $vignette = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["vignetteURL"];

    if (strstr($vignette,'vod')) {
  $videoURL = before ('vod', $vignette).'command/dl'.between('vod','/events',$vignette).'&filename_'.$date[1].$date[2].'_'.$date[4].$date[5].'_'.$date[7].$date[8].$date[9].$date[10].'_'.$date[12].$date[13].'_'.$date[15].$date[16].'.mp4';
        }
    else {$videoURL = $snapshot;}
  $snapshot = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["snapshotURL"];


  if (strstr($vignette,'getcamera')) {
           $vignetteIMG=$vignetteIMG.'<a href='.$snapshot.' target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'" /> </a>';
                 }
  if (strstr($vignette,'vod')) {
      $vignetteIMG=$vignetteIMG.'<a href="/plugins/script/core/ressources/netatmo/openvideo.php?videoURL='.$videoURL.'&imageURL='.$snapshot.'" target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'"/> </a>';
                 }
   
  if (!strstr($vignette,'vod') && !strstr($vignette,'getcamera'))  {
    $vignetteIMG=$vignetteIMG.'<img src="plugins/widget/core/template/dashboard/cmd.info.string.Presence/img/camera_off.png" />';
  }
  }
  $i = $j;
 
  $result = $result.'<ul>
      <li>
        <div class="time">'.$date.'</div>
        <div class="'.$icon.'"></div>
        <div class="desc">
          <h3>'.$camera.'</h3>
          <h4>'.$movement_title.' </h4>
          <div class="image_cam">'.$vignetteIMG.'</div>
        </div>
      </li>
    </ul>';


}

$result = $result.'</div> ';

  
echo $result;







function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };

    function after_last ($this, $inthat)
    {
        if (!is_bool(strrpos($inthat, $this)))
        return substr($inthat, strrpos($inthat, $this)+strlen($this));
    };

    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };

    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrpos($inthat, $this));
    };

    function between ($this, $that, $inthat)
    {
        return before ($that, after($this, $inthat));
    };

    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };
?>
Pour terminer, j'ai créé le widget pour afficher les infos :

Code : Tout sélectionner

<div  style = "width:1000px;min-height:1400px" class="tooltips cmd cmd-widget" data-type="info" data-subtype="other" data-cmd_id="#id#" title="#collectDate#">
  
    <div class="DisplayPresence#id#">
	#state#
    </div>
</div>

<style>  
.settings {
    width: 100%;
    vertical-align: top;
  }
.timeline h3 {
    font-size: 1.5em;
    font-weight: 400;
    margin: 0;
    vertical-align: left;
  }
  
 .timeline h4 {
    margin: 0;
    font-size: 1em;
    font-weight: 400;
    color: #eeeeee;
    vertical-align: left;
  }
.timeline   ul {
    padding: 1em 0 0 2em;
    margin: 0;
    list-style: none;
    position: relative;
    

  }
 
.timeline  li div{
    display: inline-block;
    margin: 2em 0;
    vertical-align: top;
  }
  
.human  {
    width: 40px;
    height: 40px;
    background : url('plugins/widget/core/template/dashboard/cmd.info.string.Presence Netatmo/img/human.png');
    background-repeat: no-repeat;
    }

  
 
 
 .animal  {
    width: 40px;
    height: 40px;
    background : url('plugins/widget/core/template/dashboard/cmd.info.string.Presence Netatmo/img/animal.png');
    background-repeat: no-repeat;
    }
    
.car  {
    width: 40px;
    height: 40px;
    background : url('plugins/widget/core/template/dashboard/cmd.info.string.Presence Netatmo/img/car.png');
    background-repeat: no-repeat;
    }
    
.movement  {
    width: 40px;
    height: 40px;
    background : url('plugins/widget/core/template/dashboard/cmd.info.string.Presence Netatmo/img/movement.png');
    background-repeat: no-repeat;
    }

  
.time {
    width: 80px;
    font-size: 1em;
    padding-top: 0em;
  }
  
.desc {
    width: 65%;
  }
  

  
.image_cam img{
    width: 75px;
    height: 75px;
    border-radius: 50%;
    margin-left: 0.5em;
    margin-top : 0.5em;
  }



</style>
et voici les images associées au widget :


camera_off.png
camera_off.png (64.73 Kio) Consulté 8627 fois
animal.png
animal.png (1.11 Kio) Consulté 8627 fois
Dernière édition par damanujan le 05 nov. 2017, 09:31, édité 3 fois.

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 18:43

suite des images pour le widget:
movement.png
movement.png (1.01 Kio) Consulté 8626 fois
human.png
human.png (1.27 Kio) Consulté 8626 fois
car.png
car.png (1.11 Kio) Consulté 8626 fois
Dernière édition par damanujan le 25 juin 2017, 19:18, édité 2 fois.

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 18:45

Attention qu'il faut spécifier le nom de la caméra et le nombre d'événements que l'on veut afficher au bout de la ligne du script...

Type
/var/www/html/plugins/script/core/ressources/netatmo/presence_last_event.php <nom de la caméra> <nombre>

presence_script_last_event.JPG
presence_script_last_event.JPG (39.43 Kio) Consulté 8622 fois


A savoir:

Quand le curseur passe sur les images, il affiche le type d'événement déclencheur et la date.
Quand on clique sur l'image, le navigateur ouvre une fenêtre pour soit afficher l'image en grand, soit lire la vidéo associée.
Dernière édition par damanujan le 25 juin 2017, 19:19, édité 2 fois.

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 18:48

J'ai également créé un script pour :

- allumer ou éteindre les leds
- régler l'intensité des leds.
- mode surveillance On ou Off

Voici le script :

Code : Tout sélectionner

<?php
// Netatmo_set.php  Nom_de_la_camera   Type_d_action    Action 

$CameraName = $argv[1];
$action = $argv[2];
$variable = strtoupper($argv[3]);

require('Netatmo_login.php');  // connexion au compte Netatmo

switch ($action) {

 case 'led' :
	if ($variable == 'ON') {
      $_NAcams->setLightMode($CameraName, 'on');
      }
    if ($variable == 'OFF') {
      $_NAcams->setLightMode($CameraName, 'off');
    }
    if ($variable == 'AUTO') {
      $_NAcams->setLightMode($CameraName, 'auto');
    }
	break;

  case 'intensite' :
	$_NAcams->setLightIntensity($CameraName, intval($variable));
	break;

  case 'surveillance' :
    if ($variable == 'ON') {
      $_NAcams->setMonitoring($CameraName, 'on');
    }
    if ($variable == 'OFF') {
      $_NAcams->setMonitoring($CameraName, 'off');
    }
    
    
}



?>
Présence_settings.jpg
Présence_settings.jpg (13.23 Kio) Consulté 8625 fois

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 19:02

Au bout de la ligne du script, il faut mentionner le nom de la caméra suivi du type d'action suivi de l'action:

/var/www/html/plugins/script/core/ressources/netatmo/presence_set.php <Nom_Caméra> <Type_action> <action>

Type d'action :
- led
- surveillance
- intensite

Action:
on ou off pour led et surveillance
#slider# pour intensite
script1.JPG
script1.JPG (139.8 Kio) Consulté 8621 fois
script2.JPG
script2.JPG (36.78 Kio) Consulté 8621 fois

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 19:06

Dans les paramètres de chaque action, j'ai ajouté dans : 'Action après exécution de la commande', la commande 'rafraichir' du script Presence_last_event
afin que les données soient actualisées à chaque fois que l'on actionne les commandes Led ou Surveillance ou Intensité
Pièces jointes
action.JPG
action.JPG (98.97 Kio) Consulté 8619 fois

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 25 juin 2017, 19:13

Petite astuce:
désactiver l'option 'notification de connexion au compte' dans votre application Android, sinon vous aurez une multitude d'email et de notifications de 'nouvelle connexion à votre compte Netatmo'...

Networks514
Actif
Messages : 578
Inscription : 02 sept. 2016, 22:22

Re: Script Caméra Netatmo Présence

Message par Networks514 » 26 juin 2017, 00:42

Super merci à toi pour le partage. Est utilisé uniquement le script pour activer ou désactiver la surveillance et ça marche nickel.
Je testerai la suite demain !
Networks514
Jeedom / Synology DS411j / Synology DS916+8G / Rpi3 / Zibase
Zwave / Enocean / Rflink / Xiaomi / Bluetooth

Networks514
Actif
Messages : 578
Inscription : 02 sept. 2016, 22:22

Re: Script Caméra Netatmo Présence

Message par Networks514 » 26 juin 2017, 03:24

Bon finalement, le marchand de sable m'ayant oublié ce soir , j'ai continué
Tout est nickel sauf pour la lecture d'une vidéo, j'ai ce message :
The requested URL /plugins/script/core/ressources/netatmo/openvideo.php was not found on this server

Tu as ce fichier chez toi ?

Et est t'il possible de partager ton widget avec la caméra et ton slider pour l'intensité !

Un grand merci, je viens de recevoir cette caméra et ça m'ennuyer de ne pouvoir l'intégrer ...happy now
Networks514
Jeedom / Synology DS411j / Synology DS916+8G / Rpi3 / Zibase
Zwave / Enocean / Rflink / Xiaomi / Bluetooth

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 09:14

Oups... j'ai oublié de donner le code du fichier : openvideo.php (à placer dans le même répertoire que les autres fichiers du script)

Code : Tout sélectionner

<?php
$videoURL = $_GET['videoURL'];
$imageURL = $_GET['imageURL'];
if (strstr($videoURL,'command/dl')){
  echo 
  '<video width="800" controls autoplay preload="none" poster="'.$imageURL.'">
  <source src="'.$videoURL.'" type="video/mp4" >
 
  Your browser does not support HTML5 video.
  </video>
';
  }

else {
 echo $videoURL;
}

?>
Voilà qui est fait... :D

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 09:25

Widget pour allumer/éteindre les leds:

de type Action/défaut:

Code : Tout sélectionner

<div class="cmd tooltips cmd-widget cursor OnOff#id#" data-type="action" data-subtype="default" data-cmd_id="#id#">
  	<center>
     
        <span style="font-size: 2.5em;" class="action_OnOff#id#" id="iconCmd#id#"></span>
    </center>
<style>
  
div.OnOff#id# {
    margin-top : 0px;
 	min-width:80px;
  	min-height:80px;
}
  
img.OnOffImg#id# {
	width: 100px;

}

span.cmdName#id# {
  	font-weight: bold;
  	font-size : 12px;
}
 
  
</style>

<script>

  	if (jeedom.cmd.normalizeName('#name#') == 'on') {
 		$('#iconCmd#id#').append('<img src="plugins/widget/core/template/dashboard/cmd.action.other.Presence_Led/led_off.png" class="OnOffImg#id#" />');
		
          	if ('#state#' == 'on') {
            	$('.cmd[data-cmd_id=#id#]').hide();
        	}
        
}
 

  
        if (jeedom.cmd.normalizeName('#name#') == 'off') {
 		$('#iconCmd#id#').append('<img src="plugins/widget/core/template/dashboard/cmd.action.other.Presence_Led/led_on.png" class="OnOffImg#id#"/>');
		
			if ('#state#' == 'off') {
        	    $('.cmd[data-cmd_id=#id#]').hide();
        	}
        
}
$('.cmd[data-cmd_id=#id#] .action_OnOff#id#').off();

$('.cmd[data-cmd_id=#id#] .action_OnOff#id#').on('click', function() {
	jeedom.cmd.execute({id: '#id#'});
});
</script>
</div>
avec les fichiers images suivants :

led_on.png
led_on.png
led_on.png (32.47 Kio) Consulté 8573 fois

led_off.png
led_off.png
led_off.png (37.66 Kio) Consulté 8573 fois

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 09:29

Widget pour activer/désactiver la surveillance:

de type Action/défaut

Code : Tout sélectionner

<div class="cmd tooltips cmd-widget cursor OnOff#id#" data-type="action" data-subtype="default" data-cmd_id="#id#">
  	<center>
     
        <span style="font-size: 2.5em;" class="action_OnOff#id#" id="iconCmd#id#"></span>
    </center>
<style>
  
div.OnOff#id# {
    margin-top : 0px;
 	min-width:80px;
  	min-height:80px;
}
  
img.OnOffImg#id# {
	width: 50px;

}

span.cmdName#id# {
  	font-weight: bold;
  	font-size : 12px;
}
 
  
</style>

<script>

  	if ('#name#'== 'Surveillance on') {
 		$('#iconCmd#id#').append('<img src="plugins/widget/core/template/dashboard/cmd.action.other.Presence_Surveillance/cam_off.png" class="OnOffImg#id#" />');
		
          	if ('#state#' == 'on') {
            	$('.cmd[data-cmd_id=#id#]').hide();
        	}
        
}
 

  
        if ( '#name#' == 'Surveillance off') {
 		$('#iconCmd#id#').append('<img src="plugins/widget/core/template/dashboard/cmd.action.other.Presence_Surveillance/cam_on.png" class="OnOffImg#id#"/>');
		
			if ('#state#' == 'off') {
        	    $('.cmd[data-cmd_id=#id#]').hide();
        	}
        
}
$('.cmd[data-cmd_id=#id#] .action_OnOff#id#').off();

$('.cmd[data-cmd_id=#id#] .action_OnOff#id#').on('click', function() {
	jeedom.cmd.execute({id: '#id#'});
});
</script>
</div>
avec les images suivantes :

cam_on.png
cam_on.png
cam_on.png (852 octets) Consulté 8572 fois
cam_off.png
cam_off.png
cam_off.png (1.66 Kio) Consulté 8572 fois

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 09:59

2 petits scripts en bonus:

Pour afficher l'état des led:

presence_Led.php

Code : Tout sélectionner

<?php
$Camera = $argv[1];
if (!$Camera) { exit('Nom de la caméra manquant') ;}
require('Netatmo_login.php');  // connexion au compte Netatmo
$settings = $_NAcams->getCameraSettings($Camera)['light']['mode'];
echo $settings;
 
?>
Il faut spécifier le nom de la caméra au bout de la ligne :

/var/www/html/plugins/script/core/ressources/netatmo/presence_Led.php <nom_caméra>


Pour afficher l'état de la surveillance:

Presence_Surveillance.php

Code : Tout sélectionner

<?php
$camera = $argv[1];
if (!$camera) { exit('Nom de la caméra manquant') ;}
require('Netatmo_login.php');  // connexion au compte Netatmo
$settings = $_NAcams->getCameraSettings($camera)['status'];
echo $settings;
?>
idem, il faut spécifier le nom de la caméra

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 20:38

Nouveau widget proposé:
widget.JPG
widget.JPG (45.63 Kio) Consulté 8548 fois
Quand on clique sur la ligne, le script affiche les vignettes demandées...


Pour cela, il faut:

- garder les fichiers NetatmoCameraAPI.php , Netatmo_login.php et openvideo.php
- changer le code de presence_last_event.php:

Code : Tout sélectionner

<?php

// Basé sur l'API postée par KiboOst
// https://github.com/KiboOst/php-NetatmoCameraAPI


$Camera = $argv[1];  // Nom de la camera
$numberofevents = intval($argv[2]); // Nombre d'événements
if (!$numberofevents) {
  $numberofevents = 20;
}

require('Netatmo_login.php');  // connexion au compte Netatmo


// Settings 
$IMGpath='<img width="15" src="plugins/widget/core/template/dashboard/cmd.info.string.Netatmo_Presence/';
$ICONpath='<img width="35" src="plugins/widget/core/template/dashboard/cmd.info.string.Netatmo_Presence/';

$settings = $_NAcams->getCameraSettings($Camera); // récupère les données de la caméra
$status = $settings ['status'];
$SDstatus = $settings ['sd_status'];
$alim = $settings['alim_status'];
$light_mode_status = $settings['light_mode_status'];
$intensity = $settings['light']['intensity'];
$is_local = $settings['is_local'];
$error_status = $settings['error_status'];
$audio = $settings['audio'];


$result = '<div style="text-align: left;">'.$IMGpath.$alim.'.png">Alimentation   <br/>'.$IMGpath.$status.'.png">Surveillance  <br/>'.$IMGpath.$SDstatus.'.png">Carte SD<br/>';
$result = $result.$IMGpath.$light_mode_status.'.png">Eclairage<br/>'.$IMGpath.$audio.'.png">Audio<br/>Intensité Led ='.$intensity.' <br/>';
$result = $result.'En local : '.$is_local.'<br/>'.$error_status.'<br/></div>';


// TimeLine
$result = $result.'<div id="content#id#"><ul class="timeline">';

for ($i=0 ; $i <= $numberofevents ; $i++) {  // boucle pour lire les derniers événements
  $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i]['title'];  // titre de l'événement sous format "description | date heure | nom de caméra"
  $movement_title = before ('|',$event);
  $date = between('|','|',$event);
  $camera=after_last ('|',$event);
   switch ($movement_title[0]) {  // définit la classe de l'événement pour afficher le bon pictogramme via le widget Netatmo_Presence
    case 'P' : 
       $icon = 'human';
       break;
    case 'A' : 
       $icon = 'animal';
       break;
    case 'V' :
       $icon = 'car';
       break;
     default :
      $icon = 'movement';
   }   
  $NextEventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i+1]["event_id"];	
  $eventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$i]["event_id"];	
  $j = $i;
  $vignette = $snapshot = $vignetteIMG = '';
 if ( $NextEventID == $eventID ) {                        		        // s'il y a des sub_events
  while ( $NextEventID == $eventID ) {  					// tant qu'il y a des sub_events
  $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]['title'];
  $date_event = between('|','|',$event);
  $movement = before ('|',$event);

  $vignette = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["vignetteURL"];
    if (strstr($vignette,'vod')) {
       $videoURL = before ('vod', $vignette).'command/dl'.between('vod','/events',$vignette).'&filename_'.$date[1].$date[2].'_'.$date[4].$date[5].'_'.$date[7].$date[8].$date[9].$date[10].'_'.$date[12].$date[13].'_'.$date[15].$date[16].'.mp4';
        }
    else {$videoURL = $snapshot;}
  $snapshot = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["snapshotURL"];
  $eventID = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["event_id"];
  $NextEventID = $_NAcams->getOutdoorEvents('all',$numberofevents+1)[$j+1]["event_id"];
  if (strstr($vignette,'getcamera')) {    // si $vignette contient 'getcamera' il s'agit d'un lien vers une image 
           $vignetteIMG=$vignetteIMG.'<a href='.$snapshot.' target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'" /> </a>';
                 }
  if (strstr($vignette,'vod')) {         // si $vignette contient 'vod' il s'agit d'un lien vers une vidéo
      $vignetteIMG=$vignetteIMG.'<a href="/plugins/script/core/ressources/netatmo/openvideo.php?videoURL='.$videoURL.'&imageURL='.$snapshot.'" target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'"/> </a>';
                 }
   
  if (!strstr($vignette,'vod') && !strstr($vignette,'getcamera'))  {   // sinon la caméra n'a pas accès à la video ou à l'image - la caméra est sans doute éteinte
    $vignetteIMG=$vignetteIMG.'<img src="plugins/widget/core/template/dashboard/cmd.info.string.Presence/img/camera_off.png" />';
  }
  
  $j++;
  }
 }
  
  else {											// s'il n'y a pas de subevent, il n'y a qu'un événement à afficher 
      $event = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]['title'];
  $date_event = between('|','|',$event);
  $movement = before ('|',$event);

  $vignette = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["vignetteURL"];

    if (strstr($vignette,'vod')) {
  $videoURL = before ('vod', $vignette).'command/dl'.between('vod','/events',$vignette).'&filename_'.$date[1].$date[2].'_'.$date[4].$date[5].'_'.$date[7].$date[8].$date[9].$date[10].'_'.$date[12].$date[13].'_'.$date[15].$date[16].'.mp4';
        }
    else {$videoURL = $snapshot;}
  $snapshot = $_NAcams->getOutdoorEvents('all',$numberofevents)[$j]["snapshotURL"];


  if (strstr($vignette,'getcamera')) {
           $vignetteIMG=$vignetteIMG.'<a href='.$snapshot.' target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'" /> </a>';
                 }
  if (strstr($vignette,'vod')) {
      $vignetteIMG=$vignetteIMG.'<a href="/plugins/script/core/ressources/netatmo/openvideo.php?videoURL='.$videoURL.'&imageURL='.$snapshot.'" target="_blank"> <img src="'.$vignette.'" title="'.$movement.' '.$date_event.'"/> </a>';
                 }
   
  if (!strstr($vignette,'vod') && !strstr($vignette,'getcamera'))  {
    $vignetteIMG=$vignetteIMG.'<img src="plugins/widget/core/template/dashboard/cmd.info.string.Presence/img/camera_off.png" />';
  }
  }
  $i = $j;
 
  $result = $result.'

<li class="event">
      <div class="member-infos">
        <div class="cam_event#id# member-title">'.$ICONpath.$icon.'.png">
	<div class="title">'.$date.'  |  '.$movement_title.'</div></div>
        <div class="member-parameters">'.$camera.'<br/>
	<div class="image_cam"><span="follow">'.$vignetteIMG.'</span></div>
	</div>


      </div>
</li>





';


}

$result = $result.'</ul></div>
<script>
$(".member-title").click(function(e) {
  console.log("Clicked");
  $(this).next().slideToggle();
  $(this).next().next().next().slideToggle();

})

</script> ';

  
echo $result;







function after ($this, $inthat)
    {
        if (!is_bool(strpos($inthat, $this)))
        return substr($inthat, strpos($inthat,$this)+strlen($this));
    };

    function after_last ($this, $inthat)
    {
        if (!is_bool(strrpos($inthat, $this)))
        return substr($inthat, strrpos($inthat, $this)+strlen($this));
    };

    function before ($this, $inthat)
    {
        return substr($inthat, 0, strpos($inthat, $this));
    };

    function before_last ($this, $inthat)
    {
        return substr($inthat, 0, strrpos($inthat, $this));
    };

    function between ($this, $that, $inthat)
    {
        return before ($that, after($this, $inthat));
    };

    function between_last ($this, $that, $inthat)
    {
     return after_last($this, before_last($that, $inthat));
    };

?>
- Toujours spécifier le nom de la caméra ainsi que le nombre d'événements :
presence_script_last_event.JPG
presence_script_last_event.JPG (39.43 Kio) Consulté 8560 fois
- changer de widget et l'appeler Netatmo_Presence (absolument choisir ce nom) de type info/autre

Code : Tout sélectionner

<div  style = "width:1000px;min-height:1400px" class="tooltips cmd cmd-widget" data-type="info" data-subtype="other" data-cmd_id="#id#" title="#collectDate#">
  
    <div class="DisplayPresence#id#">
	#state#
    </div>
</div>

<style>  



[class*="entypo-"] {
  width: 1em;
  height: 1em;
}


#settings#id# {
  width: 100%;
  position: relative;
  text-align: left;
}




.title {
  margin-left: 40px;
  margin-top: -35px;
  padding-bottom : 15px;
  border-bottom: 1px solid #777;
  

}




.timeline {
  border-left: 0.25em solid #00BCFB;
  background: rgba(255, 255, 255, 0.1);
  margin: 2em auto;
  line-height: 1.4em;
  padding: 1em;
  padding-left: 3em;
  list-style: none;
  text-align: left;
  border-radius: 0.5em;
  min-width: 22em;
}

.event {
  min-width: 20em;
  width: 100%;
  vertical-align: middle;
  box-sizing: border-box;
  position: relative;
}

.timeline .event:before,
.timeline .event:after {
  position: absolute;
  display: block;
  top: 1em;
}

.timeline .event:before {
  left: -15em;
  color: rgba(255, 255, 255, 0.8);
  content: attr(data-date);
  text-align: right;
  font-weight: 100;
  font-size: 0.9em;
  min-width: 9em;
}

.timeline .event:after {
  box-shadow: 0 0 0 0.2em #00BCFB;
  left: -3.5em;
  background: #C0C0C0;
  border-radius: 50%;
  height: 0.75em;
  width: 0.75em;
  content: "";
}

.timeline .event .member-location,
.timeline .event .member-parameters {
  display: none;
}

.timeline .event:last-of-type .member-location,
.timeline .event:last-of-type .member-parameters {
  display: block;
}

.member-infos {
  padding: 10px;
  text-align: left;
  position: relative;
}

.member-infos > h1 {
  font-weight: bold;
  font-size: 1.4em;
}

.member-location a:before {
  margin-right: 5px;
}

.member-location {
  text-indent: 2px;
}

.follow,
.options {
  width: 30px;
  height: 30px;
  text-align: center;
  line-height: 30px;
  background: #D3D3D3;
  text-shadow: 0 1px 0 rgba(255, 255, 255, 0.4);
  box-shadow: 0 2px 0 0 #C0C0C0;
  border-radius: 3px;
  display: inline-block;
}

.follow:hover,
.options:hover {
  box-shadow: 0 1px 0 0 #C0C0C0;
  box-sizing: border-box;
  vertical-align: bottom;
  margin-bottom: -1px;
}

.member-socials {
  display: inline-block;
  font-weight: bold;
  vertical-align: bottom;
  line-height: 8px;
  float: right;
}

.member-socials li {
  display: inline-block;
}

.shots-number,
.followers {
  font-weight: normal;
  display: block;
  margin-top: 10px;
  font-size: 0.9em;
}

.member-contact {
  position: absolute;
  right: 10px;
  top: 10px;
}

.member-contact li {
  display: inline-block;
  margin-left: 10px;
}

.member-shots-number {
  padding-right: 6px;
  border-right: 1px solid rgba(0, 0, 0, 0.06);
  margin-right: 6px;
  margin-left: 6px;
}


  
.image_cam img{
    width: 75px;
    height: 75px;
    border-radius: 50%;
    margin-left: 0.5em;
    margin-top : 0.5em;
  }
  

</style>

- importer les même fichiers images que pour le précédent widget et y ajouter ces deux-ci:

on.png
on.png
on.png (4.39 Kio) Consulté 8560 fois
Dernière édition par damanujan le 27 juin 2017, 10:13, édité 2 fois.

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 26 juin 2017, 20:40

... suite ...

off.png
off.png
off.png (3.58 Kio) Consulté 8560 fois
Pour ma part, je préfère cet affichage au précédent...

:D

Networks514
Actif
Messages : 578
Inscription : 02 sept. 2016, 22:22

Re: Script Caméra Netatmo Présence

Message par Networks514 » 26 juin 2017, 23:56

Merci ! plus sympa en effet !
Pour l'instant, je suis revenu en arrière pour ne garder que la partie commande led et surveillance, j'ai un pb et je ne sais si c'est lié aux scripts (forte suspicion sur presence_last_event.php ) , j'ai des process php qui prennent 100% et qui ne se terminent pas ... ça me bouffe toute la mémoire et le système tente de killer des process.
Je vais rester en observation avant de reprendre !
Dans l'attente, super taf !
Networks514
Jeedom / Synology DS411j / Synology DS916+8G / Rpi3 / Zibase
Zwave / Enocean / Rflink / Xiaomi / Bluetooth

Networks514
Actif
Messages : 578
Inscription : 02 sept. 2016, 22:22

Re: Script Caméra Netatmo Présence

Message par Networks514 » 29 juin 2017, 21:34

Salut Damanujan

Encore merci pour tes scripts. Pour l'instant je n'utilise que les actions sur la cameras
J'ai fait quelques modifs car lors tu passes le monitoring à off, tu ne peux plus visualiser le live

Du coup, je laisse toujours à on.

Dès que je suis détecté en dehors de la maison, je mets en route l'enregistrement et notification, et dès qu'une personne du foyer arrive, j'ignore toutes les détections

J'ai rajouté ceci dans le fichier presence_set.php

Code : Tout sélectionner

//set arrivee_maison	
//set Presence alert level for human detection:
//0: ignore, 1: record, 2: record and notify
  case 'arrivee_maison' :
    $_NAcams->setHumanOutAlert(0);
    $_NAcams->setAnimalOutAlert(0);
    $_NAcams->setVehicleOutAlert(0);
    $_NAcams->setOtherOutAlert(0);
	break;	

  case 'absence_maison' :
    $_NAcams->setHumanOutAlert(2);
    $_NAcams->setAnimalOutAlert(1);
    $_NAcams->setVehicleOutAlert(0);
    $_NAcams->setOtherOutAlert(0);
	$_NAcams->setMonitoring($CameraName, 'on');
	break;	
Merci à toi !!
Networks514
Jeedom / Synology DS411j / Synology DS916+8G / Rpi3 / Zibase
Zwave / Enocean / Rflink / Xiaomi / Bluetooth

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 30 juin 2017, 08:22

Bonjour Networks514,

Bien vu pour l'option 'présence à la maison'
Content que mon script ai pu t'aider.
Je te confirme aussi que mon 2e script d'affichage des derniers 'événements' associé au widget fonctionne correctement sans perte de temps ni routine php qui tourne en rond.
J'ai actualisé le cron à toutes les 5 minutes mais j'utilise également IFTTT qui rafraichit le script dès qu'il y a détection...

De mon côté, je suis curieux de savoir quel moyen tu utilises pour détecter ta présence à la maison.
Je suis en train de faire des tests:
- plugin réseau pour détecter le smartphone
- tasker smartphone à l'approche d'un signal wifi
mais il y a des retards d'une dizaine de secondes à parfois plus d'1 minute.
Je viens de commander un NUT mini pour l'utiliser avec BLEA mais je ne le reçois qu'aujourd'hui...

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 30 juin 2017, 12:23

@Networks514

Je pense que je viens de trouver quelque chose qui peut t'intéresser ainsi que d'autres...
Je pense avoir trouvé le flux video en provenance directe de la caméra, sans passer par le VPN Netatmo.

Il est de type:

http://<adresse IP locale de la caméra>/<code lié au VPN Netatmo>/live/index.m3u8

<code lié au VPN Netatmo> se trouve dans la variable "vpn" qui est de type:
https://v0.netatmo.net/<adresse vpn>/ <code lié au VPN Netatmo> / <2e code> ,,/

j'ai inséré ce lien dans le flux video de VLC et eureka, je visualise bien le flux vidéo de ma caméra.
Malgré tout, il faut que la caméra soit en mode surveillance et il y a toujours un décalage de quelques secondes...



A suivre
Dernière édition par damanujan le 30 juin 2017, 15:07, édité 1 fois.

damanujan
Timide
Messages : 144
Inscription : 20 oct. 2014, 19:21
Localisation : Belgique

Re: Script Caméra Netatmo Présence

Message par damanujan » 30 juin 2017, 15:05

dans le même ordre d'idée, pour visualiser les images via le plugin "camera" de jeedom, il suffit de créer une caméra de type Netatmo Welcome.
spécifier l'adresse locale, et placer dans l'url de capture :
/<code du vpn netatmo>/live/snapshot_720.jpg

Il me semble qu'il n'y a presque plus de décalage...

Répondre

Revenir vers « [Plugin officiel] Scripts »

Qui est en ligne ?

Utilisateurs parcourant ce forum : Aucun utilisateur inscrit et 4 invités