Aller au contenu

Recommended Posts

Je ne te remercie pas, tu m'as couté 68€ ce matin :P

 

Merci pour ce bon plan, hop j'ai pris l'anémomètre afin de compléter ma collection d'objet dépendant du cloud  :rolleyes: . Ma station météo Netatmo sera ainsi complète :)

Partager ce message


Lien à poster
Partager sur d’autres sites

J'en suis vraiment désolé mon pauvre Lazer de t'avoir ainsi forcé la main ;)

Envoyé de mon SM-G928F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Tiens vous êtes contents de la portée de cet anémomètre ? Moi il est encore en test sur la terrasse et se trouve à9m de la station avec une baie vitrée de 5m en verre securit et il perd le connection quasiment tous les jours pendant plusieurs heures dans l'après midi.

Mon script de récupération des donnée bug si l anémomètre n'est pas joignable et le watchdog de @lazer me bonbarde de push en le relançant... je ne fixe pas le script et garde ainsi un moniteur de la liaison qui est plus que moyenne

Partager ce message


Lien à poster
Partager sur d’autres sites

Je n'ai pas ces module pour ma part...

Envoyé de mon SM-G928F en utilisant Tapatalk

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello, voila déja quelque temps qu'un script tourne sans soucis pour récup les info de la station (je me rappel plus l'auteur du script, désolé).

Depuis quelque temps j'ai une erreur sur la récupération du module extérieur avec ce msg d'erreur la:

[ fatal] LUA error: /opt/fibaro/scenes/55.lua:171: attempt to index field 'body' (a nil value)

 

Rappel du script: 

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

local n_client_id = "XXXX"
local n_client_secret = "XXXX"
local n_username = "XXXX"
local n_password = "XXXX"
 
local hc2_module_virtuel = 161  -- le module virtuel "Pluie"
 
local debug = true -- affiche ou non les message dans la console
 
local long_lat_adjust = 0.1 -- ajustement de la distance pour trouvé un pluviomètre
 
local version = 2.0
 
-- ------------------------------------------------------------------------
--   NE PAS TOUCHER
-- ------------------------------------------------------------------------
local force_use_rain_public = false
local loc = api.get("/settings/location")
local lat_ne = loc.latitude + long_lat_adjust
local lon_ne = loc.longitude + long_lat_adjust
local lat_sw = loc.latitude - long_lat_adjust
local lon_sw = loc.longitude - long_lat_adjust
 
local token = ""
local int_id = ""
local ext_id = ""
local ext_bat = 0
local rain_id = ""
local rain_bat = 0
 
local temperature_interieure = -1000
local temperature_exterieure = -1000
local co2 = -1000
local humidite_interne = -1000
local humidite_externe = -1000
local pression = -1000
local bruit = -1000
local rains = {hour = -1000, day = -1000, week = -1000, month = -1000}
 
-- ------------------------------------------------------------------------
-- Exécuté après chaque requète HTTP
-- ------------------------------------------------------------------------
function afterHttpRequest()
  if (temperature_interieure > -1000) then end
  if (temperature_exterieure > -1000) then end
  if (co2 > -1000) then end
  if (humidite_interne > -1000) then end
  if (humidite_externe > -1000) then end
  if (pression > -1000) then end
  if (bruit > -1000) then end
  if (rains["hour"] > -1000) then 
      if (rains["hour"] == -1) then 
          fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", "n/a") 
      else
        fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) 
      end
    end
  if (rains["day"] > -1000) then 
      if (rains["day"] == -1) then 
          fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", "n/a")
        else
        fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"])
          fibaro:setGlobal("Pluie24h", " "..rains["day"])
            fibaro:setGlobal("Pluie30j", " "..rains["month"])
        fibaro:setGlobal("TempExt", " "..temperature_exterieure)
      end
    end
  if (rains["week"] > -1000) then 
      if (rains["week"] == -1) then 
        fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", "n/a")
      else
        fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"])
      end
    end
  if (rains["month"] > -1000) then 
    if (rains["month"] == -1) then 
      fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", "n/a")
    else
      fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"])
    end
    end
end
 
-- ------------------------------------------------------------------------
-- Affichage dans la console
-- ------------------------------------------------------------------------
function log(message, force)
    force = force or false
  if (debug or force) then
    print(__convertToString(message))
    end
end
 
