Aller au contenu
J3R3M

[VD+Scène] Netatmo Welcome

Recommended Posts

Bonjour à tous,

 

Jusqu'à peu, j'utilisais uniquement des requêtes fing (ping) pour détecter les différents téléphones de mon téléphone et ainsi en déduire la présence de quelqu'un ou non à mon domicile.

Seulement, ce n'était pas assez fiable et j'ai décidé de combiner cette solution à la Netatmo Welcome.

Après quelques recherches, je suis tombé sur ce topic du site Siio (également et heureusement disponible en anglais ici). C'est exactement ce que je recherchais!

Seulement, je l'ai modifié pour qu'il soit plus simple à à mettre en place et à utiliser au quotidien. Ainsi, il n'y a rien à faire à part modifier les variables vous concernant.

 

Pour utiliser le script original, il faut créer deux Variables Globales par personne identifiée dans la base de données de la Welcome, ce que je ne trouve pas très ergonomique et lourd.

Je précise qu'une très grande partie du script provient du lien précédent et je ne cherche pas à tirer la gloire de l'auteur original (BOOMX) de celui-ci malgré mes modifications.

Je l'ai modifiée comme je le souhaitais et ai traduit les debugs.

J'espère que cette scène vous sera utile et suis disponible pour répondre à vos éventuelles questions! :)

 

Exemple d'utilisation

 

Pour savoir si quelqu'un est présent d'après la Netatmo Welcome, il suffit d'utiliser un code comme-ci dans vos scènes et VD :

local pseudo = "Jérémy";
local VGNetatmo = "NETATMO_Welcome";
local table = json.decode(fibaro:getGlobalValue(VGNetatmo));
local presence = tonumber(table[pseudo].status);

if presence == 1 then
  fibaro:debug(pseudo.." est présent.");
else
  fibaro:debug(pseudo.." est absent.");
end

 

Réglages de la Scène Netatmo Welcome

 

Toutes les variables permettant de régler la scène sont au début de celle-ci. Après avoir saisi les bonnes informations, enregistrez et démarrez la scène manuellement. La scène est fonctionnelle !

NB : Ces paramètres étant envoyés via une requête HTTP, merci d'encoder les caractères spéciaux. Pour rappel : @ = %40

-- Informations de compte Netatmo
local client_id = 'Client_id';
local client_secret = 'Client_secret';
local username = 'Netatmo_username';
local password = 'Netatmo_pass';

-- Informations du VD associé
local vd_ID = 304;  -- ID du VD associé
local vd_refresh = 9; -- ID du bouton refresh du VD. 9 Par défaut

-- Réglages de la scène
local refresh = 10; -- Script executé toutes les x secondes. Pas moins de 8s!
local debug = 0; -- Faut-il vraiment l'expliquer ?

-- Nom de la Variable Globale qui sera créée et utilisée par la scène et le VD
local VGNetatmo = "NETATMO_Welcome";

 

Trouver ses Client ID & Client Secret

 

Pour obtenir vos client_id et client_secret, rendez-vous sur dev.netatmo.com et connectez-vous.

 

Cliquez sur CREATE YOUR APP et remplissez rapidement le formulaire. Les informations saisies importent peu!

 

1631545948_Capturedecran2018-08-08a16_28_04.thumb.png.db10b5a5944e8634b6a9adf3e72c3aeb.png

 

Une fois que vous aurez validé en cliquant sur le bouton SAVE, d'autres fenêtres apparaîtront en-dessous.

Celle qui nous intéresse et celle juste en-dessous. En effet, les informations Client id et Client secret sont dans la section Technical Parameters.

 

1181662342_Capturedecran2018-08-08a16_32_49.thumb.png.85e953a3ee5dfec79af220918c5354a2.png

 

Faites un copier/coller de ces informations dans les variables correspondantes et le tour est joué!

J'ai tellement ramé à les trouver que je me devais de vous dire où ces informations étaient dissimulées!

 

Limitations de l'API Netatmo

 

En ce qui concerne la variable refresh, il s'agit du délai entre chaque mise à jour des informations par la scène.

L'auteur explique très bien pourquoi il ne faut pas descendre en dessous des 8 secondes et je vais me contenter de traduire son explication.

Citation

 

Malheureusement, il y a une restriction de l'API. "Seulement" 2000 requêtes par heure peuvent être exécutées. Cela signifie que la scène peut uniquement être exécutée toutes les 4 secondes (60mn * 60s = 3600 secondes / 4 secondes de pause = 900 appels *2 = 1800 appels; la scène effectue deux appels API par exécution). Cependant, les tests effectués ont montré qu'un réglage de 4 secondes menait souvent à une erreur et rien n'était retourné par l'API. Le compte pour les appels API était bloqué.

