Aller au contenu

Recommended Posts

Il y a 18 heures, flechg a dit :

 

Bonjour, 

 

moi j'ai tout refait, pour tout inclure, pas uniquement le vent

il faut créer une scene :

 

--[[
%% properties
%% autostart 
%% events
%% globals
--]]


local n_client_id = "xxx"
local n_client_secret = "xxx"
local n_username = "xxx"
local n_password = "xxx"
local hc2_module_virtuel = 202  -- 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 ventRafaleDirection =  -1000
local ventDirection =  -1000
local ventVitesse =  -1000
local ventRafaleVitesse =  -1000
local temperature_chambre = -1000
local humidite_chambre = -1000
local CO2_chambre = -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)
            fibaro:setGlobal('netatmoTempInt',temperature_interieure)
            fibaro:call(204, "setProperty", "ui.Label3.value", ""..temperature_interieure)       
			log("co2 = " .. co2)
            fibaro:setGlobal('netatmoCO2Int',co2)
            fibaro:call(209, "setProperty", "ui.Label1.value", ""..co2)             
			log("humidite_interne = " .. humidite_interne)
            fibaro:setGlobal('netatmoHumInt',humidite_interne)
            fibaro:call(204, "setProperty", "ui.Label1.value", ""..humidite_interne) 
			log("pression = " .. pression)
            fibaro:setGlobal('netatmoPressionInt',pression)
            fibaro:call(205, "setProperty", "ui.Label1.value", ""..pression)
			log("bruit = " .. bruit)
            fibaro:call(204, "setProperty", "ui.Label2.value", ""..bruit) 
            fibaro:setGlobal('netatmoBruitInt',bruit)

		end
	)
end
 
-- ------------------------------------------------------------------------
-- Mesure de l'unité chambre
-- ------------------------------------------------------------------------
function getMesuresChambre()
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity,CO2&date_end=last", 
		function(data)
			log("----------========== Module chambre ==========----------")
			temperature_chambre = data.body[1].value[1][1]
			humidite_chambre = data.body[1].value[1][2]
            CO2_chambre = data.body[1].value[1][3]
			log("CO2_chambre = " .. CO2_chambre)
            fibaro:setGlobal('netatmoCO2Chambre',CO2_chambre)
    fibaro:call(210, "setProperty", "ui.Label1.value", ""..CO2_chambre)      
            log("temperature_chambre = " .. temperature_chambre)
            fibaro:setGlobal('netatmoTempChambre',temperature_chambre)
    fibaro:call(206, "setProperty", "ui.Label1.value", ""..temperature_chambre)
			log("humidite_chambre = " .. humidite_chambre)
            fibaro:setGlobal('netatmoHumChambre',humidite_chambre)
    fibaro:call(203, "setProperty", "ui.Label1.value", ""..humidite_chambre)
fibaro:debug("test10");

      
		end
	)
end

-- ------------------------------------------------------------------------
-- Mesure de l'unité Vent
-- ------------------------------------------------------------------------
function getMesuresVent()
  log("vent")
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id=".."70:ee:50:02:ef:ee".."&module_id=".."06:00:00:00:16:c6".."&scale=max&type=GustAngle,WindAngle,WindStrength,GustStrength&date_end=last", 

--	getResponseData("https://api.netatmo.net/api/getmeasure?access_token=56c1c3e445a1e38b02a0a0e5|2b5f449d5d224136cb0e701a59452485&device_id=70:ee:50:02:ef:ee&module_id=02:00:00:02:dd:34&scale=max&type=Temperature,Humidity&date_end=last", 
		function(data)
			log("----------========== Module vent ==========----------")
			ventRafaleDirection = data.body[1].value[1][1]
			ventDirection = data.body[1].value[1][2]
            ventVitesse =data.body[1].value[1][3]
            ventRafaleVitesse = data.body[1].value[1][4]
			log("ventRafaleDirection = " .. ventRafaleDirection)
       		log("ventDirection = " .. ventDirection)
      		log("ventVitesse = " .. ventVitesse)
      		log("ventRafaleVitesse = " .. ventRafaleVitesse)
            fibaro:setGlobal('netatmoVentDir',ventDirection)
            fibaro:setGlobal('netatmoVentRaftDir',ventRafaleDirection)
            fibaro:setGlobal('netatmoVentvitesse',ventVitesse)
            fibaro:setGlobal('netatmoVentRafVit',ventRafaleVitesse)
    fibaro:call(21, "setProperty", "ui.Label1.value", ventVitesse  .. " Km/h")
  fibaro:call(21, "setProperty", "ui.Label2.value", ventRafaleDirection .. " °")
  fibaro:call(21, "setProperty", "ui.Label3.value", ventRafaleVitesse  .. " Km/h")
  fibaro:call(21, "setProperty", "ui.Label4.value", ventRafaleDirection .. " °")

      --		log("humidite_exterieur = " .. humidite_externe)
    --fibaro:call(207, "setProperty", "ui.Label1.value", ""..humidite_externe)
 
		end
	)