-- ------------------------------------------------------------------------
-- Retourne le niveau de batterie en pourcent
-- ------------------------------------------------------------------------
function calcBat(bat, ext)
  local max = 6000
    local min = 4200 
    if (ext) then
       max = 6000
       min = 3600      
    end
    if (bat > max) then bat = max end
    return math.floor(bat * 100 / max)
end
 
-- ------------------------------------------------------------------------
-- Arrondi
-- ------------------------------------------------------------------------
local function roundToNthDecimal(num, n)
  local mult = 10^(n or 0)
  return math.floor(num * mult + 0.5) / mult
end
 
-- ------------------------------------------------------------------------
-- Interrogation de l'API
-- ------------------------------------------------------------------------
function getResponseData(url, body, func)
  local http = net.HTTPClient()
  http:request(url, { 
    options = { 
      method = 'POST', 
          headers = {
        ["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"
      },
      data = body
    },
    success = function(response) 
      func(json.decode(response.data)) 
      afterHttpRequest()
    end,
    error = function(response) log(" ERROR !!! " .. url, true) end,
  })   
end
 
-- ------------------------------------------------------------------------
-- Mesures de l'unité interne
-- ------------------------------------------------------------------------
function getMesuresInt()
  getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last", 
    function(data)
      log("----------========== Module intérieur ==========----------")
      temperature_interieure = data.body[1].value[1][1]
      co2 = data.body[1].value[1][2]
      humidite_interne = data.body[1].value[1][3]
      pression = data.body[1].value[1][4]
      bruit = data.body[1].value[1][5]
      log("temperature_interieure = " .. temperature_interieure)
      log("co2 = " .. co2)
      log("humidite_interne = " .. humidite_interne)
      log("pression = " .. pression)
      log("bruit = " .. bruit)
    end
  )
end
 
-- ------------------------------------------------------------------------
-- Mesure de l'unité externe
-- ------------------------------------------------------------------------
function getMesuresExt()
  getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity&date_end=last", 
    function(data)
      log("----------========== Module extérieur ==========----------")
      temperature_exterieure = data.body[1].value[1][1]
      humidite_externe = data.body[1].value[1][2]
      log("temperature_exterieure = " .. temperature_exterieure)
      log("humidite_externe = " .. humidite_externe)
    end
  )
end
 
-- ------------------------------------------------------------------------
-- Obtention des informations sur un pluviomètre proche
-- ------------------------------------------------------------------------
function getRainNear()
  getResponseData("https://api.netatmo.net/api/getpublicdata","access_token="..token .. "&lat_ne="..lat_ne.."&lon_ne="..lon_ne.."&lat_sw="..lat_sw.."&lon_sw="..lon_sw, 
    function(data)
          --log(data)
          rains["week"] = -1
          rains["month"] = -1
          rains["hour"] = -1
          rains["day"] = -1
      log("----------==========     D  e  v  i  c  e  s    =========----------")
          for _, v in pairs(data.body) do
              for l, w in pairs(v.measures) do
                  if (type(w.rain_24h) ~= "nil") then
                rains["day"] = w.rain_24h
                rains["hour"] = w.rain_60min
                  end
              end
          end
          if (rains["day"] == -1000) then
            log("Impossible de trouver un pluviomètre à proximité, augmentez [long_lat_adjust]", true)
          else
               log("Pluie jour : " .. rains["day"])
               log("Pluie heure : " .. rains["hour"])
             
          end
    end
    )
end
 
-- ------------------------------------------------------------------------
-- Mesure du détecteur de pluie historique
-- ------------------------------------------------------------------------
function getMesuresRain(duree, variable)
  local now = os.time();
  getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale=1hour&type=sum_rain&real_time=true&date_begin="..os.date("!%c", (now - duree)), 
    function(data)
          log("----------========== Pluie histo ==========----------")
      local cumul  = 0
            for k, v in pairs(data.body) do
              for l, w in pairs(v.value) do
                  cumul = cumul + w[1]
              end
            end
          cumul = roundToNthDecimal(cumul, 2)
      rains[variable] = cumul
      log("rain["..variable.."] = " .. rains[variable])
    end
  )
end
 