Les tests effectués avec un réglage à 8 secondes ont donné de bons résultats. Dans le cas où vous auriez d'autres appareils connectés Netatmo sur votre compte Netatmo, merci de ne pas oublier que la Station Météo génère également des appels de l'API via le Plugin Fibaro ou lorsque vous utilisez le script "anemometer-script", des appels de l'API s'ajoutent également à ceux de cette scène.

 

 

 

VD Netatmo Welcome

 

23284786_screenshotvdnetatmo.thumb.png.735c1245c50edc9d7c6070d49e644af0.png

 

Pour personnaliser celui-ci, rendez-vous au début du code du bouton refresh :

-- Les pseudos doivent être exactement les mêmes que dans l'application Netatmo, séparés par une virgule
local pseudos = {"Jérémy","Emilie","Maman"};

-- Nombre de personnes à afficher dans le VD
-- Si modification, conserver la même structure de VD !
-- Et penser à modifier la variable "vd_refresh" de la scène Netatmo
local NbPersonnes = 3;

-- Variable Globale
local VGNetatmo = "NETATMO_Welcome";

Si vous souhaitez conserver seulement les informations de 3 personnes, il vous suffit de modifier uniquement les valeurs de la variable pseudos.

Attention, les pseudos doivent être rigoureusement les mêmes que ceux enregistrés dans Netatmo!

Si vous souhaitez afficher plus de 3 personnes, conservez obligatoirement la même structure du VD, c'est-à-dire en ajoutant 3 étiquettes dont les IDs seront incrémentés de +1 pour chaque nouvelle personne.

Pour information, le VD d'origine est beaucoup moins optimisé puisque vous devez modifier tout le code du bouton pour qu'il soit fonctionnel.
 

 

Scène Netatmo Welcome

Une seule instance autorisée. Démarrage Automatique

--[[
%% autostart
--]]

-- Informations de compte Netatmo
local client_id = 'Client_id';
local client_secret = 'Client_secret';
local username = 'Netatmo_username';
local password = 'Netatmo_pass';

-- Informations du VD associé
local vd_ID = 304;  -- ID du VD associé
local vd_refresh = 9; -- ID du bouton refresh du VD. 9 Par défaut

-- Réglages de la scène
local refresh = 10; -- Script executé toutes les x secondes. Pas moins de 8s!
local debug = 0; -- Faut-il vraiment l'expliquer ?

-- Nom de la Variable Globale qui sera créée et utilisée par la scène et le VD
local VGNetatmo = "NETATMO_Welcome";

--------------------------------------------------------------
-------- Ne rien modifier à partir de cette ligne ------------
--------------------------------------------------------------
local token = '';
local request_body = '';

Debug = function (color, message)
  if (debug == 1) then
    fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"));
  elseif (debug == 0) then
  end
end

DebugChange = function (color, message)
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"));
end

DebugError = function (color, message)
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"));
end

fibaro:debug('Démarrage du script Netatmo welcome Integration v.1.0');

if (debug == 0) then
  fibaro:debug("Debug = 0. Seuls les messages d'information apparaîtront dans les logs.");
else 
  fibaro:debug('Debug = 1. Messages de Debug activés.');
end

fibaro:debug('Cette scène sera executée toutes les ' ..refresh.. ' secondes.');

-- Début - Ajout pour gestion indépendante des VG
function CreerVG(VGNom, VGValeur)
  local data = {name = VGNom, value=VGValeur};
  response, status = api.post("/globalVariables", data);
  if (status == 201) then
    DebugError("white", "Variable Globale " .. VGNom .. " créée.");
  else
    DebugError("red", "Impossible de créer la Variable Globale " .. VGNom .. "!");
  end
end

function MajEntree(Nom, Statut, Lastseen)
  local table = json.decode(fibaro:getGlobalValue(VGNetatmo));

  -- Tout est à mettre à jour
  if Nom ~= nil and Statut ~= nil and Lastseen ~= nil then
    table[Nom] = {status=Statut, lastseen=Lastseen};
    fibaro:setGlobal(VGNetatmo,json.encode(table));
    DebugError("yellow", "L'entrée " .. Nom .. " a été automatiquement créée.");
  -- Mise à jour du Statut
  elseif Nom ~= nil and Statut ~= nil and Lastseen == nil then
    table[Nom].status = Statut;
    fibaro:setGlobal(VGNetatmo,json.encode(table));
    Debug("yellow", "Le statut de " .. Nom .. " a été mis sur la valeur ".. Statut);
  -- Mise à jour de la dernière vue de la personne
  elseif Nom ~= nil and Statut == nil and Lastseen ~= nil then
    table[Nom].lastseen = Lastseen;
    fibaro:setGlobal(VGNetatmo,json.encode(table));
    Debug("yellow", "L'information 'lastseen' de " .. Nom .. " a été mise sur la valeur ".. Lastseen);
  else
    DebugError("red", "Erreur lors de l'utilisation de la fonction MajEntree");
    if Nom == nil then DebugError("white", "Champ 'Nom' vide !"); end
    if Statut == nil then DebugError("white", "Champ 'Statut' vide !"); end
    if Lastseen == nil then DebugError("white", "Champ 'Lastseen' vide !"); end
  end
