Aller au contenu
minos

Netatmo Anemometre

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

Bonjour

Je reviens vers vous car le vd de ce liens ne fonctionne plus chez moi depuis un moment

https://www.siio.de/netatmo-windmesser-ins-fibaro-homecenter-2-integrieren-so-gehts/

J'ai l’erreur suivante

[DEBUG] 18:59:10: netatmo-Windsensor Integration v.1.0 gestartet.
[DEBUG] 18:59:10: 2020-07-06 18:59:09.724388 [ fatal] LUA error: /usr/share/lua/5.2/json/decode/util.lua:35: unexpected character @ character: 1 0:1 [H] line:
[DEBUG] 18:59:10: H

 

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour

 

J'ai a nouveau un probleme récurant avec la scène qui interroge le module vent

 [DEBUG] 23:25:50: 2020-10-01 23:25:50.885448 [ fatal] LUA error: /opt/fibaro/scenes/208.lua:80: attempt to index field 'body' (a nil value)
ou encore 
 [DEBUG] 00:16:55: 2020-10-04 00:16:55.734663 [ fatal] LUA error: /opt/fibaro/scenes/208.lua:56: attempt to index field 'body' (a nil value)

d’où peut venir l'erreur

Le module scène fonctionne quelques heures, voir quelques jours puis j'ai cette erreur

Je suis obliger de stopper puis de la relancer pour que cela puisse fonctionner

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

personne pour un petit coup de main?

oui bien y a t'il une autre solution pour utiliser ce module netatmo?

car franchement il n'a jamais fonctionner comme il faut dans mon HC2

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon je pense avoir trouvé la solution

https://www.siio.de/netatmo-regen-windmesser-im-fibaro-homecenter-2/

Il y a une amélioration de la connexion a netatmo sur le liens ci dessus

J'ai a la base la version du VD qui ne gère que le module vent

Depuis il y a eu une autre version qui gère en plus le module pluie (que je n'arrive pas a faire fonctionner), mais dont la connexion a netatmo a été amélioré

 

Citation

Correctif: le script ne plante plus si l'API ne peut pas être atteint par netatmo, mais émet à la place un message d'erreur quels que soient les paramètres de débogage

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Bonjour a tous

 

Je tente de faire fonctionner le pluviomètre dans une VD a partir d"une scène qui collecte les information depuis cela

https://www.siio.de/netatmo-regen-windmesser-im-fibaro-homecenter-2/

 

La partie anémomètre fonctionne comme il faut

La partie pluviomètre ne fonctionne pas

 

J'ai cette erreur

[DEBUG] 11:06:12: 2020-10-17 11:06:12.618045 [ fatal] LUA error: /opt/fibaro/scenes/208.lua:178: attempt to concatenate global 'int_id' (a nil value)

La ligne 170 est la suivante

 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 - dauer)),

 

La question est quel sont les variables a créer pour la pluie?

j'ai créer cela mais je ne suis pas sur que cela soit les bonnes

rain_day

rain_hour

rain_month

rain_week

 

voici mon code que j'ai en partie traduit et modifier

 

Citation

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

-- ------------------------------------------------------------------------
--ADAPTER CES DONNÉES
-- ------------------------------------------------------------------------

local client_id = ''
local client_secret = ''
local username = ''
local password= ''
local refresh = 300
local debug = 1
 
local vd_ID = 776 --ID de la scéne virtuel


-- ------------------------------------------------------------------------
--   NE PAS TOUCHER
-- ------------------------------------------------------------------------
local token = ''
local request_body = ''
local rains = {hour = -1000, day = -1000, week = -1000, month = -1000}
 
local sourceTrigger = fibaro:getSourceTrigger()
 
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
DebugError = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
Debug( 'orange', 'intégration du module complémentaire netatmo a démarré.' )
Debug( 'white', 'Les données sont mises à jour toutes les 5 minutes. Si debug = 0, rien est débogué' )
 
function oAuth(nextFunction)
 local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=read_station'
 getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
     function(data)
      if (data.access_token ~= nil) then
        token = data.access_token
        if (debug == 1) then
        Debug( 'green', 'oAuth 2.0 effectué.' )
        end
        getDevices()
        fibaro:call(vd_ID, 'pressButton', '9')
      else
        DebugError( 'red', 'oAuth 2.0 konnte nicht durchgeführt werden! Bitte die Anmeldedaten überprüfen')
      end
    end
    )
    setTimeout(oAuth, refresh*1000);