-- ------------------------------------------------------------------------
-- Obtention des informations sur les devices
-- ------------------------------------------------------------------------
function getDevices()
  getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, 
    function(data)
      log("----------==========     D  e  v  i  c  e  s    =========----------")
          for _, v in pairs(data.body.modules) do
            if (v.data_type[1] == "Rain") then
                rain_id = v._id
                rain_bat = calcBat(v.battery_vp, true)
              else
                ext_id = v._id
                ext_bat = calcBat(v.battery_vp, true)
              end
          end
          int_id = data.body.devices[1]._id
          getMesuresInt()
      getMesuresExt()
          if (rain_id ~= "" and not force_use_rain_public) then
            getMesuresRain(60 * 60, "hour")
            getMesuresRain(60 * 60 * 24, "day")
            getMesuresRain(60 * 60 * 24 * 7, "week")
            getMesuresRain(60 * 60 * 24 * 30, "month")
          else
            getRainNear()
          end
    end
    )
end
 
-- ------------------------------------------------------------------------
-- Authentification
-- ------------------------------------------------------------------------
function auth(nextFunction)
  local request_body = "grant_type=password&client_id=" .. n_client_id .. "&client_secret=" .. n_client_secret .. "&username=" .. n_username .. "&password=" .. n_password .. "&scope=read_station"
  getResponseData("https://api.netatmo.net/oauth2/token", request_body, 
      function(data) 
      token = data.access_token
          log(token)
          nextFunction()
    end
  )
end
 
auth(getDevices)
log("Last request : "  .. os.date("%x - %X"), true)

La ligne 171, c'est donc bien juste en dessous du début de la récup du module extérieur.

Il n'y a pas eu de changement au niveau de la station..

 

Tiens, idée en même temps que j'écris. Le module aurait pu changer d'ID?

Partager ce message


Lien à poster
Partager sur d’autres sites

Tente avec cette version, netatmo avait changé quelques appels. Cette vesion fonctionne (hromis les API not found) qui n'ont pas d'impact.

 

local n_client_id = "XXXX"
local n_client_secret = "XXXX"
local n_username = "XXXX"
local n_password = "XXXX"
 
local hc2_module_virtuel = 161  -- 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.01

-- ------------------------------------------------------------------------
--   NE PAS TOUCHER
-- ------------------------------------------------------------------------
local force_use_rain_public = false
local loc = api.get("/settings/location")
local lat_ne = loc.latitude + long_lat_adjust
local lon_ne = loc.longitude + long_lat_adjust
local lat_sw = loc.latitude - long_lat_adjust
local lon_sw = loc.longitude - long_lat_adjust

local token = ""
local int_id = ""
local ext_id = ""
local ext_bat = 0
local rain_id = ""
local rain_bat = 0

local temperature_interieure = -1000
local temperature_exterieure = -1000
local co2 = -1000
local humidite_interne = -1000
local humidite_externe = -1000
local pression = -1000
local bruit = -1000
local rains = {hour = -1000, day = -1000, week = -1000, month = -1000}

-- ------------------------------------------------------------------------
-- Exécuté après chaque requète HTTP
-- ------------------------------------------------------------------------
function afterHttpRequest()
	if (temperature_interieure > -1000) then end
	if (temperature_exterieure > -1000) then 
  		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblTemp.value", temperature_exterieure .. "°C")     
  	end
	if (co2 > -1000) then
    	fibaro:setGlobal("CO2", co2)
  	end
	if (humidite_interne > -1000) then end
	if (humidite_externe > -1000) then 
  		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHum.value", humidite_externe .. "%") 
	end
	if (pression > -1000) then end
	if (bruit > -1000) then end
	if (rains["hour"] > -1000) then 
    	if (rains["hour"] == -1) then 
      		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", "n/a") 
     	else
    		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblHeure.value", " "..rains["hour"]) 
     	end
  	end
	if (rains["day"] > -1000) then 
    	if (rains["day"] == -1) then 
      		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", "n/a")
      	else
    		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblJour.value", " "..rains["day"])
    	end
    end
	if (rains["week"] > -1000) then 
  		if (rains["week"] == -1) then 
    		fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", "n/a")
    	else
  			fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblSemaine.value", " "..rains["week"])
  		end
    end
	if (rains["month"] > -1000) then 
		if (rains["month"] == -1) then 
			fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", "n/a")
		else
			fibaro:call(hc2_module_virtuel, "setProperty", "ui.lblMois.value", " "..rains["month"])
		end
   	end
end

-- ------------------------------------------------------------------------
-- Affichage dans la console
-- ------------------------------------------------------------------------
function log(message, force)
  	force = force or false
	if (debug or force) then
		print(__convertToString(message))
   	end
