!!! 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.
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);
?>
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));
};
?>
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>