Aller au contenu

Station météo Netatmo


jimbo007be

Messages recommandés

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

Lien vers le commentaire
Partager sur d’autres sites

Invité chris6783

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

Lien vers le commentaire
Partager sur d’autres sites

  • 2 ans après...

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?

Lien vers le commentaire
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)

 

Lien vers le commentaire
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)

Lien vers le commentaire
Partager sur d’autres sites

  • 5 semaines après...

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?

Lien vers le commentaire
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.

Lien vers le commentaire
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) :(

 

 

 

Lien vers le commentaire
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
Lien vers le commentaire
Partager sur d’autres sites

  • 2 mois après...

Reste à voir ce qu'ils vont en faire. Moi je trouve qu'il manque des modules intérieurs temp.hygro pour les pièces humides par exemple, et que 2 sondes ça suffit pas. Quitte à gérer la température autant que ça se fasse bien et pas à moitié !

Lien vers le commentaire
Partager sur d’autres sites

Bon, bah j'espère qu'ils resteront ouvert, mais je pense que oui, aucun intérêt pour Legrand de fermer ça.

 

Par contre Benjy, moi j'ai pareil que Séb, j'ai aussi 5 modules avec une seule station, c'est déjà pas mal... Et dans le pool house je rajouterai une seconde station avec 2 autres modules interne et 1 externe.

 

Et je les trouve plutôt précis en temp/humidité.

Lien vers le commentaire
Partager sur d’autres sites

Yes yes. Mes 3 intérieurs sont pour les 3 SDBs de la maison, c'est top et petit dedans. Le principale est dans la pièce de vie principale.

L'extérieurs est au soleil dans la boite que j'ai acheté pour comme une vraie station météo.

 

Puis la second station ira dans l'extension/pool house : Principale dans la petite cuisine que je mets en pièce centrale, un petit dans la SDB et l'autre dans le local technique. Et l'extérieur ira lui à l'ombre, comme ça j'aurai les 2 valeurs dehors.

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...