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

×