end
 
function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
    checkCertificate = false,    
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response) 
 func(json.decode(response.data))
 end
 })   
end

 
function getDevices()
 getResponseData('https://api.netatmo.net/api/devicelist','access_token='..token, 
 function(data)
 if (data.body ~= nil) then
        
  if (debug == 1) then
    Debug( 'green', 'Recherche des capteurs netatmo...' );
  end
        
  for _, v in pairs(data.body.modules) do
       --fibaro:debug('Tabelle auslesen')
           if (v.data_type[1] == 'Rain') then
              rain_id = v._id
              if (debug == 1) then
                Debug( 'green', 'Capteur de pluie N°   ' ..rain_id.. ' trouvé...' );
              end
             if rain_id ~= nil then
                getSumRain(60 * 60, 'hour')
                getSumRain(60 * 60 * 24, 'day')
                getSumRain(60 * 60 * 24 * 7, 'week')
                getSumRain(60 * 60 * 24 * 30, 'month')
             end
            
           elseif (v.data_type[1] == 'Temperature') then
           extern_id = v._id
           if (debug == 1) then
           Debug('orange', 'Capteur extérieur N°  ' .. extern_id .. ' trouvé...')
           end 
            
           elseif (v.data_type[1] == 'Wind') then
              wind_id = v._id
              if (debug == 1) then
                Debug( 'green', 'Capteur de vent N°  ' ..rain_id.. ' trouvé...' );
              end
              if wind_id ~= nil then
                getmeasureWind()
              end
           end
         int_id = data.body.devices[1]._id
         end
  else
      DebugError( 'red', 'Echec lecture liste périphériques! Veuillez attendre la prochaine exécution')
  end
 end
    )
end
 
function getmeasureWind()
   request_body_wind = 'access_token='..token..'&device_id='..int_id..'&module_id='..wind_id..'&scale=max&type=WindStrength,WindAngle,GustStrength,GustAngle&date_end=last'
   getResponseData('https://api.netatmo.net/api/getmeasure', request_body_wind, 
 function(getData)
   if (getData.body ~= nil) then
      if (debug == 1) then
        Debug( 'green', 'anémomètre est lu ...' );
      end
        
       WindStrength = getData.body[1].value[1][1]
       WindAngle = getData.body[1].value[1][2]
       GustStrength = getData.body[1].value[1][3]
       GustAngle= getData.body[1].value[1][4]
        
       if (debug == 1) then
        Debug( 'green', 'Vitesse du vent: ' .. WindStrength .. ' km/h' );
        Debug( 'green', 'Direction du vent: ' .. WindAngle .. ' °')
        Debug( 'green', 'Rafales de vent: ' .. GustStrength .. ' km/h')
        Debug( 'green', 'Direction rafales de vent: ' .. GustAngle .. ' °')
       end
        
        if fibaro:getGlobalValue('windstaerke') ~= nil then
        fibaro:setGlobal('windstaerke', WindStrength) 
       else
        DebugError( 'red', 'Variable windstaerke Force du vent introuvable. Veuillez la créer')
       end
       if fibaro:getGlobalValue('windrichtung') ~= nil then
        fibaro:setGlobal('windrichtung', WindAngle)
       else
        DebugError( 'red', 'Variable windrichtung Direction du vent introuvable. Veuillez la créer')
       end
       if fibaro:getGlobalValue('boenstaerke') ~= nil then
        fibaro:setGlobal('boenstaerke', GustStrength)
       else
        DebugError( 'red', 'Varible boenstaerke introuvable. Veuillez la créer')
       end
       if fibaro:getGlobalValue('boenrichtung') ~= nil then
        fibaro:setGlobal('boenrichtung', GustAngle)
       else
        DebugError( 'red', 'Variable boenrichtung Direction du vent introuvable. Veuillez la créer')
       end 
       if (debug == 1) then
        Debug( 'green', 'La lecture de anémomètre terminée.' );
       end
       else
       DebugError( 'red', 'Appel API non effectué! API non disponible! Veuillez attendre la prochaine exécution.')
       end
 	end
 )
end

