Steven Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Oui moi aussi, je viens de relancer une batterie de test et j'ai aussi des chiffres étranges. Bizzare car lors de mes précédents tests, c'était correct. Je contrôle, corrige et revient vers vous dès que possible. Par contre, quelqu'un pourrait me confirmer les autres données svp ? Merci d'avance.
Steven Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 C'est mieux comme cela : [DEBUG] 22:09:42: ----------========== D e v i c e s =========---------- [DEBUG] 22:09:43: ----------========== Module intérieur ==========---------- [DEBUG] 22:09:43: temperature_interieure = 21.5 [DEBUG] 22:09:43: co2 = 715 [DEBUG] 22:09:43: humidite_interne = 49 [DEBUG] 22:09:43: pression = 1022 [DEBUG] 22:09:43: bruit = 42 [DEBUG] 22:09:43: ----------========== Module extérieur ==========---------- [DEBUG] 22:09:43: temperature_exterieure = 12.8 [DEBUG] 22:09:43: humidite_externe = 53 [DEBUG] 22:09:43: ----------========== Pluie histo ==========---------- [DEBUG] 22:09:43: rain[week] = 24.4 [DEBUG] 22:09:43: ----------========== Pluie histo ==========---------- [DEBUG] 22:09:43: rain[day] = 0 [DEBUG] 22:09:43: ----------========== Pluie histo ==========---------- [DEBUG] 22:09:43: rain[hour] = 0.3 [DEBUG] 22:09:43: ----------========== Pluie histo ==========---------- [DEBUG] 22:09:43: rain[month] = 53.5
PITP2 Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 cela semble plus cohérent, je peux tester un truc ?
Steven Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Voici donc le code corrigé. J'ai voulu utilisé la même function pour faire les statistiques de pluie actuelle et les historiques (jour, semaine, mois), alors que dans mes précédents tests, j'avais des function séparées. Voilà , je me suis planté Voici la version : local n_client_id = "111b1112d11111113415b571b" local n_client_secret = "lyZkHXyLPO8xShAAtmQhsCQM4U3djL08Zq1hUStbUJ4" local n_username = "____________@_____.com" local n_password = "password" local hc2_module_virtuel = 139 local debug = true -- ------------------------------------------------------------------------ -- NE PAS TOUCHER -- ------------------------------------------------------------------------ local token = "" local int_id = "" local ext_id = "" local ext_bat = 0 local rain_id = "" local rain_bat = 0 local temperature_interieure = -1000 local temperature_exterieure = -1000 local co2 = -1000 local humidite_interne = -1000 local humidite_externe = -1000 local pression = -1000 local bruit = -1000 local rains = {hour = -1000, day = -1000, week = -1000, month = -1000} -- ------------------------------------------------------------------------ -- Exécuté après chaque requète HTTP -- ------------------------------------------------------------------------ function afterHttpRequest() if (temperature_interieure > -1000) then end if (temperature_exterieure > -1000) then end if (co2 > -1000) then end if (humidite_interne > -1000) then end if (humidite_externe > -1000) then end if (pression > -1000) then end if (bruit > -1000) then end if (rains["hour"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) end if (rains["day"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"]) end if (rains["week"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"]) end if (rains["month"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"]) end end -- ------------------------------------------------------------------------ -- Affichage dans la console -- ------------------------------------------------------------------------ function log(message, force) force = force or false if (debug or force) then print(__convertToString(message)) end end -- ------------------------------------------------------------------------ -- Retourne le niveau de batterie en pourcent -- ------------------------------------------------------------------------ function calcBat(bat, ext) local max = 6000 local min = 4200 if (ext) then max = 6000 min = 3600 end if (bat > max) then bat = max end return math.floor(bat * 100 / max) end -- ------------------------------------------------------------------------ -- Arrondi -- ------------------------------------------------------------------------ local function roundToNthDecimal(num, n) local mult = 10^(n or 0) return math.floor(num * mult + 0.5) / mult end -- ------------------------------------------------------------------------ -- Interrogation de l'API -- ------------------------------------------------------------------------ function getResponseData(url, body, func) local http = net.HTTPClient() http:request(url, { options = { method = 'POST', headers = { ["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8" }, data = body }, success = function(response) func(json.decode(response.data)) afterHttpRequest() end, error = function(response) log(" ERROR !!! " .. url, true) end, }) end -- ------------------------------------------------------------------------ -- Mesures de l'unité interne -- ------------------------------------------------------------------------ function getMesuresInt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last", function(data) log("----------========== Module intérieur ==========----------") temperature_interieure = data.body[1].value[1][1] co2 = data.body[1].value[1][2] humidite_interne = data.body[1].value[1][3] pression = data.body[1].value[1][4] bruit = data.body[1].value[1][5] log("temperature_interieure = " .. temperature_interieure) log("co2 = " .. co2) log("humidite_interne = " .. humidite_interne) log("pression = " .. pression) log("bruit = " .. bruit) end ) end -- ------------------------------------------------------------------------ -- Mesure de l'unité externe -- ------------------------------------------------------------------------ function getMesuresExt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity&date_end=last", function(data) log("----------========== Module extérieur ==========----------") temperature_exterieure = data.body[1].value[1][1] humidite_externe = data.body[1].value[1][2] log("temperature_exterieure = " .. temperature_exterieure) log("humidite_externe = " .. humidite_externe) end ) end -- ------------------------------------------------------------------------ -- Mesure du détecteur de pluie historique -- ------------------------------------------------------------------------ function getMesuresRain(duree, scale, typescale, variable) local now = os.time(); getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale="..scale.."&type="..typescale.."&date_begin="..os.date("!%c", now - (duree)), function(data) log("----------========== Pluie histo ==========----------") local cumul = 0 for k, v in pairs(data.body) do for l, w in pairs(v.value) do if (scale == "max") then cumul = cumul + w[1] else cumul = w[1] end end end cumul = roundToNthDecimal(cumul, 2) rains[variable] = cumul log("rain["..variable.."] = " .. rains[variable]) end ) end -- ------------------------------------------------------------------------ -- Obtention des informations sur les devices -- ------------------------------------------------------------------------ function getDevices() getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, function(data) log("----------========== D e v i c e s =========----------") for _, v in pairs(data.body.modules) do if (v.data_type[1] == "Rain") then rain_id = v._id rain_bat = calcBat(v.battery_vp, true) else ext_id = v._id ext_bat = calcBat(v.battery_vp, true) end end int_id = data.body.devices[1]._id getMesuresInt() getMesuresExt() --getMesuresRain1heure() if (rain_id ~= "") then getMesuresRain(1000 * 60 * 60, "max", "Rain", "hour") getMesuresRain(1000 * 60 * 60 * 24, "1day", "sum_rain", "day") getMesuresRain(1000 * 60 * 60 * 24 * 7, "1week", "sum_rain", "week") getMesuresRain(1000 * 60 * 60 * 24 * 30, "1month", "sum_rain", "month") end end ) end -- ------------------------------------------------------------------------ -- Authentification -- ------------------------------------------------------------------------ function auth(nextFunction) local request_body = "grant_type=password&client_id=" .. n_client_id .. "&client_secret=" .. n_client_secret .. "&username=" .. n_username .. "&password=" .. n_password .. "&scope=read_station" getResponseData("https://api.netatmo.net/oauth2/token", request_body, function(data) token = data.access_token log(token) nextFunction() end ) end auth(getDevices) log("Last request : " .. os.date("%x - %X"), true)
PITP2 Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Copie du debug et en rouge les valeurs depuis l'interface netatmo. Il y a encore des écarts mais c'est mieux [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[day] = 0 Ok [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[hour] = 0.1 0 [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[month] = 41.9 43,1 [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[week] = 5.8 6,5 Si nécessaire je suis sur le tchat, c'est parfois plus pratique
Steven Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Pourrais-tu remplacer ces 2 méthodes et retester stp (chat on ) function getMesuresRain(scale, variable) local now = os.time(); getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale="..scale.."&type=sum_rain&date_end=last", function(data) log("----------========== Pluie histo ==========----------") local cumul = 0 for k, v in pairs(data.body) do for l, w in pairs(v.value) do cumul = cumul + w[1] end end cumul = roundToNthDecimal(cumul, 2) rains[variable] = cumul log("rain["..variable.."] = " .. rains[variable]) end ) end -- ------------------------------------------------------------------------ -- Obtention des informations sur les devices -- ------------------------------------------------------------------------ function getDevices() getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, function(data) log("----------========== D e v i c e s =========----------") for _, v in pairs(data.body.modules) do if (v.data_type[1] == "Rain") then rain_id = v._id rain_bat = calcBat(v.battery_vp, true) else ext_id = v._id ext_bat = calcBat(v.battery_vp, true) end end int_id = data.body.devices[1]._id getMesuresInt() getMesuresExt() --getMesuresRain1heure() if (rain_id ~= "") then getMesuresRain("1hour", "hour") getMesuresRain("1day", "day") getMesuresRain("1week", "week") getMesuresRain("1month", "month") end end ) end
PITP2 Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Alors une valeur en plus de bonne [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[day] = 0 Ok [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[hour] = 0 Ok [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[month] = 41.9 43,1 [DEBUG] 22:17:53: ----------========== Pluie histo ==========---------- [DEBUG] 22:17:53: rain[week] = 5.8 6,5
Steven Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 J'y suis. Attention sur le site de Netatmo, si vous regarder la pluviométrie "semaine" vous voyer celle de la semaine en cours, du lundi au jours actuel et non pas des 7 derniers jours. Le script, lui, prend les derniers jours. Version corrigée. local n_client_id = "11b11111d9775913415b571b" local n_client_secret = "lyRfHWZLJO8xShAAtmQhsCQM4U3djL08Zq1hUStbUJ4" local n_username = "__________@_______.com" local n_password = "password" local hc2_module_virtuel = 139 local debug = true -- ------------------------------------------------------------------------ -- NE PAS TOUCHER -- ------------------------------------------------------------------------ local token = "" local int_id = "" local ext_id = "" local ext_bat = 0 local rain_id = "" local rain_bat = 0 local temperature_interieure = -1000 local temperature_exterieure = -1000 local co2 = -1000 local humidite_interne = -1000 local humidite_externe = -1000 local pression = -1000 local bruit = -1000 local rains = {hour = -1000, day = -1000, week = -1000, month = -1000} -- ------------------------------------------------------------------------ -- Exécuté après chaque requète HTTP -- ------------------------------------------------------------------------ function afterHttpRequest() if (temperature_interieure > -1000) then end if (temperature_exterieure > -1000) then end if (co2 > -1000) then end if (humidite_interne > -1000) then end if (humidite_externe > -1000) then end if (pression > -1000) then end if (bruit > -1000) then end if (rains["hour"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) end if (rains["day"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"]) end if (rains["week"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"]) end if (rains["month"] > -1000) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"]) end end -- ------------------------------------------------------------------------ -- Affichage dans la console -- ------------------------------------------------------------------------ function log(message, force) force = force or false if (debug or force) then print(__convertToString(message)) end end -- ------------------------------------------------------------------------ -- Retourne le niveau de batterie en pourcent -- ------------------------------------------------------------------------ function calcBat(bat, ext) local max = 6000 local min = 4200 if (ext) then max = 6000 min = 3600 end if (bat > max) then bat = max end return math.floor(bat * 100 / max) end -- ------------------------------------------------------------------------ -- Arrondi -- ------------------------------------------------------------------------ local function roundToNthDecimal(num, n) local mult = 10^(n or 0) return math.floor(num * mult + 0.5) / mult end -- ------------------------------------------------------------------------ -- Interrogation de l'API -- ------------------------------------------------------------------------ function getResponseData(url, body, func) local http = net.HTTPClient() http:request(url, { options = { method = 'POST', headers = { ["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8" }, data = body }, success = function(response) func(json.decode(response.data)) afterHttpRequest() end, error = function(response) log(" ERROR !!! " .. url, true) end, }) end -- ------------------------------------------------------------------------ -- Mesures de l'unité interne -- ------------------------------------------------------------------------ function getMesuresInt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last", function(data) log("----------========== Module intérieur ==========----------") temperature_interieure = data.body[1].value[1][1] co2 = data.body[1].value[1][2] humidite_interne = data.body[1].value[1][3] pression = data.body[1].value[1][4] bruit = data.body[1].value[1][5] log("temperature_interieure = " .. temperature_interieure) log("co2 = " .. co2) log("humidite_interne = " .. humidite_interne) log("pression = " .. pression) log("bruit = " .. bruit) end ) end -- ------------------------------------------------------------------------ -- Mesure de l'unité externe -- ------------------------------------------------------------------------ function getMesuresExt() getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity&date_end=last", function(data) log("----------========== Module extérieur ==========----------") temperature_exterieure = data.body[1].value[1][1] humidite_externe = data.body[1].value[1][2] log("temperature_exterieure = " .. temperature_exterieure) log("humidite_externe = " .. humidite_externe) end ) end -- ------------------------------------------------------------------------ -- Mesure du détecteur de pluie historique -- ------------------------------------------------------------------------ function getMesuresRain(duree, variable) local now = os.time(); print(os.date("!%c", (now - duree))) -- getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale="..scale.."&type=sum_rain&date_end=last", getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale=1hour&type=sum_rain&real_time=true&date_begin="..os.date("!%c", (now - duree)), function(data) log("----------========== Pluie histo ==========----------") local cumul = 0 for k, v in pairs(data.body) do for l, w in pairs(v.value) do cumul = cumul + w[1] end end cumul = roundToNthDecimal(cumul, 2) rains[variable] = cumul log("rain["..variable.."] = " .. rains[variable]) end ) end -- ------------------------------------------------------------------------ -- Obtention des informations sur les devices -- ------------------------------------------------------------------------ function getDevices() getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, function(data) log("----------========== D e v i c e s =========----------") for _, v in pairs(data.body.modules) do if (v.data_type[1] == "Rain") then rain_id = v._id rain_bat = calcBat(v.battery_vp, true) else ext_id = v._id ext_bat = calcBat(v.battery_vp, true) end end int_id = data.body.devices[1]._id getMesuresInt() getMesuresExt() --getMesuresRain1heure() if (rain_id ~= "") then getMesuresRain(60 * 60, "hour") getMesuresRain(60 * 60 * 24, "day") getMesuresRain(60 * 60 * 24 * 7, "week") getMesuresRain(60 * 60 * 24 * 30, "month") end end ) end -- ------------------------------------------------------------------------ -- Authentification -- ------------------------------------------------------------------------ function auth(nextFunction) local request_body = "grant_type=password&client_id=" .. n_client_id .. "&client_secret=" .. n_client_secret .. "&username=" .. n_username .. "&password=" .. n_password .. "&scope=read_station" getResponseData("https://api.netatmo.net/oauth2/token", request_body, function(data) token = data.access_token log(token) nextFunction() end ) end auth(getDevices) log("Last request : " .. os.date("%x - %X"), true)
Plap3014 Posté(e) le 29 avril 2015 Signaler Posté(e) le 29 avril 2015 Question: Pouvons nous récupérer les info d'une station pour le pluviomètre sur W Undergournd? pour les gens comme moi qui on pas de pluviomètre? merci, patrick
Bouliboule Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Steven, Cela à l'air de fonctionner, à confirmer avec les prochaines pluies. Merci de ton aide !
Steven Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 @Plap3014 Wunderground garde un historique des données, donc je pense que c'est possible. @Bouliboule De rien Dès que j'ai le temps, je vais en faire un tuto a part comme demandé par Moicphil.
Steven Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Avec un gros merci àPITP2 qui, bien qu'il ne sache plus compter passé minuit, m'a bien aidé àtrouver les chiffres corrects
mprinfo Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 @steven tu aurrais du lui supprimer la bière Super boulot merci a vous 2 Envoyé avec mon SmartPhone
Bouliboule Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Oui merci àPITP2 également! Je dois avouer que je vous ai vu vous exciter hier soir sur mon ipad et que je n'avais pas la force d'aller chercher mon laptop dans la voiture pour faire les tests:)
Steven Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 @Bouliboule Pfffft, si on avait le même manque de force que toi .. tu n'aurais pas beaucoup de script 1
PITP2 Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 @mprinfo, ah non il me faut ma bière sinon je tremble et je n'arrive plus à taper au clavier ... Tu crois que si je buvais de l'eau j'arriverai à calculer en virgule flottante ? 2
mprinfo Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Alors tournée générale sur le compte de Moicphil lol pour re motiver les troupes Envoyé avec mon SmartPhone
fuuss Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Grand merci , ca fonctionne très bien , Un autre question dans ton script tu fais (prevision > (quantie_jour_mm*nb_jour_prevision)*1.5 ) Pourquoi cette équation. Merci d'avance
Steven Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 J'ai besoin de 4mm d'eau (quantie_jour_mm) par jour. Je reçoit de Wunderground des prévisions (prevision) pour les 3 prochaines jours (nb_jour_prevision). Donc si Wunderground me dit qu'il va pleuvoir 10mm, cela me donne 10mm > (4mm * 3jours) ... il est donc prévu de pleuvoir 10mm et moi j'ai besoin de 12mm (sur les 3 prochain jours) ... c'est n'est donc pas suffisant pour ma pelouse. De plus, j'applique un coefficient (1.5) pour éviter les erreurs ou les arrosages trop fréquent. En effet, si j'ai une prévision de 13mm et que j'ai besoin de 12mm je vais arroser automatiquement alors que c'est pas vraiment nécessaire. Dans mon cas, je préfère faire un arrosage en plus à la main que de noyer ma pelouse. Voili voilà Après, il serait judicieux d'avoir des équations bien plus intelligente qui vont prendre en compte la température (canicule) et plein d'autres choses. Mon arrosage ne gère que la pelouse sur laquelle les enfants jouent .. donc j'ai juste besoin qu'elle reste verte.
mprinfo Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Attention trop d'arrosage fais pousser la pelouse plus vite donc il faut tondre plus souvent. Un arrosage doit ce faire en fin de journée ou la nuit car il y a moins d'évaporation. Un arrosage trop regulé fragilise l herbes qui n'a pas l'habitude de souffrir. Il faut aussi choisir lors de l'on seme le bon gazon car certaines semences sont plus resitantes que d'autres pas simple tout cela Envoyé avec mon SmartPhone
fuuss Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Ah très bien , merci pour l'explication , j'ai vraiment pas trouver la logique des 1.5. En fait ce serait interessant , comme tu dis, de créer une équation plus intelligente. Comme mon sol à besoin au moins 15 à 20 mm par m2 . En plus la temperature en été . Je vais essayer si je trouve quelquechose qui fonctionne . Ma pelouse est tondu automatiquement donc , pas de problème :-) Mais je te remercie pour ton super travail.
Steven Posté(e) le 30 avril 2015 Signaler Posté(e) le 30 avril 2015 Voilà , j'ai tout remis ici : http://www.domotique-fibaro.fr/index.php/topic/4626-pluviom%C3%A9trie-avec-netatmo/?p=69390 @fuuss De rien Les 1.5 c'est juste une marge pour éviter de trop arroser, il ne sont pas nécessaire, c'est juste un choix personnel. @mprinfo Moi aussi c'est tondu automatiquement. Vivement un vrai équations
Messages recommandés