end

-- ------------------------------------------------------------------------
-- Mesure de l'unité exterieur
-- ------------------------------------------------------------------------
function getMesuresExt()
  log("test")
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id=".."70:ee:50:02:ef:ee".."&module_id=".."02:00:00:02:dd:34".."&scale=max&type=Temperature,Humidity&date_end=last", 

--	getResponseData("https://api.netatmo.net/api/getmeasure?access_token=56c1c3e445a1e38b02a0a0e5|2b5f449d5d224136cb0e701a59452485&device_id=70:ee:50:02:ef:ee&module_id=02:00:00:02:dd:34&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_exterieur = " .. temperature_exterieure)
            fibaro:setGlobal('netatmoTempExt',temperature_exterieure)
    fibaro:call(208, "setProperty", "ui.Label1.value", ""..temperature_exterieure)
			log("humidite_exterieur = " .. humidite_externe)
            fibaro:setGlobal('netatmoHumExt',humidite_externe)
    fibaro:call(207, "setProperty", "ui.Label1.value", ""..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();
--  debug("token" .. token)
	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])
            fibaro:setGlobal("pluieHeure",rains["hour"])

		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()
		    getMesuresChambre()
            getMesuresVent()
      		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)



 

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ton aide je regarde ca ce soir quand je rentre 

cdt

Partager ce message


Lien à poster
Partager sur d’autres sites

merci @doblanch pour le partage de ta scene tu pourrais partager ton code lua pour le VD correspondent a cette scene merci 

Partager ce message


Lien à poster
Partager sur d’autres sites

@doblanch Merci tout fonctionne j ai un peu modifié le code afin d'avoir que le vent mais cela peut être utile de tout avoir sur un module encore merci car j ai perdu quelques cheveux avec cette histoire:15::13::D

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 8 heures, flechg a dit :

@doblanch Merci tout fonctionne j ai un peu modifié le code afin d'avoir que le vent mais cela peut être utile de tout avoir sur un module encore merci car j ai perdu quelques cheveux avec cette histoire:15::13::D

cool que ca ai pu servir a quelqu'un , j'y avais passé un peu de temps !

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut à tous, je suis passé en 4.53 et depuis la 4.5x je n'ai plus de remontée sur cela scène. Il me mets une erreur de certificat. J'ai vu quelque chose sur un topic, je crois que c'était sur le topic d'une version de firmware mais je ne sais plus où. Y a t'il une astuce ?

Merci

image.thumb.png.a0eb1592992299f5dc2b1863a97fb343.png

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 15/01/2019 à 14:02, Yannick a dit :

Salut à tous, je suis passé en 4.53 et depuis la 4.5x je n'ai plus de remontée sur cela scène. Il me mets une erreur de certificat. J'ai vu quelque chose sur un topic, je crois que c'était sur le topic d'une version de firmware mais je ne sais plus où. Y a t'il une astuce ?

Merci

image.thumb.png.a0eb1592992299f5dc2b1863a97fb343.png

il faut remplacer le code par : 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,
            checkCertificate = false
        },
        success = function(response) 
        func(json.decode(response.data))
        end
    })   
end

 

--> en fait il faut ajouter checkCertificate = false

Partager ce message


Lien à poster
Partager sur d’autres sites

merci pour le renseignement ça fonctionne  :74: mais j'ai une erreur quelqu'un peut me dire à cause de quoi merci

 

[DEBUG] 19:59:54: Intégration Module Anémomètre NETATMO demarré
[DEBUG] 19:59:54: Compte Netatmo Connecté...
[DEBUG] 19:59:55: Recherche du Module...
[DEBUG] 19:59:56: Thermomètre 02:00:00:1b:2d:e0 Trouvé!
[DEBUG] 19:59:57: Thermomètre 03:00:00:02:9d:94 Trouvé!
[DEBUG] 19:59:57: Anémomêtre 06:00:00:02:56:a2 Trouvé!
[DEBUG] 19:59:57: Pluviomêtre 05:00:00:04:5a:34 Trouvé!
[DEBUG] 19:59:57: 2019-03-17 19:59:55.540652 [ fatal] LUA error: /opt/fibaro/scenes/281.lua:63: attempt to call global 'calcBat' (a nil value)
 

Partager ce message


Lien à poster
Partager sur d’autres sites

×