function getSumRain(dauer, 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 - dauer)),  function(data)
       local sum_rain  = 0
            for k, v in pairs(data.body) do
              for l, w in pairs(v.value) do
                  sum_rain = sum_rain + w[1]
              end
            end
            if fibaro:getGlobalValue('rain_' ..variable) ~= nil then
               fibaro:setGlobal('rain_' ..variable, sum_rain)
            else
            DebugError( 'red', 'Varible rain_' ..variable.. ' pas trouvé. Veuillez créer ')
            end
          if (debug == 1) then
           fibaro:debug('Regenmenge: ' ..sum_rain.. ' mm2 (' .. variable .. ')')
          end
 end
 )
end

if (sourceTrigger["type"] == "autostart") then
 oAuth();
end

 

 

Modifié par flacon030
Sujet fusionné

Partager ce message


Lien à poster
Partager sur d’autres sites

 Tu devrais cacher tes identifiants au début de ta scène si tu ne veux pas avoir de problèmes.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

J'avance doucement

Je viens de trouver une dernier version ci dessous qui fonctionne presque après quelques modifications pour la connexion (ajouter "checkCertificate = false")

function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
            checkCertificate = false,
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response) 
 func(json.decode(response.data))
 end
 })   
end

Je me connecte a netatmo

La relève des capteur se fait

Je peut les lire dans le VD les valeurs relevés

Mais les valeurs pour la pluie sont toutes les même que se soit pour: l'heure, le jour, la semaine, le mois

Tous est a 51,106

C'est un bug de netatmo oui bien de la scène?

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

-- ------------------------------------------------------------------------
--ADAPTER CES DONNÉES
-- ------------------------------------------------------------------------

local client_id = ''
local client_secret = ''
local username = ''
local password= ''

 
local vd_ID = 776 --ID de la scéne virtuel


local max_counter = 4
local refresh = 300
local debug = 1
------------------------------------------------------

-- AB HIER NICHTS MEHR ANPASSEN
local token = ''
local request_body = ''
local rains = {hour = -1000, day = -1000, week = -1000, month = -1000}
 
local sourceTrigger = fibaro:getSourceTrigger()
 
Debug = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end
 
DebugError = function ( color, message )
  fibaro:debug(string.format('<%s style="color:%s;">%s', "span", color, message, "span"))
end

Debug( 'orange', 'netatmo v.2.0 (NEW API) - Autostart' )
Debug( 'white', 'Refresh-Time: ' ..(refresh/60) )

function globalVar(var,val)
  local http = net.HTTPClient()
  http:request("http://127.0.0.1:11111/api/globalVariables", {
    options = {
    method = 'POST',
    headers = {},
    data = '{"name":"'..var..'","value":"'..val..'"}',
    timeout = 10000
  },
  success = function(response)
            local result = response.data;
            if response.status == 200 or response.status == 201 then
              fibaro:debug('Status: ' ..response.status.. ' - Variable ' ..var.. ' wurde angelegt')
            else
              fibaro:debug('Error: ' ..response.status.. ' - Zugriff verweigert')
            end
            end,
  error = function(err)
          fibaro:debug('[ERROR] ' .. err)
          end
  })
end

function oAuth(nextFunction)
 local request_body = 'grant_type=password&client_id=' .. client_id .. '&client_secret=' .. client_secret .. '&username=' .. username .. '&password=' .. password .. '&scope=read_station'
 getResponseData('https://api.netatmo.net/oauth2/token', request_body, 
     function(data)
      if (data.access_token ~= nil) then
        token = data.access_token
        --fibaro:debug(token)
        if (debug == 1) then
        Debug( 'green', 'oAuth 2.0 durchgeführt.' )
        end
        getDevices()
      else
        DebugError( 'red', 'oAuth 2.0 konnte nicht durchgeführt werden! Bitte die Anmeldedaten überprüfen')
      end
    end
    )
    setTimeout(oAuth, refresh*1000);
end
 
function getResponseData(url, body, func)
 local http = net.HTTPClient()
 http:request(url, { 
 options = { 
            checkCertificate = false,
 method = 'POST', 
         headers = {
 ['Content-Type'] = 'application/x-www-form-urlencoded;charset=UTF-8'
 },
 data = body
 },
 success = function(response) 
 func(json.decode(response.data))
 end
 })   
end
 
