Aller au contenu

Yagda - Yet Another Graphic Data Analyser (Netatmo - Vmc - Emoncms - Json Viewer)


Messages recommandés

Posté(e)

Bonjour,

Le but de ce tuto sera de faire une passerelle pour les données de la netatmo vers emoncms.

J'en ai profité pour améliorer le script php classique d'interface entre la netatmo et la HC2

les versions disponibles ot du mal à  gérer les installations netatmo avec plusieurs modules.

Ici j'ai cherché à  améliorer les choses et ça fonctionne même lorsque l'on a plusieurs master device et plusieurs stations additionnelles.

En effet, savoir l'ordre des modules renvoyé par netatmo dans ces conditions est un peur hard.

J'ai ajouté plusieures pages de résultats au script PHP: une avec un json viewer intégré et un qui retourne le json complet.

J'ai aussi optimisé pour minimiser le nombre de requêtes faites à  netatmo, histoire de ne pas se faire "jeter"

voici déjà  la présentation de la plateforme emon CMS très puissante que j'utilise depuis plus d'un an:

 

http://emoncms.org/site/home

http://emoncms.org/site/docs/visualisations

 

Personellement je l'utilise pour remonter mes graphiques de valeurs diverses de ma HC2

- températures

- consommations eau, gaz, elec

- paramètres de ma VMC (T° Vitesse, rendement etc.)

 

J'ai partagé mon script avec un ami et comme il était enchanté, je fais l'effort de le mettre ici aussi ;-)

 

En effet, il suffit de configurer les variables dans le VD, créer un répertoire /netatmo dans www ou web ou html, y mettre le PHP et le répertoire jsoneditor et c'est parti, les données seront remontées automatiquement à  emonCMS !

 

Voici déjà  le script côté HC2:

Je l'ai mis derrière un bouton, car dans un main loop, une corruption json quelquepart et c'est tout qui plante.

Ce bouton dont être cliqué via GEA ou autre scheduler toutes les 10 minutes.

Voici le Virtual Device tout fait:

Grosse mise à  jour à  ce post: http://www.domotique-fibaro.fr/index.php/topic/3929-yagda-yet-another-graphic-data-analyser-netatmo-vmc-emoncms-json-viewer/#entry63238

 

Netatmo_V2.vfib

 

post-826-0-81072700-1425122262_thumb.png

 

Attention, dans ce post ne figure que les scripts de la première version, voir plus loin dans le fil pour les versions suivantes !

-----------------------------------------------------------------------------------------
-- YAGDA - yet another graphic data analyser V2.01
-- Retreive Netatmo values for more than 2 modules, compute CO2 and push to EmonCMS
-- Sebastien Jauquet
-- Février 2015
-- Thanks to cedriclocqueneux, krikroff, i-magin and all contibutors to the netatmo code
-----------------------------------------------------------------------------------------

-- Instructions:
-- Create an free emoncms.org account
-- Retrieve your Write API Key from it
-- Create a Global variable (undefined) -> CO2_Max_Value to store the max value of CO2 of the house - if you dont need this, set CO2 to false (default: 0)
-- Install my netatmo.php in your webserver and write his address in the ip Address of this module
-- for each value you want to be pushed to emoncms, modify the section -- Push To EMONCMS -- below
-- Create a block scene or use gea to click this button each 10 minutes (to avoid rejection from the api of Netatmo)

local EmonCMS_Prefix = "NETATMO_" -- prefix of the id of the inpus to be created in emoncms (convenient for testing to not alter current feeds)
local PushToEmonCMS = true -- true = push to emoncms - false = do not push
local selfId = fibaro:getSelfId();
local thismodule=fibaro:getSelfId()
local domaine = fibaro:get(selfId, 'IPAddress')
local PushItem
local CO2_Max_Value_Local = 0 -- if you dont need this, set CO2 to false (default: 0)
local emoncms = Net.FHttp("emoncms.org",80)
local emoncms_api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -- your EMONCMS WRITE api Key

EmonCMS = {}; 
 
if (temperature_exterieure==nil) then temperature_exterieure = ""; end
if (humidite_exterieure==nil) then humidite_exterieure = ""; end

if (temperature_interieure==nil) then temperature_interieure = ""; end
if (humidite_interieure==nil) then humidite_interieure = ""; end
if (co2==nil) then co2 = ""; end
if (pression==nil) then pression = ""; end
if (bruit==nil) then bruit = ""; end

if (temperature_int_mod2==nil) then temperature_int_mod2 = ""; end
if (humidite_int_mod2==nil) then humidite_int_mod2 = ""; end
if (co2_mod2==nil) then co2_mod2 = ""; end

if (temperature_int_mod3==nil) then temperature_int_mod3 = ""; end
if (humidite_int_mod3==nil) then humidite_int_mod3 = ""; end
if (co2_mod3==nil) then co2_mod3 = ""; end

if (temperature_int_mod4==nil) then temperature_int_mod4 = ""; end
if (humidite_int_mod4==nil) then humidite_int_mod4 = ""; end
if (co2_mod4==nil) then co2_mod4 = ""; end 