end

if fibaro:getGlobalValue(VGNetatmo) == nil then CreerVG(VGNetatmo,json.encode({})); end
-- Fin - Ajout pour gestion indépendante des VG

function oAuth(nextFunction)
  local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=read_camera';
  getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
    function(data) 
      if (data.access_token ~= nil) then
        token = data.access_token
      	gethomedata()
      else
        DebugError( "red", "Impossible de joindre l'API!");
      end
    end
    )
    setTimeout(oAuth, refresh*1000);
end

function getResponseData(url, body, func)
  local http = net.HTTPClient();
    http:request(url, { 
      options = { 
      method = 'POST', 
      headers = {['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'},
      data = body
      },
    success = function(response);
    func(json.decode(response.data));
  end
  })   
end

function gethomedata()
  request_body_cam = 'access_token=' ..token.. '';
  getResponseData('https://api.netatmo.net/api/gethomedata', request_body_cam, 
    function(getData)
      if (getData.body ~= nil) then
        for w, v in pairs(getData.body.homes) do
          for a, b in pairs(v.persons) do
            local INFOS = json.decode(fibaro:getGlobalValue(VGNetatmo));
        	if (b.pseudo ~= nil) then
             if (b.out_of_sight == false) then
                if INFOS[b.pseudo] ~= nil then
                  MajEntree(b.pseudo,nil,b.last_seen);
                  local change_var = tonumber(INFOS[b.pseudo].status);
                  if (change_var == 0) then
                     DebugChange("green", b.pseudo.. ' est présent.')
                     MajEntree(b.pseudo,1,nil);
                   else
                     Debug("white", b.pseudo.. ' est toujours présent.');
                   end 
                else
                  Debug("red", "L'entrée pour " ..b.pseudo.. " de la table "..VGNetatmo.." n'éxiste pas.");
                  MajEntree(b.pseudo,0,0);
                end
             else
                if INFOS[b.pseudo] ~= nil then
                  MajEntree(b.pseudo,nil,b.last_seen);
                  local change_var2 = tonumber(INFOS[b.pseudo].status);
                  if (change_var2  == 1) then
                     DebugChange( "orange", b.pseudo.. ' est absent.');
                     MajEntree(b.pseudo,0,nil);
                   else
                     Debug( "white", b.pseudo.. ' est toujours absent.');
                   end
                else
                  Debug("red", "L'entrée pour " ..b.pseudo.. " de la table "..VGNetatmo.." n'éxiste pas.");
                  MajEntree(b.pseudo,0,0);
                end
             end
          end
      	end
      end
    else 
        Debug("red", "Impossible de joindre l'API! Vérifier le taux de rafraichissemment!");
    end
  if tonumber(vd_ID) ~= nil then fibaro:call(vd_ID, "pressButton", vd_refresh); end
  end
 )
end

local sourceTrigger = fibaro:getSourceTrigger();
if (sourceTrigger["type"] == "autostart") then 
  oAuth();
end

 

Icones

 

netatmo_wel_icon.png.1a214863712f733f509083965697d746.pngnetatmo_wel_icon_refresh.png.42b8823d84cee7f9da01cbc251a70284.pngnetatmo_wel_app_icon.png.42df36d005d76d930c4ad4e7934ec2e5.pngnetatmo_wel_app_icon_refresh.png.dc8a7bef316055d2bc24651dcbb061f2.png

 

Téléchargement du VD

 

Netatmo_Welcome.vfib

Modifié par J3R3M
  • Like 2

Partager ce message


Lien à poster
Partager sur d’autres sites

Je viens de voir que le script original avait été évoqué sur ce sujet évoquant la Welcome lors de sa sortie.

Je n'avais pas lu toutes les pages du fil avant de poster celui-ci...

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonsoir @J3R3M

 

Excellent et merci ;-) beaucoup. 

Voila une autre  possibilité Netatmo ;-) 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×