function getDevices()
 getResponseData('https://api.netatmo.net/api/getstationsdata','access_token='..token, 
 function(data)
 if (data.body ~= nil) then   
  if (debug == 1) then
    Debug( 'green', 'netatmo Sensoren werden gesucht...' );
  end
       --fibaro:debug(data.body.modules.data_type[1])
  for _, v in pairs(data.body.devices) do
         int_id = v._id
  		   Debug( 'green', 'Mainstation: ' ..int_id.. ' erkannt.' )
         local counter = 1
          while (counter < max_counter) do
           if (v.modules[counter].data_type[1] == 'Rain') then
              rain_id = v.modules[counter]._id
              if (debug == 1) then
                Debug( 'green', 'Regensensor ' ..rain_id.. ' erkannt.' )
              end
              if rain_id ~= nil then
                getSumRain(60 * 60, 'hour')
                getSumRain(60 * 60 * 24, 'day')
                getSumRain(60 * 60 * 24 * 7, 'week')
                getSumRain(60 * 60 * 24 * 30, 'month')
              end
           elseif (v.modules[counter].data_type[1] == 'Wind') then
              wind_id = v.modules[counter]._id
              if (debug == 1) then
                Debug( 'green', 'Windmesser ' ..wind_id.. ' erkannt.' );
              end
              if wind_id ~= nil then
                getmeasureWind()
              end
           end
           counter = counter + 1
           fibaro:sleep(3*1000)
         end
        end
  else
      DebugError( 'red', 'device-list konnte nicht abgefragt werden! Bitte nächsten Durchlauf abwarten')
  end
 end
    )
end
 
function getmeasureWind()
   request_body_wind = 'access_token='..token..'&device_id='..int_id..'&module_id='..wind_id..'&scale=max&type=WindStrength,WindAngle,GustStrength,GustAngle&date_end=last'
   getResponseData('https://api.netatmo.net/api/getmeasure', request_body_wind, 
 function(getData)
   if (getData.body ~= nil) then
       WindStrength = getData.body[1].value[1][1]
       WindAngle = getData.body[1].value[1][2]
       GustStrength = getData.body[1].value[1][3]
       GustAngle= getData.body[1].value[1][4]
       if (debug == 1) then
        Debug( 'green', 'Windgeschwindigkeit: ' .. WindStrength .. ' km/h' );
       end
        if fibaro:getGlobalValue('windstaerke') ~= nil then
        fibaro:setGlobal('windstaerke', WindStrength)
       else
        DebugError( 'red', 'Varible windstaerke nicht gefunden. Wird erstellt.')
        globalVar('windstaerke', WindStrength)
       end
       if fibaro:getGlobalValue('windrichtung') ~= nil then
        fibaro:setGlobal('windrichtung', WindAngle)
       else
        DebugError( 'red', 'Varible windrichtung nicht gefunden. Wird erstellt.')
        globalVar('windrichtung', WindAngle)
       end
       if fibaro:getGlobalValue('boenstaerke') ~= nil then
        fibaro:setGlobal('boenstaerke', GustStrength)
       else
        DebugError( 'red', 'Varible boenstaerke nicht gefunden. Wird erstellt.')
        globalVar('boenstaerke', GustStrength)
       end
       if fibaro:getGlobalValue('boenrichtung') ~= nil then
        fibaro:setGlobal('boenrichtung', GustAngle)
       else
        DebugError( 'red', 'Varible boenrichtung nicht gefunden. Wird erstellt.')
        globalVar('boenrichtung', GustAngle)
       end 
   else
     DebugError( 'red', 'API-Call konnte nicht durchgeführt werden! API nicht erreichbar! Bitte nächsten Durchlauf abwarten.')
   end
 end
 )
end
 
function getSumRain(dauer, 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 - dauer)), 
		function(data)
      		local sum_rain  = 0
            for k, v in pairs(data.body) do
              for l, w in pairs(v.value) do
                  sum_rain = sum_rain + w[1]
              end
            end
            if fibaro:getGlobalValue('rain_' ..variable) ~= nil then
               fibaro:setGlobal('rain_' ..variable, sum_rain)
            else
            DebugError( 'red', 'Varible rain_' ..variable.. ' nicht gefunden. Wird erstellt.')
            globalVar('rain_' ..variable, sum_rain)
            end
          if (debug == 1) then
          	fibaro:debug('Regenmenge: ' ..sum_rain.. ' mm2 (' .. variable .. ')')
          end
		end
	)
end
 
if (sourceTrigger['type'] == 'autostart') then
 oAuth();
end

 

Modifié par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

×