end

-- ------------------------------------------------------------------------
-- Retourne le niveau de batterie en pourcent
-- ------------------------------------------------------------------------
function calcBat(bat, ext)
	local max = 6000
    local min = 4200 
    if (ext) then
       max = 6000
       min = 3600      
    end
    if (bat > max) then bat = max end
    return math.floor(bat * 100 / max)
end

-- ------------------------------------------------------------------------
-- Arrondi
-- ------------------------------------------------------------------------
local function roundToNthDecimal(num, n)
  local mult = 10^(n or 0)
  return math.floor(num * mult + 0.5) / mult
end

-- ------------------------------------------------------------------------
-- Interrogation de l'API
-- ------------------------------------------------------------------------
function getResponseData(url, body, func)
	local http = net.HTTPClient()
	http:request(url, { 
		options = { 
			method = 'POST', 
        	headers = {
				["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"
			},
			data = body
		},
		success = function(response) 
			func(json.decode(response.data)) 
			afterHttpRequest()
		end,
		error = function(response) log(" ERROR !!! " .. url, true) end,
	})   
end

-- ------------------------------------------------------------------------
-- Mesures de l'unité interne
-- ------------------------------------------------------------------------
function getMesuresInt()
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last", 
		function(data)
			log("----------========== Module intérieur ==========----------")
			temperature_interieure = data.body[1].value[1][1]
			co2 = data.body[1].value[1][2]
			humidite_interne = data.body[1].value[1][3]
			pression = data.body[1].value[1][4]
			bruit = data.body[1].value[1][5]
			log("temperature_interieure = " .. temperature_interieure)
			log("co2 = " .. co2)
			log("humidite_interne = " .. humidite_interne)
			log("pression = " .. pression)
			log("bruit = " .. bruit)
			fibaro:startScene(41, {
    			{param1 = "https://maker.ifttt.com/trigger/temperature/with/key/bsq3BICI2o2mAWSK8-X51l"}, 
    			{param2 = "POST"},
    			{param3 = 'application/json'},
    			{param4 = json.encode({["value1"]=temperature_interieure, ["value2"]=humidite_interne, ["value3"]=co2})},
 			})  
		end
	)
end
 
-- ------------------------------------------------------------------------
-- Mesure de l'unité externe
-- ------------------------------------------------------------------------
function getMesuresExt()
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..ext_id.."&scale=max&type=Temperature,Humidity&date_end=last", 
		function(data)
			log("----------========== Module extérieur ==========----------")
			temperature_exterieure = data.body[1].value[1][1]
			humidite_externe = data.body[1].value[1][2]
			log("temperature_exterieure = " .. temperature_exterieure)
			log("humidite_externe = " .. humidite_externe)
		end
	)
end

-- ------------------------------------------------------------------------
-- Obtention des informations sur un pluviomètre proche
-- ------------------------------------------------------------------------
function getRainNear()
	getResponseData("https://api.netatmo.net/api/getpublicdata","access_token="..token .. "&lat_ne="..lat_ne.."&lon_ne="..lon_ne.."&lat_sw="..lat_sw.."&lon_sw="..lon_sw, 
		function(data)
      		--log(data)
      		rains["week"] = -1
      		rains["month"] = -1
      		rains["hour"] = -1
      		rains["day"] = -1
			log("----------==========     D  e  v  i  c  e  s    =========----------")
      		for _, v in pairs(data.body) do
              for l, w in pairs(v.measures) do
                  if (type(w.rain_24h) ~= "nil") then
            		rains["day"] = w.rain_24h
            		rains["hour"] = w.rain_60min
                  end
              end
        	end
      		if (rains["day"] == -1000) then
        		log("Impossible de trouver un pluviomètre à proximité, augmentez [long_lat_adjust]", true)
        	else
               log("Pluie jour : " .. rains["day"])
               log("Pluie heure : " .. rains["hour"])
	       	end
		end
    )
end

