Foros Domótica Doméstica

Integracion Netatmo Presence con Eedomus con notificaciones instantáneas

Bueno,
pues tras mucho pegarme con la netatmo por fin he conseguido dar la utilidad a la cámara para lo cual la compré.
La idea cuando compre esta cámara es que enfoca el jardin trasero de mi casa, en cuanto detectase una persona en el jardin la domótica deberia de cerrar las persianas del piso de arriba que no tienen barrotes para protegerlas y es por donde roban en mi urbanización.

Que he probado antes?

Integracion propia de eedomus PErmite sacar una foto de la cámara y obtener los eventos de detección de la cámara (persona, animal o coche). No permite ver el video en directo (a mi eso no me hace falta, no me importa abrir la aplicacion especifica de netatmo). Además el verdadero problema es que las notificaciones de los eventos son realmente lentas, algunas me han tardado en llegar hasta media hora y lo tipico son hasta 10 minutos...descartado
Integracion via IFTT Permite solo sacar los eventos de detección la cámara (es lo único que yo necesito). no permite video. MEjora los tiempos de la integración directa de eedomus pero siguen siendo muy altos....minimo 50 segundos, típico 5 a 10 minutos.


Cómo lo he solucionado?
Netatmo ofrece una api para desarrolladores https://dev.netatmo.com/en-US/dev en la cual permite crear aplicaciones para todo su ecosistema de objetos conectados.
La idea es la siguiente, crear una aplicación de netatmo propia que utilice los webhooks que ofrece netatmo (un webhook no es mas que una llamada get que pasa como parametros RAW un json con el evento producido. Una ventaja que tiene este sistema es que pasa todos los eventos, no solo los de deteccion, con lo cual podemos detectar si encendemos la luz, si apagamos la camara....cualquier evento.
Una vez que se produce el evento la aplicacion de netamo creada por nosotros lanzara un webhook (o peticion web) contra la url que le hayamos configurado. Ahora solo nos queda recibir esa petición web en nuestro servidor web (nos va a ahcer falta un servidor web) y desde ahi lanzamos la peticion web en local contra el eedomus para ejecutar la accion que necesitemos.
una vez que ya tenemos la idea global procedamos a los pasos.



Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #1 en: Enero 29, 2019, 21:46:32 pm »
lo primero que tenemos que hacr es crear la aplicacion en netatmo.
Pello vamos a https://dev.netatmo.com/en-US y nos logamos con nuestro usuario  y password de netatmo.
arriba a la derecha tenemos el boton de create your app
una vez le damos tenemos que rellenar los datos de nuestra app. En esta primera hoja de datos de nuestra app son simples datos administrativos, asi que rellenais lo que os venga bien.
Una vez guardados los cambios ya aparece los TECHNICAL PARAMETERS
ahi es donde esta la chicha (la poca que tiene esto....)
primero, Webhook URL....
es la URL que netatmo llamará cuando suceda un evento.
Es la URL de nuestro servidor web que nos tenemos que preocupar de montar(tiene que soportar php para el ejemplo que vamos a hacer)
ademas ha de ser una ip publica, como consejo utilizar algun servicio de dns dinamica para que no tengais que contratar una ip fija en vuestra casa.
El servidor de PHP está dentro de la misma red que mi eedomus. Esto es así por varias razones. pero sobre todo porque cuando reciba la petición el servidor, este, la va a enviar rápidamente por la API local de eedomus que es más rápida que la de internet. Además la API local sí que funciona aunque no tengas cuenta premium.
por ejemplo un valor para esa webhook seria
http://micasa.dyndns.org/alert.php.

micasa.dyndns.org seria la direccion de vuestro host.
alert.php sera el fichero de php que vamos a poner en nuestro server y que os inluyo en siguiente post.
Ademas dentro de la seccion TECHNICAL PARAMETERS hay dos valores que nos hacen falta.
Client id y Client secret. Son valores que genera netatmo y sirven para identificar a esta aplicación a la hora de asociar esta aplicación a nuestra cámara.
Dentro de de la web de netatmo no necesitamos hacer nada más.
Nos vamos a descargar los ejemplos de netatmo para asociar la aplicacion que acabamos de generar a nuestra cámara.

desde esta URL os descargais los ejemplos de netatmo
https://github.com/Netatmo/Netatmo-API-PHP

Ahora necesitamos descomprimir estos ejemplos dentro de nuestro servidor PHP para ejecutarlos.
Con estos ficheros lo que vamos a conseguir es asociar/registrar nuestra nueva aplicación creada con nuestra cuenta de usuario de netatmo (se supone que esta aplicación que has diseñado se la podría instalar cualquier persona).

Hay ciertas consideraciones a tener en cuenta:
1. Si no registras la aplicacion con tu cuenta el webhook nunca funcionará.
2. La url que hemos puesto de nuestro server puede ser http o https, pero en http solo nos funcionará a nosotros mismos, ya que netatmo solo permite el uso de webhook sobre http para el propio creador de la app.

« Última modificación: Enero 30, 2019, 07:41:48 am por wipillo »

Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #2 en: Enero 29, 2019, 21:46:49 pm »
Descomprimimos los ficheros de ejemplo en php de Netatmo.
aparecen dos carpetas "examples" y "src"
dentro de examples tenemos los ficheros que necesitamos
los dos ficheros importantes son el Config.php y el WEB_AuthorizationGrant_Example.php
Atención, no borres los ficheros de la carpeta SRC porque se incluyen desde el fichero WEB_AuthorizationGrant_Example.php, con lo que si los borras no funcionarían.
Rellenamos los siguientes parametros en el config.php
$client_id = el client id de nuestra aplicacion que recogimos en la seccion TECHNICAL PARAMETERS
$client_secret = el client secret que recogimos en la seccion TECHNICAL PARAMETERS;
$test_username = nuestro usuario de netatmo
$test_password = nuestra password de netatmo.


una vez tenemos rellenos los datos del config simplemente ejecutaremos desde nuestro servidor web la url del WEB_AuthorizationGrant_Example.php, es decir,
http://nuestroservidorlocal/examples/WEB_AuthorizationGrant_Example.php
Esto nos terminara saliendo un mensaje de solicitud de autorizacion de netatmo. Lo que estamos haciendo es decirle a netatmo que asocie nuestra nueva app a nuestra cuenta de usuario.
Para comprobar que hemos hecho correctamente este paso debemos de entrar en nuestra cuenta de netatmo -> pestaña security -> mi cuenta (arriba a la derecha)-> configuracion -> mis aplicaciones de terceros (abajo de todo)
ahi deberia de aparecer el nombre de la aplicacion que hemos creado.


Ya tenemos registrada nuestra aplicacion con nuestra cuenta.
A partir de este momento cuando nuestra camara genere una notificacion nos mandara una web request a nuestro server.


ahora solo queda recibir la web request y hacer la accion que creamos conveniente.

los ficheros descargados de la web de NETATMO deberian de ser borrados y quitarlos de nuestro servidor.

« Última modificación: Enero 30, 2019, 08:46:28 am por wipillo »

Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #3 en: Enero 29, 2019, 21:47:07 pm »
Ahora toca los ficheros hecho por mi para recibir la peticion web
lo he hecho bastante simple....por un lado el fichero de configuracion:
config.php
Código: [Seleccionar]
<?php

    
// DATOS EEDOMUS
    
$api_user="******"//tu usuario de API de eedomus
    
$api_secret="********"//tu password de tu API de eedomus
    
$periph_id="1312070";   //el id del dispositivo que has creado apra recibir los eventos en eedomus

    
    //VALORES NETATMO
    
$home_id="5a5a5a5a5a5a5a5a5a5a5a5a5a";  //el id de tu casa....lo vas a poder obtener con el log que imprime este software
    
$camera_id "70:70:70:70:70"//la MAC de tu camara, la puedes obtener o de los logs o laseccion configuracion de la web de netatmo
    
    
    
$configapp['log']['general'] = "C:\\wamp64\\www\\logs\\netatmo_general.log"//la ruta dodne el php dejara los logs generales
    
$configapp['log']['events'] = "C:\\wamp64\\www\\logs\\netatmo_events.log";
            break; 
//la ruta dodne el php dejara los logs de eventos

?>




common.php
Código: [Seleccionar]
<?php

//funcion debug, pinta el texto si esta activado el debug

function logfile($texto,$logfile null,$excepcion=false,$dia=true){
global $debug,$configapp;
$fichero=($logfile==null?$configapp['log']['general']:$logfile);
if($dia){
$fp fopen($fichero.".".date("Y.m.d"), 'a');
}
else{
$fp fopen($fichero'a');
}             
//echo $fichero;
$backtracel="";
        if(
$excepcion){
foreach(debug_backtrace() as $k=>$v){
if($v['function'] == "include" || $v['function'] == "include_once" || $v['function'] == "require_once" || $v['function'] == "require"){
$backtracel .= "\t#".$k." ".$v['function']."(".$v['args'][0].") called at [".$v['file'].":".$v['line']."]\n";
$backtracelbr .= "#".$k." ".$v['function']."(".$v['args'][0].") called at [".$v['file'].":".$v['line']."]<br>";
}else{
$backtracel .= "\t#".$k." ".$v['function']."() called at [".$v['file'].":".$v['line']."]\n";
$backtracelbr .= "#".$k." ".$v['function']."() called at [".$v['file'].":".$v['line']."]<br>";
}
}
}
if($configapp['debug']['excepciones']==&& $excepcion){
echo "<br>".date("Y/m/d H:i:s")." ".$texto."<br>";
        echo $backtracelbr;
}
fwrite($fpdate("Y/m/d H:i:s")." ".$texto."\n".$backtracel);
fclose($fp);

}

?>


alert.php
Código: [Seleccionar]
<?php

include "config.php";
include 
"common.php";

//LOGAMOS LA PETICION PARA GUARDAR EN EL FICHERO TODAS LAS LLAMADAS A NUESTRO SERVICIO
//parte log generico
logfile("Registro de LLAMADA"$configapp['log']['general']);
logfile("IMPRESION GET "$configapp['log']['general']);
$var print_r($_GETtrue);
logfile($var$configapp['log']['general']);
logfile("IMPRESION POST "$configapp['log']['general']);
$var print_r($_POSTtrue);
logfile($var$configapp['log']['general']);
logfile("RAW_POST_DATA"$configapp['log']['general']);
logfile($HTTP_RAW_POST_DATA$configapp['log']['general']);
logfile("IMPRESION SERVER "$configapp['log']['general']);
$var print_r($_SERVERtrue);
logfile($var$configapp['log']['general']);

//RECOGEMOS EL JSON QUE ENVIA NETATMO
$peticion json_decode($HTTP_RAW_POST_DATA);
//COMPROBAMOS QUE SEA NUESTRO HOMEID Y NUESTRA CAMARA
if ($peticion->home_id == $home_id && $peticion->camera_id == $camera_id) {
    
//es una peticion hecha a la camara trasera
    
logfile("CAMARA TRASERA "$configapp['log']['events']);
    
logfile("Evento tipo " $peticion->event_type$configapp['log']['events']);
    
logfile("SubTipo " $peticion->sub_type$configapp['log']['events']);
    
logfile("Push Type " $peticion->push_type$configapp['log']['events']);
    
//SI EL EVENTO ES UNA DETECCION HUMAN LANZAMOS LA PETICION SOBRE EEDOMUS
    
if ($peticion->event_type == "human") {
        
//value 1 es human
        
$prueba file_get_contents("http://192.168.1.15/api/set?api_user=" $api_user "&api_secret=" $api_secret "&action=periph.value&periph_id=" $periph_id "&value=1");
    };

    
//
    //esto es para remoto
    //$prueba=file_get_contents("https://api.eedomus.com/set?api_user=" . $api_user . "&api_secret=" . $api_secret . "&action=periph.value&periph_id=1312070&value=2");
}
?>


« Última modificación: Enero 30, 2019, 08:55:04 am por wipillo »

Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #4 en: Enero 29, 2019, 21:47:28 pm »
Si os fijais el codigo es muy muy simple....
lo que hace es comprobar que nos llega en el json que manda netatmo....
comprueba que el home_id sea el mismo de nuestra casa y que el camera_id tambien sea el de nuestra casa.....ademas, si tenemos varias camaras podemos filtrar por el camera_id y hacer acciones diferentes en funcion de la camara que sea.
 
yo luego lo unico que  compruebo es el event_type, ya que a mi solo me interesa que se detecte un humano.....en ese caso lo que hago es poner un dispositivo virtual que tengo en eedomus a activado (luego ese mismo dispositivo tiene una regla que a los dos segundos se desactiva solo)
Si os fijais la peticion lo hace a traves de la ip local de mi eedoums ya que termina siendo mucho más rápido.


Bueno..si tenéis alguna duda me comentais....
espero que os haya ayudado.
« Última modificación: Enero 30, 2019, 09:16:10 am por wipillo »

Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #5 en: Enero 30, 2019, 18:42:21 pm »
Gracias por la currada  ;)
Como domotizar sin morir en el intento?

