-
Compteur de contenus
4 434 -
Inscription
-
Dernière visite
-
Jours gagnés
201
Tout ce qui a été posté par Steven
-
Nouvelle version (2.0) du script (spécial Sakkhho) : Edit : nouvelle version du script. Si ce dernier détecte que vous n'avez pas de pluviomètre, il va rechercher un pluviomètre à proximité de chez vous (uniquement les relevés de la dernière heure et jour). La distance de recherche peux être adaptée en ajustant la variable long_lat_adjust (0.1 par défaut). Il s'agit du cercle de recherche en latitude/longitude autour de chez vous.
-
@Sakkhoo Avec Netatmo, je ne pourrais que te donner les relevé de pluviométrie du jour et de l'heure en cours a proximité de chez toi. "05:00:00:00:bd:f6":{"rain_24h":13.938, "rain_timeutc":1430405115, "rain_live":0, "rain_60min":0.303 },
-
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
-
Partie 3 : On vous a mâché le travail En effet, votre script de récupération de l'historique de votre pluviomètre a été installé et testé (post #1) ? Vous souhaitez connaitre les prévisions des 3 prochains jours et avez créé votre compte sur Wunderground (post #2) ? Alors voici le module virtuel que vous allez devoir importer (Pluie.vfib) Ce module virtuel va regrouper les données historiques et futurs dans une seule interface : Pour le faire fonctionner correctement, il va falloir modifier 2 ou 3 choses. Importer ce module et noté son ID Modifier la scène précédemment créée (voir post #1) et modifier la ligne suivante local hc2_module_virtuel = 139 -- id du module virtuel Modifier le module virtuelDerrière le bouton "Prévision" local scene_netatmo = 294 -- id de la scène local max_day = 3 -- 3 par défaut local cle_api = "49017e9e567edfb1" -- cle api de chez Wunderground local pws = "IAINTHOI2" -- station ID Derrière le bouton "Calcul" ATTENTION, c'est ici qu'aurons lieu VOS calculs, je vous laisse donc mon code comme exemple. Dans mon cas, je ne fais que de modifier une variable global "Arrossage" qui peut recevoir 3 valeurs : NON : rien à faire PREPARATION : arrossage de courte durée pour préparer le terrain a des pluies avenir OUI : gros arrosage car pas de pluie prévue Dans le main loop Vous pouvez mettre le code suivant pour appuyer sur les boutons toutes les 10 minutes. Dans mon cas, j'utilise GEA fibaro:call(fibaro:getSelfId(), "pressButton", "7") fibaro:sleep(3000) -- on attend 3 secondes fibaro:call(fibaro:getSelfId(), "pressButton", "9") -- dodo pendant 10 minutes fibaro:sleep(10*60*1000) Voilà , vous avez tout ce qu'il faut pour gérer votre arrosage. Ce n'est plus qu'à vous de jouer. Pluie.vfib
-
Partie 2 : Récupérer les prévisions des 3 prochains jours Le post précédent nous fournis une scène qui permet d'aller consulter notre pluviomètre Netatmo et de voir combien de "mm" il y a plu ... mais si pas exemple, on veut gérer son arrosage, il faut aussi connaitre les prévisions de pluie. Pour ceci, personnellement, j'aime bien le site Wundeground car il est rapide, disponible et assez simple. Donc si vous aussi vous souhaitez allez plus loin, il va vous falloir que vous créez un compte sur Wunderground et précisez le lieu géographique où vous êtes. Pour crée un compte : http://www.wunderground.com/weather/api/d/login.html Pour trouver sa "station ID" : http://www.wunderground.com/weatherstation/ListStations.asp?selectedCountry=France La création du compte va vous permettre d'obtenir une "cle api" (exemple : 58096c9e567edfb1) Et la recherche de la station la plus proche de chez vous, une station ID (exemple : IAINTHOI2) Avec ces 2 informations, nous allons pouvoir récupérer les prévisions des 3 prochains jours : Le script ci-dessous doit être inclus dans un module virtuel (voir le post suivant avant de faire quoi que ce soit) : local max_day = 3 -- 3 par défaut local cle_api = "58027c8e567edfb1" -- cle api de chez Wunderground local pws = "IAINTHOI2" -- station ID local scene_netatmo = 294 -- id de la scène fibaro:startScene(scene_netatmo) local WGROUND = Net.FHttp("api.wunderground.com",80) local response ,status, err = WGROUND:GET("/api/"..cle_api.."/forecast/lang:FR/q/pws:"..pws..".json") local rain = -1 if (response ~= nil) then rain = 0 local jsonTable = json.decode(response) max_day = max_day + 1 if (#jsonTable.forecast.simpleforecast.forecastday < max_day) then max_day = #jsonTable.forecast.simpleforecast.forecastday end for i = 1, max_day do fibaro:debug(jsonTable.forecast.simpleforecast.forecastday[i].conditions) fibaro:debug(jsonTable.forecast.simpleforecast.forecastday[i].qpf_allday.mm) rain = rain + jsonTable.forecast.simpleforecast.forecastday[i].qpf_allday.mm end fibaro:debug("Prévision pour les " .. (max_day-1) .. " prochains jours : " .. rain .. " mm") end fibaro:call(fibaro:getSelfId(), "setProperty", "ui.lblPrevu.value", rain)
-
PLUVIOMETRIE (ET ARROSAGE) AVEC NETATMO firmware 4.x seulement Partie 1 : récupérer l'historique Netatmo est une station météo sur laquelle vous pouvez brancher un "pluviomètre" de la même marque. Afin d'exploiter les données de ce pluviomètre et vous pouvez utiliser l'application Netatmo ou son site web. Vous pouvez aussi installer le plugin Netatmo fourni par Fibaro. Ce dernier vous affichera uniquement les données à l'instant précis ou vous être entrain de le regarder. Nous, nous voulons allez plus loin, nous voulons connaitre les quantités de pluie ayant eu lieu depuis : 1 jour, 1 semaine, 1 mois, cela dans l'optique de pouvoir gérer correctement notre arrosage. Pour ce faire, il existe un grand nombre de script PHP, Google Script qui permet de gérer cela .. mais ... depuis la v4.x, Fibaro nous fait bénéficier de la librairie net.httpClient dans une scène et cette librairie nous permet de récupérer des données via HTTPS, ce qui auparavant n'était pas possible depuis notre HC2. Alors vu que nous avons, aujourd'hui, tout le nécessaire pour attaquer notre Netatmo directement depuis notre HC2, pourquoi s'en priver Les données recueillies par votre Netatmo sont mis à diposition via des API que vous pouvez interroger quand bon vous semble à la seul condition d'avoir un compte Développeur Netatmo (ne vous inquiéter pas, vous n'aurez pas beson de développer, ni de répondre à des questions étranges). Pour vous inscrire, c'est donc ici : https://auth.netatmo.com/fr-FR/access/signup Suite à votre enregistrement, vous allez obtenir : un id (exemple : 45b1931d19665803515b571c) un code secret (exemple : lyRkJXZLIM8xShACtmQjsCQV4U3djL08Zq1hUStbUJ4) Ces informations + votre login et mot de passe vont permettre d'accéder à vos informations. Voici donc le script nécessaire, à vous de l'importer dans une nouvelle scène et de modifier les 4 premières lignes. local n_client_id = "45b1931d19665803515b571c" local n_client_secret = "lyRkJXZLIM8xShACtmQjsCQV4U3djL08Zq1hUStbUJ4" local n_username = "______________@_____.com" local n_password = "password" local hc2_module_virtuel = 139 -- le module virtuel "Pluie" local debug = true -- affiche ou non les message dans la console local long_lat_adjust = 0.1 -- ajustement de la distance pour trouvé un pluviomètre local version = 2.0 -- ------------------------------------------------------------------------ -- NE PAS TOUCHER -- ------------------------------------------------------------------------ local force_use_rain_public = false local loc = api.get("/settings/location") local lat_ne = loc.latitude + long_lat_adjust local lon_ne = loc.longitude + long_lat_adjust local lat_sw = loc.latitude - long_lat_adjust local lon_sw = loc.longitude - long_lat_adjust 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 if (rains["hour"] == -1) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", "n/a") else fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) end end if (rains["day"] > -1000) then if (rains["day"] == -1) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", "n/a") else fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"]) end end if (rains["week"] > -1000) then if (rains["week"] == -1) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", "n/a") else fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"]) end end if (rains["month"] > -1000) then if (rains["month"] == -1) then fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", "n/a") else fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"]) end 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 -- ------------------------------------------------------------------------ -- Obtention des informations sur un pluviomètre proche -- ------------------------------------------------------------------------ function getRainNear() getResponseData("https://api.netatmo.net/api/getpublicdata","access_token="..token .. "&lat_ne="..lat_ne.."&lon_ne="..lon_ne.."&lat_sw="..lat_sw.."&lon_sw="..lon_sw, function(data) --log(data) rains["week"] = -1 rains["month"] = -1 rains["hour"] = -1 rains["day"] = -1 log("----------========== D e v i c e s =========----------") for _, v in pairs(data.body) do for l, w in pairs(v.measures) do if (type(w.rain_24h) ~= "nil") then rains["day"] = w.rain_24h rains["hour"] = w.rain_60min end end end if (rains["day"] == -1000) then log("Impossible de trouver un pluviomètre à proximité, augmentez [long_lat_adjust]", true) else log("Pluie jour : " .. rains["day"]) log("Pluie heure : " .. rains["hour"]) end end ) end -- ------------------------------------------------------------------------ -- Mesure du détecteur de pluie historique -- ------------------------------------------------------------------------ function getMesuresRain(duree, variable) local now = os.time(); 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() if (rain_id ~= "" and not force_use_rain_public) then getMesuresRain(60 * 60, "hour") getMesuresRain(60 * 60 * 24, "day") getMesuresRain(60 * 60 * 24 * 7, "week") getMesuresRain(60 * 60 * 24 * 30, "month") else getRainNear() 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) si vous avez l'âme d'un développeur ou d'un aventurier, la méthode à modifier est afterHttpRequest() sinon, rendez-vous au post suivant. P.S. Merci à @PITP2 pour son support. Edit : nouvelle version du script. Si ce dernier détecte que vous n'avez pas de pluviomètre, il va rechercher un pluviomètre à proximité de chez vous (uniquement les relevés de la dernière heure et jour). La distance de recherche peux être adaptée en ajustant la variable long_lat_adjust (0.1 par défaut). Il s'agit du cercle de recherche en latitude/longitude autour de chez vous.
-
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.
-
Prends ton temps, mais les bonnes idées sont toujours le bienvenu
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Vaut mieux répondre 2x que pas du tout
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
@Bouliboule Pfffft, si on avait le même manque de force que toi .. tu n'aurais pas beaucoup de script
-
Avec un gros merci àPITP2 qui, bien qu'il ne sache plus compter passé minuit, m'a bien aidé àtrouver les chiffres corrects
-
@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.
-
GEA.add({"Global!", "MaVar", "---"}, ...., {{"Value", id, #value#}}) #value# sera remplacé par la valeur de MaVar. Sinon, il y a aussi les functions. Je trouves tes idées très bonnes, mais elles le deviendront vraiment que si tu partages ton code
- 12 330 réponses
-
- 1
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
Pourrais-tu essayé de remplacer les Global par Global! Donc les {"Global", "M_TV", "oui"} devient {"Global!", "M_TV", "non"} Et les {"Global", "M_TV", "non"} devient {"Global!", "M_TV", "oui"} Merci d'avance
- 12 330 réponses
-
- support
- script lua
-
(et 1 en plus)
Étiqueté avec :
-
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)
-
Suis sur le tchate
-
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
-
Tu peux tester stp ?
-
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)
-
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
-
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.
-
255 est la valeur retournée depuis longtemps et signifie ALERTE sur la batterie Arrivé àun certain seuil le pourcentage est mis à255 pour avertir qu'il faut absolument faire quelque chose.
-
Je ne sais pas quoi te répondre, les données sont celles fournies par Netatmo. Pour la semaine, on demande le relevé des 7 derniers jours. Je vérifierai demain si j'ai pas une boucle qui aditionnerait trop de relevés mais je crois pas. Je te tiens au courant.