Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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
Posté(e)

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é  :P

 

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)

Posté(e)

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
Posté(e)

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
Posté(e)

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
Posté(e)

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)

Posté(e)

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

Posté(e)

@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.

Posté(e)

Avec un gros merci àPITP2 qui, bien qu'il ne sache plus compter passé minuit, m'a bien aidé àtrouver les chiffres corrects :)

Posté(e)

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:)

Posté(e)

@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 ?  :P

  • Upvote 2
Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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. 

Posté(e)

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  :60:

×
×
  • Créer...