-- ------------------------------------------------------------------------
-- Mesure du détecteur de pluie historique
-- ------------------------------------------------------------------------
function getMesuresRain(duree, variable)
	local now = os.time();
	getResponseData("https://api.netatmo.net/api/getmeasure","access_token="..token.."&device_id="..int_id.."&module_id="..rain_id.."&scale=1hour&type=sum_rain&real_time=true&date_begin="..os.date("!%c", (now - duree)), 
		function(data)
     		log("----------========== Pluie histo ==========----------")
			local cumul  = 0
            for k, v in pairs(data.body) do
              for l, w in pairs(v.value) do
                  cumul = cumul + w[1]
              end
            end
      		cumul = roundToNthDecimal(cumul, 2)
			rains[variable] = cumul
			log("rain["..variable.."] = " .. rains[variable])
		end
	)
end

-- ------------------------------------------------------------------------
-- Obtention des informations sur les devices
-- ------------------------------------------------------------------------
function getDevices()
	getResponseData("https://api.netatmo.net/api/devicelist","access_token="..token, 
		function(data)
			log("----------==========     D  e  v  i  c  e  s    =========----------")
      		for _, v in pairs(data.body.modules) do
        		--fibaro:debug(v.module_name)
       			if (v.data_type[1] == "Rain") then
           			rain_id = v._id
           			rain_bat = calcBat(v.battery_vp, true)
          		elseif (v.module_name == "Module extérieur") then
          			ext_id = v._id
          			ext_bat = calcBat(v.battery_vp, true)
           		end
        	end
      		int_id = data.body.devices[1]._id
      		getMesuresInt()
			getMesuresExt()
      		log(rain_id)
      		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)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Impeccable merci,

Il faut que je regardes la différence entre les 2 codes pour comprendre le changement et pas simplement appliquer.

Il reste juste une petite erreur au niveau de l'historique de pluie.

 

[ fatal] LUA error: /opt/fibaro/scenes/55.lua:227: bad argument #1 to 'pairs' (table expected, got nil)

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai malheureusement la même erreur:

 

[DEBUG] 07:09:44: ----------========== Pluie histo ==========----------
[DEBUG] 07:09:44: [1;31m2018-09-08 07:09:44.206529 [ fatal] LUA error: /opt/fibaro/scenes/88.lua:221: bad argument #1 to 'pairs' (table expected, got nil)

 

@Steven Tu peu nous aider?

Partager ce message


Lien à poster
Partager sur d’autres sites

@MasterBT, @speedoxx007 Est-ce que vos module "Pluie" sont toujours bien reconnu par votre station. 

 

Perso, j'utilise le code posté juste 2 messages au dessus et il fonctionne bien (j'ai encore vérifié la pluie). Cette version du code est dite "optimiste" c'est à dire qu'elle ne contrôle pas quand une donnée est manquante, il faudrait que j'y rajoute quelques "if" pour la sécurisé si besoin. Mais vérifié d'abord vos modules s.v.p.

 

J'ai aussi vérifié chez Netatmo, ils n'ont pas (re)changé leur API.

Partager ce message


Lien à poster
Partager sur d’autres sites

@Steven

Je viens de vérifier chez Netatmo et mon pluviomètre est bien connecté à ma station Netatmo et aussi dans le VD Rain sensor 2.0:

 

image.png.7c5fce8d6a8d5cdd3b8784b491ec7bda.png

 

J'ai toujours l'erreur: [1;31m2018-09-08 07:09:44.206529 [ fatal] LUA error: /opt/fibaro/scenes/88.lua:221: bad argument #1 to 'pairs' (table expected, got nil) :(

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je ne connais pas ce VD, mais apparemment, son code est plus solide que le mien :13:

Partager ce message


Lien à poster
Partager sur d’autres sites

Lol :2:, son code est basé sur le mien ... sauf que lui la fait évoluer correctement. Je regarde cela dès que possible.

 

Edit ... Mais pourquoi ne pas utilisé exclusivement le sien qui est bien mieux ?

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui pourquoi pas. Mais comment reprendre les valeurs? Je suis nul en LUA... :wacko:

Modifié par speedoxx007

Partager ce message


Lien à poster
Partager sur d’autres sites

Pas de soucis coté module pluie.

Je vais regardé le code de ce VD

Partager ce message


Lien à poster
Partager sur d’autres sites

J'ai commencé à modifié le VD Rain_sensor_2.0 et j'ai ajouté comme je pouvais la prevision de pluie. Cela fonctionne. Mais le calcul pour "Arrosage" ne fonctionne pas encore. Que fait je de faux?

Rain_sensor_2.0.vfib

Modifié par speedoxx007

Partager ce message


Lien à poster
Partager sur d’autres sites

×