sebcbien Posté(e) le 28 février 2015 Signaler Posté(e) le 28 février 2015 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 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(); 5
sebcbien Posté(e) le 28 février 2015 Auteur Signaler Posté(e) le 28 février 2015 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 ! 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 :-/
sebcbien Posté(e) le 28 février 2015 Auteur Signaler Posté(e) le 28 février 2015 Réservé EmonCMS exemple de mes tableaux sur emoncms: 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
sebcbien Posté(e) le 28 février 2015 Auteur Signaler Posté(e) le 28 février 2015 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();
turlututu74 Posté(e) le 2 mars 2015 Signaler Posté(e) le 2 mars 2015 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" !
sebcbien Posté(e) le 7 mars 2015 Auteur Signaler Posté(e) le 7 mars 2015 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
Sakkhho Posté(e) le 7 mars 2015 Signaler Posté(e) le 7 mars 2015 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
sebcbien Posté(e) le 7 mars 2015 Auteur Signaler Posté(e) le 7 mars 2015 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é
flechg Posté(e) le 15 mars 2015 Signaler Posté(e) le 15 mars 2015 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 s
sebcbien Posté(e) le 16 mars 2015 Auteur Signaler Posté(e) le 16 mars 2015 exemple pour remonter la consomation du wallplug id 25 sur emonCMS local wallplug1 = fibaro:getValue(25, "valueSensor") payloademon = "wallplug_1:".. wallplug1 EmonCMS:Push(payloademon);
flechg Posté(e) le 16 mars 2015 Signaler Posté(e) le 16 mars 2015 @ Sebcbien merci pour ton aide mais étant un débutant je demande de ta part un peu de patience 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
jojo Posté(e) le 18 mars 2015 Signaler Posté(e) le 18 mars 2015 Waow, ça m'a l'air méga puissant tout ça 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 ?
sebcbien Posté(e) le 18 mars 2015 Auteur Signaler Posté(e) le 18 mars 2015 @ Sebcbien merci pour ton aide mais étant un débutant je demande de ta part un peu de patience 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 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
Sakkhho Posté(e) le 18 mars 2015 Signaler Posté(e) le 18 mars 2015 on peut remonter les infos batteries des devices et autres également ?
sebcbien Posté(e) le 18 mars 2015 Auteur Signaler Posté(e) le 18 mars 2015 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 ou .... 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 1
jojo Posté(e) le 18 mars 2015 Signaler Posté(e) le 18 mars 2015 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 !
flechg Posté(e) le 18 mars 2015 Signaler Posté(e) le 18 mars 2015 @sebcbien merci pour ta réponse mais j avais déjà essayé de modifier le code mais je n y suis pas arrivé 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 j espère que sebcbien pourra ce pencher sur notre pb
Sakkhho Posté(e) le 19 mars 2015 Signaler Posté(e) le 19 mars 2015 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 ou .... 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 :-)
flechg Posté(e) le 19 mars 2015 Signaler Posté(e) le 19 mars 2015 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
flechg Posté(e) le 19 mars 2015 Signaler Posté(e) le 19 mars 2015 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
sebcbien Posté(e) le 19 mars 2015 Auteur Signaler Posté(e) le 19 mars 2015 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 :/ 2
flechg Posté(e) le 19 mars 2015 Signaler Posté(e) le 19 mars 2015 @sebcbien c est pas grave pas presse merci de ton aide
flechg Posté(e) le 21 mars 2015 Signaler Posté(e) le 21 mars 2015 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 merci encore
sebcbien Posté(e) le 21 mars 2015 Auteur Signaler Posté(e) le 21 mars 2015 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)
flechg Posté(e) le 21 mars 2015 Signaler Posté(e) le 21 mars 2015 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
Messages recommandés