phroc

  • *****
  • 4894
  • Belle époque
    • Ver Perfil
    • Domótica Doméstica
Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #6 en: Enero 30, 2019, 20:28:44 pm »
¡Impresionante!

Mil gracias
Coming together is a beginning; keeping together is progress; working together is success - Henry Ford

http://www.domoticadomestica.com/
https://pr-domotica.es/

Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #7 en: Abril 17, 2019, 10:41:23 am »
Por cierto, una cosa que me ha tenido hoy una hora y media atascado.....
he cmabiado de servidor y he puesto otra url para el webhook que apunta a mi casa.
He entrado en dev.netatmo.com y he cambiado la URL del webhook y no me funcionaba ni para atrás...
seguia llamando a la URL antigua. Tras dar miles de vuelta he visto como solucionarlo.
Priemro de todo hay que desregistrar la aplicación de tu cuenta, para ello entra en la web de la camara normal y ve arriba a la derecha a "mi cuenta -> configuracion". Ahi, abajo del todo tendras una cosa que pone "aplicaciones de tercero".
En esa rama deberia aparecer la aplicaicon que hemos creado. Al seleccionarla aparece mas abajo un boton de "revocar acceso", pulsarlo.
La idea es que si cambias la web tienes que desasociar la aplicacion de tu cuenta y volver a asociarla, es decir, que despues de revocar el acceso a tu aplicacion hay que volver a hacer el proceso de registro descrito en el tutorial.
un saludo

JOSEM_

  • ***
  • 104
    • Ver Perfil
Re:Integracion Netatmo Presence con Eedomus con notificaciones instantáneas
« Respuesta #8 en: Abril 17, 2019, 18:05:10 pm »
Alucinante!!! tego mucho que aprender...