if(refreshUI==nil) then -- Loads in memory only the first occurence
function refreshUI(ext, bruit, titre, tempmod, co2mod, humidmod, lastupdate, laststatus)
  fibaro:call(selfId,"setProperty","ui.ext.value",ext);
  fibaro:call(selfId,"setProperty","ui.bruit.value",bruit);  
  fibaro:call(selfId,"setProperty","ui.titre.value",titre);  
  fibaro:call(selfId,"setProperty","ui.tempmod.value",tempmod);  
  fibaro:call(selfId,"setProperty","ui.co2mod.value",co2mod);  
  fibaro:call(selfId,"setProperty","ui.humidmod.value",humidmod);  
  fibaro:call(selfId,"setProperty","ui.lastupdate.value",lastupdate);      
  fibaro:call(selfId,"setProperty","ui.laststatus.value",laststatus);   
end;
end

if(getExt==nil) then -- Loads in memory only the first occurence
function getExt(retry)
  retry = retry or 0
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo extérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=ext");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_exterieure = result.body[1].value[1][1] or "n.c";
        humidite_exterieure =result.body[1].value[1][2] or "n.c";
        -- variable globale pour info sms
        local msg = "Température extérieure : "..temperature_exterieure.."°C";
        fibaro:setGlobal("tempext", msg);
        return true;
      else
        fibaro:debug("Netatmo EXT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo EXT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo EXT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getInt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end
 
if(getInt==nil) then -- Loads in memory only the first occurence
function getInt(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=int");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_interieure = result.body[1].value[1][1] or "n.c";
        humidite_interieure = result.body[1].value[1][3] or "n.c";          
        co2 = result.body[1].value[1][2] or "n.c";
        pression = result.body[1].value[1][4] or "n.c";
        bruit = result.body[1].value[1][5] or "n.c";
        -- variable globale pour info sms
        fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod2==nil) then -- Loads in memory only the first occurence 
function getMod2(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod2");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod2 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod2 = result.body[1].value[1][2] or "n.c";          
        co2_mod2 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod2: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod2: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod2:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod3==nil) then -- Loads in memory only the first occurence 
function getMod3(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod3");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod3 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod3 = result.body[1].value[1][2] or "n.c";          
        co2_mod3 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod3: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod3: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod3:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod4==nil) then -- Loads in memory only the first occurence 
function getMod4(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod4");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod4 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod4 = result.body[1].value[1][2] or "n.c";          
        co2_mod4 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod4: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod4: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod4:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

function EmonCMS:Push(payloademon)
payloademon = "/input/post.json?json={" .. EmonCMS_Prefix .. payloademon .. "}&apikey=" .. emoncms_api_key
response, status, errorCode = emoncms:GET(payloademon);
fibaro:debug("Payload: " .. payloademon) ;
fibaro:debug("response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ;
fibaro:sleep(500);
end

local function main()
  -- retrieve values from netatmo.php
  local resInt, resExt, resMod2, resMod3, resMod4 = false, false, false, false, false;
  
  local status, err = pcall(function () resInt = getInt(); end);
  fibaro:debug("Récupération des données intérieures: " .. tostring(resInt));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end

  local status, err = pcall(function () resExt = getExt(); end);
  fibaro:debug("Récupération des données extérieures : " .. tostring(resExt));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end

  local status, err = pcall(function () resMod2 = getMod2(); end);
  fibaro:debug("Récupération des données intérieures Mod2: " .. tostring(resMod2));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  
  local status, err = pcall(function () resMod3 = getMod3(); end);
  fibaro:debug("Récupération des données intérieures Mod3: " .. tostring(resMod3));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  
  local status, err = pcall(function () resMod4 = getMod4(); end);
  fibaro:debug("Récupération des données intérieures Mod4: " .. tostring(resMod4));
  if (status == false) then
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  
  refreshUI(
    "Ext: "..temperature_exterieure.." °C - "..humidite_exterieure.." % - "..pression.." mbar", 
    "Bruit Rez: "..bruit.." dB",
	"Rez - Emilien - Thomas - Parents",
	temperature_interieure.." - "..temperature_int_mod2.." - "..temperature_int_mod3.." - "..temperature_int_mod4.." °C ",
    co2.." - "..co2_mod2.." - "..co2_mod3.." - "..co2_mod4.." ppm",
    humidite_interieure.." - "..humidite_int_mod2.." - "..humidite_int_mod3.." - "..humidite_int_mod4.." % ",
    os.date("%H:%M"),
    tostring(resInt).." "..tostring(resExt).." "..tostring(resMod2).." "..tostring(resMod3).." "..tostring(resMod4)
  );

-- Push To EMONCMS --
  if PushToEmonCMS == true then
	payloademon = "temperature_exterieure:"..temperature_exterieure
		EmonCMS:Push(payloademon);
	payloademon = "humidite_exterieure:".. humidite_exterieure
		EmonCMS:Push(payloademon);
	payloademon = "pression:".. pression
		EmonCMS:Push(payloademon);
	payloademon = "bruit:".. bruit
		EmonCMS:Push(payloademon);
	payloademon = "temperature_interieure_Rez:".. temperature_interieure
		EmonCMS:Push(payloademon);
	payloademon = "temperature_int_mod2_Emilien:".. temperature_int_mod2
		EmonCMS:Push(payloademon);
	payloademon = "temperature_int_mod3_Thomas:".. temperature_int_mod3
		EmonCMS:Push(payloademon);
	payloademon = "temperature_int_mod4_Parents:".. temperature_int_mod4
		EmonCMS:Push(payloademon);
	payloademon = "humidite_interieure_Rez:".. humidite_interieure
		EmonCMS:Push(payloademon);
	payloademon = "humidite_int_mod2_Emilien:".. humidite_int_mod2
		EmonCMS:Push(payloademon);
	payloademon = "humidite_int_mod3_Thomas:".. humidite_int_mod3
		EmonCMS:Push(payloademon);
	payloademon = "humidite_int_mod4_Parents:".. humidite_int_mod4
		EmonCMS:Push(payloademon);
	payloademon = "co2_Rez:".. co2
		EmonCMS:Push(payloademon);
	payloademon = "co2_mod2_Emilien:".. co2_mod2
		EmonCMS:Push(payloademon);
	payloademon = "co2_mod3_Thomas:".. co2_mod3
		EmonCMS:Push(payloademon);
	payloademon = "co2_mod4_Parents:".. co2_mod4
		EmonCMS:Push(payloademon);
  end

-- Compute Value MAX CO2 Maison (For VMC Speed VD)
  if CO2_Max_Value_Local == false then
	fibaro:debug("not calculating nor storing CO2 Max Value")
  else
	CO2_Max_Value_Local = co2
	if CO2_Max_Value_Local < co2_mod2 then CO2_Max_Value_Local = co2_mod2 end
	if CO2_Max_Value_Local < co2_mod3 then CO2_Max_Value_Local = co2_mod3 end
	if CO2_Max_Value_Local < co2_mod4 then CO2_Max_Value_Local = co2_mod4 end
	fibaro:setGlobal("CO2_Max_Value", CO2_Max_Value_Local )
	fibaro:debug("CO2_Max_Value: ".. CO2_Max_Value_Local )  
  end
end
 
main();
  • Upvote 5
Posté(e)

réservé PHP

 

Comme vous le remarquerez, ajouter une station modifie l'ordre des modules, ceci permettra de les retrouver facilement:

 

Permet de renvoyer les noms, id et ordre des modules disponibles sur l'API netatmo:

http://XXXXXXXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=names

permet de renvoyer le json de netatmo complet:

http://XXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=json

permet de renvoyer la liste de tous les modules sélectionnés:

http://XXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=selected_modules

permet de renvoyer les valeurs du module 3:

http://XXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=mod3

Exemple de requète pour la page avec le json viewer intégré:

http://XXXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=json_viewer

Capture d'écran du json viewer intégré, très pratique piour la première configuration et pour débugger !

 

post-826-0-97600400-1425121331_thumb.png

 

Voici le code php à  mettre sur votre serveur web dans un sous répertoire netatmo, le fichier s'appelant netatmo.php.

N'oubliez pas les permissions d'usage.

Voici le répertoire contenant le jsoneditor: jsoneditor.zip, à  décompresser dans un répertoire jsoneditor (dans le répertoire netatmo)

<?php
//ini_set('display_errors', false);
//set_exception_handler('ReturnError');

$parameter=$_GET['parameter'];
$password="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo password
$username="XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo username
$app_id = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo
$app_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo
$token_url = "https://api.netatmo.net/oauth2/token";
$postdata = http_build_query(
        array(
            'grant_type' => "password",
            'client_id' => $app_id,
            'client_secret' => $app_secret,
            'username' => $username,
            'password' => $password
    )
);
 
$opts = array('http' =>
    array(
        'method'  => 'POST',
        'header'  => 'Content-type: application/x-www-form-urlencoded',
        'content' => $postdata
    )
);
 
$context  = stream_context_create($opts);
$response = file_get_contents($token_url, false, $context);
 
$params = null;
$params = json_decode($response, true);
$api_url = "https://api.netatmo.net/api/getuser?access_token=" . $params['access_token'];
$requete = file_get_contents($api_url);
 
$url_devices = "https://api.netatmo.net/api/devicelist?access_token=" .  $params['access_token'];
$resulat_device = file_get_contents($url_devices);  
$json_devices = json_decode($resulat_device,true);
$json_objects = json_decode($resulat_device);
$module_interne = $json_devices["body"]["devices"][0]["_id"];
$module_externe = $json_devices["body"]["modules"][1]["_id"];
$module_interne2 = $json_devices["body"]["modules"][2]["_id"];
$module_interne3 = $json_devices["body"]["modules"][3]["_id"];
$module_interne4 = $json_devices["body"]["modules"][4]["_id"];

// --------------------- debuging -------------------------- //
if ($parameter == "json") {
echo  $resulat_device;
}
if ($parameter == "json_viewer") {
print('    
<html>
<style type="text/css">
    body {
      font: 11pt arial;
    }
    #jsoneditor {
      width: 800px;
      height: 2000px;
    }
</style>
<head>
    <title><YAGDA></title>
</head>
<body>
');
	echo "nombre de devices: " . count($json_devices["body"]["devices"]) . "<br>";
		for ($i = 0; $i <= count($json_devices["body"]["devices"]) - 1; $i++) {
			echo "Station Name: " . $json_devices["body"]["devices"][$i]["station_name"];
			echo " - Device No: " . $i ." id: " . $json_devices["body"]["devices"][$i]["_id"] . " Name: " . $json_devices["body"]["devices"][$i]["module_name"] . "<br>";
		}
	echo "<br>nombre de modules: " . count($json_devices["body"]["modules"]) . "<br>";
		for ($i = 0; $i <= count($json_devices["body"]["modules"]) - 1; $i++) {
			echo "Parent Device: " . $json_devices["body"]["modules"][$i]["main_device"];
			echo " - Module No: " . $i ." id: " . $json_devices["body"]["modules"][$i]["_id"] . " Name: " . $json_devices["body"]["modules"][$i]["module_name"] . "<br>";
		}

print('
<br>
<link rel="stylesheet" type="text/css" href="jsoneditor/jsoneditor.css"/>
<script src="jsoneditor/jsoneditor.js"></script>
<div id="jsoneditor"></div>
<script>
  var container = document.getElementById(\'jsoneditor\');
  var options = {
    mode: "view"
  };
  var json = ');

  echo $resulat_device;

  print('
  var editor = new jsoneditor.JSONEditor(container, options, json);
</script>
');
}
if ($parameter == "names") {
	echo "nombre de devices: " . count($json_devices["body"]["devices"]) . "<br>";
		for ($i = 0; $i <= count($json_devices["body"]["devices"]) - 1; $i++) {
			echo "Station Name: " . $json_devices["body"]["devices"][$i]["station_name"];
			echo " - Device No: " . $i ." id: " . $json_devices["body"]["devices"][$i]["_id"] . " Name: " . $json_devices["body"]["devices"][$i]["module_name"] . "<br>";
		}
	echo "<br>nombre de modules: " . count($json_devices["body"]["modules"]) . "<br>";
		for ($i = 0; $i <= count($json_devices["body"]["modules"]) - 1; $i++) {
			echo "Parent Device: " . $json_devices["body"]["modules"][$i]["main_device"];
			echo " - Module No: " . $i ." id: " . $json_devices["body"]["modules"][$i]["_id"] . " Name: " . $json_devices["body"]["modules"][$i]["module_name"] . "<br>";
		}

}
if ($parameter == "selected_modules") {
echo "Selected Modules: <br>";
echo "mod interne ----- (int): " . $module_interne . "<br>";
echo "mod externe ---- (ext): " . $module_externe  . "<br>";
echo "mod interne2 (mod2): " . $module_interne2 . "<br>";
echo "mod interne3 (mod3): " . $module_interne3 . "<br>";
echo "mod interne4 (mod4): " . $module_interne4 . "<br>";
}
if ($parameter == "int") {
$url_mesures_internes = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" . $module_interne . "&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last";
$mesures_internes = file_get_contents($url_mesures_internes);
echo $mesures_internes ;
}
if ($parameter == "ext") {
$url_mesures_externes = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $module_externe . "&scale=max&type=Temperature,Humidity&date_end=last";
$mesures_externes = file_get_contents($url_mesures_externes);   
echo $mesures_externes ;
}
if ($parameter == "mod2") {
$url_mesures_internes2 = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" .  $module_interne . "&module_id=" . $module_interne2 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last";
$mesures_internes2 = file_get_contents($url_mesures_internes2);
echo $mesures_internes2 ;
}
if ($parameter == "mod3") {
$url_mesures_internes3 = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" .  $module_interne . "&module_id=" . $module_interne3 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last";
$mesures_internes3 = file_get_contents($url_mesures_internes3);
echo $mesures_internes3 ;
}
if ($parameter == "mod4") {
$url_mesures_internes4 = "https://api.netatmo.net/api/getmeasure?access_token=" .  $params['access_token'] . "&device_id=" .  $module_interne . "&module_id=" . $module_interne4 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last";
$mesures_internes4 = file_get_contents($url_mesures_internes4);
echo $mesures_internes4 ;
}
?>

Prochaine étape, permettre d'envoyer en paramètre une valeur json à  renvoyer.

exemple:

http://XXXXXXXXXXXXXX/netatmo/netatmo.php?parameter=json_query&value=["body"]["devices"][0]["_id"]

Retournerais un json contenant la réponse

 

Là  mes faibles connaissances en php bloquent un peu :-/

Posté(e)

Réservé EmonCMS

 

exemple de mes tableaux sur emoncms:

post-826-0-53383200-1425121685_thumb.png

post-826-0-82493200-1425121763_thumb.png

Affichage des valeurs remontées par ma VMC et gestion de la vitesse de la vmc en fonction de la teneur de CO2 dans la maison

post-826-0-84953300-1425121935_thumb.png

Posté(e)

Petite amélioration: si netatmo renvoie une des donnée fausse, le push vers emon CMS n'est pas réalisé.

 

ceci permet de ne pas avoir des graphiques qui passent à  0, il n'y aura simplement pas de valeur et si le prochain essai se passe bien, le graphique continuera comme si de rien était.

 

Un push vers le smartphone peut être fait lorsque l'erreur ci-dessus est détectée.

 

voici le code modifié:

-----------------------------------------------------------------------------------------
-- YAGDA - yet another graphic data analyser V2.3
-- Retreive Netatmo values for more than 2 modules, compute CO2 and push to EmonCMS
-- Sebastien Jauquet
-- Février 2015
-- Thanks to cedriclocqueneux, krikroff, i-magin and all contibutors to the netatmo code
-----------------------------------------------------------------------------------------

-- Instructions:
-- Create an free emoncms.org account
-- Retrieve your Write API Key from it
-- Create a Global variable (undefined) -> CO2_Max_Value to store the max value of CO2 of the house - if you dont need this, set CO2 to false (default: 0)
-- Install my netatmo.php in your webserver and write his address in the ip Address of this module
-- for each value you want to be pushed to emoncms, modify the section -- Push To EMONCMS -- below
-- Create a block scene or use gea to click this button each 10 minutes (to avoid rejection from the api of Netatmo)
-- V2.01 -- First released version
-- V2.2 -- doesn't push to emonCMS if netatmo query return false
-- V2.3 -- added push message to phone if error

local id = {
	PHONE_NEXUS_5		= 53,
	PHONE_NEXUS_4		= 104
	}
local EmonCMS_Prefix = "NETATMO_" -- prefix of the id of the inpus to be created in emoncms (convenient for testing to not alter current feeds)
local PushToEmonCMS = true -- true = push to emoncms - false = do not push
local selfId = fibaro:getSelfId();
local thismodule=fibaro:getSelfId()
local domaine = fibaro:get(selfId, 'IPAddress')
local PushItem
local DoNotPush_Error = false
local activatePush = true; -- activate push (when problem detected )
local ID_Smartphones = {id["PHONE_NEXUS_5"]}; -- list of device receiving Push
local CO2_Max_Value_Local = 0 -- if you dont need this, set CO2 to false (default: 0)
local emoncms = Net.FHttp("emoncms.org",80)
local emoncms_api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -- your EMONCMS WRITE api Key

EmonCMS = {}; 
 
if (temperature_exterieure==nil) then temperature_exterieure = ""; end
if (humidite_exterieure==nil) then humidite_exterieure = ""; end

if (temperature_interieure==nil) then temperature_interieure = ""; end
if (humidite_interieure==nil) then humidite_interieure = ""; end
if (co2==nil) then co2 = ""; end
if (pression==nil) then pression = ""; end
if (bruit==nil) then bruit = ""; end

if (temperature_int_mod2==nil) then temperature_int_mod2 = ""; end
if (humidite_int_mod2==nil) then humidite_int_mod2 = ""; end
if (co2_mod2==nil) then co2_mod2 = ""; end

if (temperature_int_mod3==nil) then temperature_int_mod3 = ""; end
if (humidite_int_mod3==nil) then humidite_int_mod3 = ""; end
if (co2_mod3==nil) then co2_mod3 = ""; end

if (temperature_int_mod4==nil) then temperature_int_mod4 = ""; end
if (humidite_int_mod4==nil) then humidite_int_mod4 = ""; end
if (co2_mod4==nil) then co2_mod4 = ""; end 

if(refreshUI==nil) then -- Loads in memory only the first occurence
function refreshUI(ext, bruit, titre, tempmod, co2mod, humidmod, lastupdate, laststatus)
  fibaro:call(selfId,"setProperty","ui.ext.value",ext);
  fibaro:call(selfId,"setProperty","ui.bruit.value",bruit);  
  fibaro:call(selfId,"setProperty","ui.titre.value",titre);  
  fibaro:call(selfId,"setProperty","ui.tempmod.value",tempmod);  
  fibaro:call(selfId,"setProperty","ui.co2mod.value",co2mod);  
  fibaro:call(selfId,"setProperty","ui.humidmod.value",humidmod);  
  fibaro:call(selfId,"setProperty","ui.lastupdate.value",lastupdate);      
  fibaro:call(selfId,"setProperty","ui.laststatus.value",laststatus);   
end;
end
pushMessage = function (sendPush) 
	if (activatePush) then 
		for i=1, #ID_Smartphones do 
		  fibaro:call(tonumber(ID_Smartphones[i]), 'sendPush', sendPush); 
		  fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", "orange", "Push message ("..sendPush..") sent to mobile: "..tonumber(ID_Smartphones[i]), "span")); 
		end 
	end 
end
	
if(getExt==nil) then -- Loads in memory only the first occurence
function getExt(retry)
  retry = retry or 0
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo extérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=ext");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_exterieure = result.body[1].value[1][1] or "n.c";
        humidite_exterieure =result.body[1].value[1][2] or "n.c";
        -- variable globale pour info sms
        local msg = "Température extérieure : "..temperature_exterieure.."°C";
        fibaro:setGlobal("tempext", msg);
        return true;
      else
        fibaro:debug("Netatmo EXT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo EXT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo EXT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getInt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end
 
if(getInt==nil) then -- Loads in memory only the first occurence
function getInt(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=int");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_interieure = result.body[1].value[1][1] or "n.c";
        humidite_interieure = result.body[1].value[1][3] or "n.c";          
        co2 = result.body[1].value[1][2] or "n.c";
        pression = result.body[1].value[1][4] or "n.c";
        bruit = result.body[1].value[1][5] or "n.c";
        -- variable globale pour info sms
        fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod2==nil) then -- Loads in memory only the first occurence 
function getMod2(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod2");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod2 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod2 = result.body[1].value[1][2] or "n.c";          
        co2_mod2 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod2: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod2: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod2:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod3==nil) then -- Loads in memory only the first occurence 
function getMod3(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod3");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod3 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod3 = result.body[1].value[1][2] or "n.c";          
        co2_mod3 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod3: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod3: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod3:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

if(getMod4==nil) then -- Loads in memory only the first occurence 
function getMod4(retry)
  retry = retry or 0;
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
  -- Netatmo intérieur
  local response = FHTE:GET("/netatmo/netatmo.php?parameter=mod4");
  -- decoding json string to table
  if (response~= nil) then
    local result = nil;
    result = json.decode(response);
    if (result ~= nil) then
      -- prevent: attempt to index field 'body' (a nil value)
      if (result.body ~= nil) then
        temperature_int_mod4 = result.body[1].value[1][1] or "n.c";
        humidite_int_mod4 = result.body[1].value[1][2] or "n.c";          
        co2_mod4 = result.body[1].value[1][3] or "n.c";
        -- variable globale pour info sms
        -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C");
        return true;
      else
        fibaro:debug("Netatmo INT_mod4: erreur le " .. os.date());
        if (result.error ~= nil) then
          fibaro:debug("error code: "..result.error.code..", message: "..result.error.message);
        end
      end
    else
      fibaro:debug("Netatmo INT_mod4: erreur decodage json le " .. os.date());
    end
  else
    fibaro:debug("Netatmo INT_mod4:la reponse est null !");
  end
  if ((retry or 5)< 5) then
    fibaro:debug("Retry #"..retry.."process, please wait...");
    fibaro:sleep(5000);
    return getExt(tonumber(retry+1));
  else
      return false;
  end
end;
 
end

function EmonCMS:Push(payloademon)
payloademon = "/input/post.json?json={" .. EmonCMS_Prefix .. payloademon .. "}&apikey=" .. emoncms_api_key
response, status, errorCode = emoncms:GET(payloademon);
fibaro:debug("Payload: " .. payloademon) ;
fibaro:debug("response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ;
fibaro:sleep(500);
end

local function main()
  -- retrieve values from netatmo.php
  local resInt, resExt, resMod2, resMod3, resMod4 = false, false, false, false, false;
  
  local status, err = pcall(function () resInt = getInt(); end);
  fibaro:debug("Récupération des données intérieures: " .. tostring(resInt));
  if (status == false) then
	DoNotPush_Error = true;
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end

  local status, err = pcall(function () resExt = getExt(); end);
  fibaro:debug("Récupération des données extérieures : " .. tostring(resExt));
  if (status == false) then
	DoNotPush_Error = true;
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end

  local status, err = pcall(function () resMod2 = getMod2(); end);
  fibaro:debug("Récupération des données intérieures Mod2: " .. tostring(resMod2));
  if (status == false) then
	DoNotPush_Error = true;
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  
  local status, err = pcall(function () resMod3 = getMod3(); end);
  fibaro:debug("Récupération des données intérieures Mod3: " .. tostring(resMod3));
  if (status == false) then
	DoNotPush_Error = true;
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end
  
  local status, err = pcall(function () resMod4 = getMod4(); end);
  fibaro:debug("Récupération des données intérieures Mod4: " .. tostring(resMod4));
  if (status == false) then
	DoNotPush_Error = true;
    fibaro:debug("err: "..tostring(err or 'n.c'));
  end

if DoNotPush_Error == false then
	  refreshUI(
		"Ext: "..temperature_exterieure.." °C - "..humidite_exterieure.." % - "..pression.." mbar", 
		"Bruit Rez: "..bruit.." dB",
		"Rez - Emilien - Thomas - Parents",
		temperature_interieure.." - "..temperature_int_mod2.." - "..temperature_int_mod3.." - "..temperature_int_mod4.." °C ",
		co2.." - "..co2_mod2.." - "..co2_mod3.." - "..co2_mod4.." ppm",
		humidite_interieure.." - "..humidite_int_mod2.." - "..humidite_int_mod3.." - "..humidite_int_mod4.." % ",
		os.date("%H:%M"),
		tostring(resInt).." "..tostring(resExt).." "..tostring(resMod2).." "..tostring(resMod3).." "..tostring(resMod4)
		);
		-- Push To EMONCMS --
	  if PushToEmonCMS == true then
		payloademon = "temperature_exterieure:"..temperature_exterieure
			EmonCMS:Push(payloademon);
		payloademon = "humidite_exterieure:".. humidite_exterieure
			EmonCMS:Push(payloademon);
		payloademon = "pression:".. pression
			EmonCMS:Push(payloademon);
		payloademon = "bruit:".. bruit
			EmonCMS:Push(payloademon);
		payloademon = "temperature_interieure_Rez:".. temperature_interieure
			EmonCMS:Push(payloademon);
		payloademon = "temperature_int_mod2_Emilien:".. temperature_int_mod2
			EmonCMS:Push(payloademon);
		payloademon = "temperature_int_mod3_Thomas:".. temperature_int_mod3
			EmonCMS:Push(payloademon);
		payloademon = "temperature_int_mod4_Parents:".. temperature_int_mod4
			EmonCMS:Push(payloademon);
		payloademon = "humidite_interieure_Rez:".. humidite_interieure
			EmonCMS:Push(payloademon);
		payloademon = "humidite_int_mod2_Emilien:".. humidite_int_mod2
			EmonCMS:Push(payloademon);
		payloademon = "humidite_int_mod3_Thomas:".. humidite_int_mod3
			EmonCMS:Push(payloademon);
		payloademon = "humidite_int_mod4_Parents:".. humidite_int_mod4
			EmonCMS:Push(payloademon);
		payloademon = "co2_Rez:".. co2
			EmonCMS:Push(payloademon);
		payloademon = "co2_mod2_Emilien:".. co2_mod2
			EmonCMS:Push(payloademon);
		payloademon = "co2_mod3_Thomas:".. co2_mod3
			EmonCMS:Push(payloademon);
		payloademon = "co2_mod4_Parents:".. co2_mod4
			EmonCMS:Push(payloademon);
	  end
	  -- Compute Value MAX CO2 Maison (For VMC Speed VD)
	  if CO2_Max_Value_Local == false then
		fibaro:debug("not calculating nor storing CO2 Max Value")
	  else
		CO2_Max_Value_Local = co2
		if CO2_Max_Value_Local < co2_mod2 then CO2_Max_Value_Local = co2_mod2 end
		if CO2_Max_Value_Local < co2_mod3 then CO2_Max_Value_Local = co2_mod3 end
		if CO2_Max_Value_Local < co2_mod4 then CO2_Max_Value_Local = co2_mod4 end
		fibaro:setGlobal("CO2_Max_Value", CO2_Max_Value_Local )
		fibaro:debug("CO2_Max_Value: ".. CO2_Max_Value_Local )  
	  end
else
fibaro:debug("push error")
pushMessage("Error with netatmo device. resInt:" .. tostring(resInt).." resExt:"..tostring(resExt).." resMod2:"..tostring(resMod2).." resMod3:"..tostring(resMod3).." resMod4:"..tostring(resMod4));
end
end

main();
Posté(e)

Ben ya du code !!! 

Je viendrais te voir quand j'aurai mon mur chauffant avec vmc intégré !

Beau travail !

Pour ma curiosité, tu relèves avec quoi ton CO2 ? J'ai rien dis c'est " netatmo" !

Posté(e)

Je dois dire que je suis étonné du peu d'intérêt suscité par ces scripts... ??

Rien que l'amélioration de la récupération des valeurs netatmo me semblait intéressant pour la communautés, mais ça n'en a pas trop l'air.

Bizzare 

Posté(e)

Si si je regardais cela avec attention.

Et je me dis est ce qu on pourrait remonter plus que la netatmo ?

A savoir les donnes de nos devices zwave pour avoir un vrai data analyser de notre maison

Posté(e)

lol

 

Moi je remonte beaucoup de choses, valeurs de ma VMC, consos eau gaz elec, températures de certains capteurs etc.

C'est assez puissant emoncms, relativement simple et open source.

On peut donc se faire les dents sur le service cloud pour tout ramener sur son nas après si on a peur de la confidentialité

  • 2 semaines après...
Posté(e)

super travail moi je suis intéressé par contre pour l instant je n ai pas de netatmo mais si je voulais recevoir la conso de mais wallplug pour le moment est ce que en m aidant cela serait possible car j ai l intention d ajouter prochainement une netatmo en plus

est ce que on peut rajouter des modules sur le script

 

merci encore  :60:

s

Posté(e)

exemple pour remonter la consomation du wallplug id 25  sur emonCMS 

local wallplug1 = fibaro:getValue(25, "valueSensor")

payloademon = "wallplug_1:".. wallplug1
EmonCMS:Push(payloademon);
Posté(e)

@ Sebcbien merci pour ton aide mais étant un débutant je demande de ta part un peu de patience  :13:

je dois mettre le code netatmo v2.3 et au début la ou il y a les local je greffe le code du wallplug.

Petite question a koi sert jsoneditor?

excuse moi encore pour mon niveau et merci pour ton aide*

s

Posté(e)

Waow, ça m'a l'air méga puissant tout ça  :13:  :13:  :13:

 

Mais étant nul de chez nul dans tout ce qui est seveur web, et le reste aussi, ça me fait peur.

 

Je serais vachement intéressé par remonter les infos de mes modules z-wave (conso, tmp, batterie, ...). Je n'ai pas de Netatmon. (Mais bien un Nest)

Si j'ai bien compris, ce devrait être possible ?

Je sais que Lazer avait déjà  développé qqch sur Synology, mais je suis tellement nul, que je n'ai pas réussi à  l'implémenter...

Ta solution serait-elle plus abordable pour un néophyte ?

Posté(e)

@ Sebcbien merci pour ton aide mais étant un débutant je demande de ta part un peu de patience  :13:

je dois mettre le code netatmo v2.3 et au début la ou il y a les local je greffe le code du wallplug.

Petite question a koi sert jsoneditor?

excuse moi encore pour mon niveau et merci pour ton aide*

s

Bonjour flechg, désolé de ma réponse, mais au vu des questions, je te conseille de skipper ça pour le moment et d'y revenir quand tu aura une meilleure connaissance du LUA.

Tu doit en effet jouter le code "local" du wallplug au début et la partie payload vers la fin, mais aussi enlever le reste qui ne te convient pas... relativement simple mais tu semble perdu :/

 

Le json editor sert a décoder directement le json envoyé par netatmo et le rendre facilement lisible "par un humain" le debuggage en est simplifié

 

Waow, ça m'a l'air méga puissant tout ça  :13:  :13:  :13:

 

Mais étant nul de chez nul dans tout ce qui est seveur web, et le reste aussi, ça me fait peur.

 

Je serais vachement intéressé par remonter les infos de mes modules z-wave (conso, tmp, batterie, ...). Je n'ai pas de Netatmon. (Mais bien un Nest)

Si j'ai bien compris, ce devrait être possible ?

Je sais que Lazer avait déjà  développé qqch sur Synology, mais je suis tellement nul, que je n'ai pas réussi à  l'implémenter...

Ta solution serait-elle plus abordable pour un néophyte ?

Pour le serveur web, il suffit de mettre la page php et de configurer les valeurs en début de script, rien de sorcier.

La page php ne sert que à  récupérer les valeurs netatmo en HTTPS (impossible pour la HC2 en V3.6)

Sur un synology il ya des tuto, c'est 5 minutes

Posté(e)

Oui, tout ce que vous voulez en fait....

 

Apparement la remontée d'infos sur emoncms vous intéresse plus que tout le reste... je ne sais pas si je dois  :D ou  :mellow:  :huh::( ....  ;)

 

Si je trouve du temps, je pourrais écrire un script uniquement pour ça...

 

Si vous pouvez poster le type d'infos que vous souhaiteriez remonter, ça pourra m'aider

  • Upvote 1
Posté(e)

Ce qui m'intéresserait serait les infos de "consommation" des tous mes devices (W, °C, Lux, Humidité) et le niveau des batteries, soyons fou.

Et n'oublie pas (en ce qui me concerne) que tu t'adresseras à  un NUL 

Je crois (si j'ai bien compris) que cela peut faire la même chose que ce que Lazer a proposé, mais en plus accessible et si on n'a pas de Synology.

MERCI !

Posté(e)

@sebcbien merci pour ta réponse mais j avais déjà  essayé de modifier le code mais je n y suis pas arrivé  :23:  :23:

ton script est super mais quand j aurai ma netatmo j essaierai (achat futur proche)

mais bon merci de  m aider quand même

 

@jojo je suis d accord avec toi il nous faut un code tout prêt pour tout remonter sans serveur bien sur :P  :13:  :13:  :74: 

j espère que sebcbien pourra ce pencher sur notre pb :74:  :74:

Posté(e)

Oui, tout ce que vous voulez en fait....

 

Apparement la remontée d'infos sur emoncms vous intéresse plus que tout le reste... je ne sais pas si je dois  :D ou  :mellow:  :huh::( ....  ;)

 

Si je trouve du temps, je pourrais écrire un script uniquement pour ça...

 

Si vous pouvez poster le type d'infos que vous souhaiteriez remonter, ça pourra m'aider

 

effectivement, c'est bien de remonté la netatmo mais pas suffisant.

personnellement ce que je recherche c'est un sorte de LOG de tout ce qui se passe. 

les graphs de Lazer font le job mais si on peut utiliser un outil encore plus puissant c'est mieux :-)

Posté(e)

un peu d aide svp

 

j ai mis ce code 

local EmonCMS_Prefix = "WALLPLUG_" -- prefix of the id of the inpus to be created in emoncms (convenient for testing to not alter current feeds)
local PushToEmonCMS = true -- true = push to emoncms - false = do not push
local selfId = fibaro:getSelfId();
local thismodule=fibaro:getSelfId()
local domaine = fibaro:get(selfId, 'IPAddress')
local PushItem
local wallplug1 = fibaro:getValue(43, "valueSensor")
local DoNotPush_Error = false
local activatePush = true; -- activate push (when problem detected )
local emoncms = Net.FHttp("emoncms.org",80)
local emoncms_api_key = "KEY" -- your EMONCMS WRITE api Key
 
EmonCMS = {}; 
 
 
 
 
 
if(getExt==nil) then -- Loads in memory only the first occurence
function getExt(retry)
  retry = retry or 0
  -- Setting up the connection data
  local FHTE = Net.FHttp(domaine, 80);
      end
 
 
end
 
function EmonCMS:Push(payloademon)
payloademon = "/input/post.json?json={" .. EmonCMS_Prefix .. payloademon .. "}&apikey=" .. emoncms_api_key
response, status, errorCode = emoncms:GET(payloademon);
fibaro:debug("Payload: " .. payloademon) ;
fibaro:debug("response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ;
fibaro:sleep(500);
end
 
 
 
-- Push To EMONCMS --
 if PushToEmonCMS == true then
payloademon = "wallplug_1:".. wallplug1
EmonCMS:Push(payloademon);
 end
 
main();
 
et donc j ai bien une remonté vers emoncms cela me crée un imput wallplug par-contre après je n arrive pas en créant le feeds a avoir une remontée j ai zero bizarre
une petite question aussi est ce que avec ce code
 local wallplug1 = fibaro:getValue(43, "valueSensor") cela fonctionne pour tout c est a dire w oubien degré ou il faut changer quelque chose merci 
 
j avance a petit pas mais bon
j essaye 
merci encore :(
Posté(e)

bon j ai changer la valeur

local wallplug1 = fibaro:getValue(43, "valueSensor") en

local wallplug1 = fibaro:getValue(43, "value")

et la ca fonctionne parcontre a koi sert valuesensor

merci je sais que je suis un peu lourd mais bon j essaye de comprendre

merci encore

s

Posté(e)

Je pense que c'est une différence (valuesensor) entre la v4 et la v3. Désolé je suis en déplacement et loin de mon PC :/

  • Upvote 2
Posté(e)

Bonjour a tous 

j ai toujours un pb j ai bien les remontées vers emoncms mais je n arrive pas a avoir les consos du wallplug j ai juste la valeur 1 qui s affiche j ai essayé tous les feeds et autre mais sans succès peut être cela viens du code lua 

merci de m éclairer car cela fait 2 nuits que je suis dessus et la je vais tout casser  :D  :D

merci encore

Posté(e)

la différence vient des versions du hc2

3.6 et 4.0 n'utilisent pas toujours les mêmes arguments...

Regarde pour ta version comment récupérer la consommation 

et avant de pousser vers emoncms, essaye d'abord en local si ça marche

fibaro:debug(la valeur que tu veux vérifier)
Posté(e)

je suis en v 4.037 

mais je me demande si il ne faut pas envoyer la conso du wallplug dans une variable conso1 par ex 

et la valeur la renvoyer vers emoncms ???

il faut que j épluche le web a la recherche d info 

:1:

×
×
  • Créer...