Aller au contenu

sebcbien

Membres confirmés
  • Compteur de contenus

    4 189
  • Inscription

  • Dernière visite

  • Jours gagnés

    85

Tout ce qui a été posté par sebcbien

  1. J'insiste... C'est mJpeg... Ça n'a "rien" àvoir avec le MPEG. C'est un flux d'images jpeg individuelles... Compression pas terrible mais très facile àdécoder, dans les browser entre autres. D'où son intérêt pour certaines applications. Sent from my SM-N910F using Tapatalk
  2. tout a fait d'accord, des "thumbnails mjpeg sont suffisantes et très pratiques pour jeter un coup d'oeil. L'enregistrement de qualité, c'est pour le syno
  3. Pour la hc2 mjpeg non ? Sent from my SM-N910F using Tapatalk
  4. Houlà... Non c'est une vieille version que tu as... Downloade la dernière de github (dans ma signature) ou ici plis haut il y a le lien Sent from my SM-N910F using Tapatalk
  5. Aie... Il n'a pas été prévu pour ça... Je ne suis pas devant mon PC, mais de mémoire dans la boucle principale (la boucle while true do a la fin), il y a une ligne commentée qui permet de forcer la variable sunset unix hour. Essaye avec Midnight + 15*60... Mais sans garantie Sent from my SM-N910F using Tapatalk
  6. que veux-tu dire pas intégrée ?il n'y a pas de profil exact ? Mais elle fonctionne en ONVIF apparement, donc c bon non ? tu n'utilises pas surveillance station ?
  7. Cool !! Effectivement ils ont de bonnes review, Dahua aussi apparemment. J'avais vu celle là : http://www.amazon.com/Hikvision-DS-2CD2432F-IW-Indoor-Camera-2-8mm/dp/B00JWCV9CU/ref=pd_sim_421_40?ie=UTF8&refRID=0KSW0DKJBX5R3AM6V13B Si en plus Hikvision fonctionne bien avec Syno/HC2 :-) Pour Ali, pour avoir beaucoup acheté là bas, ce sont des bons prix y'a rien a dire. Il faut juste faire une croix pour la garantie, rien que les frais de port sont dissuasifs...
  8. Bah heuu oui enfin heuuu mes huacam sur amazon.co.uk étaient à69 euro et venaient de Chine.... Elles avaient tout ce que je veux sauf le son... De toute façon, àpart axis (produit en Thaïlande...), tout est fabriqué en Chine, ici on se contente de mettre un logo dessus hein ;-) ... Qui est encore capable de faire la concurrence aux chinois en Europe ??? Sinon j'ai une axis 212 ptz achetée 250€ d'occasion, les huacam sont moins stables mais l'image est bien meilleure... Bref, je regarde vers des foscam et autres, il y en a qui marchent mieux que d'autres. Sent from my SM-N910F using Tapatalk
  9. ben j'ai été dans ifttt, j'ai pris la recette gmail vers gdrive spreadsheet j'ai mis ça comme "template": {{ReceivedAt}} ||| {{FromAddress}} ||| {{Subject}} ||| {{BodyPlain}} ceci comme format pour la ligne call(push_dev .... dans ton script: -- test si la variable a été modifiée LastVarValue = variables[1][1] .. ' = ' .. variables[1][2] .. ' [' .. os.date("%d/%m/%Y %H:%M:%S", variables[1][3]).. ']' if LastVarValue ~= LastVarChanged then fibaro:setGlobal('LastVarChanged', LastVarValue) fibaro:debug('Changed variable : ' ..LastVarValue) -- envoie e-mail fibaro:call(push_dev, "sendEmail", "Changed variable", variables[1][1] .. '|=|' .. variables[1][2] .. '|' .. os.date("%d/%m/%Y|%H:%M:%S", variables[1][3])) end et ça comme formule dans la feuille de calcul google. =SPLIT(D15,"|",FALSE) la base quoi :-)
  10. J'ai utilisé aussi ifttt (première fois que je le trouve utile d'ailleurs) avec l'envoi de mail gmail, mais j'ai mis un séparateur unique entre les "champs". Ici j'ai utilisé | Et la formule ci-dessus suffit àdécouper les colonnes. Rien de très différent donc Sent from my SM-N910F using Tapatalk
  11. Bonjour, Je cherche une caméra intérieure dans les 100€. - si possible avec au moins 1.3Mpix avec un angle correct (pour mettre dans un coin) - infrarouge - son bi-directionnel - Alimentation POE 802.11af (donc POE actif) car j'ai investi dans un routeur POE - a mettre au plafond, donc couleur claire (blanc idéal) Mes précédentes sont des huacam, mais j'ai passé beaucoup de temps à les configurer, elles plantent et rebootent 1fois par semaine et ne sont plus en ventes. Donc si vous pouvez me donner des marques qui vous ont donné entière satisfaction dans cette gamme de prix, je prends ! Merci ! :-)
  12. deux façons de penser différentes, moi je structure la source pour décoder facilement la destination, toi c'est l'inverse ;-)
  13. Quel service pourri quand même... On ne peut définitivement pas faire confiance aux Belges Sent from my SM-N910F using Tapatalk
  14. si je peux me permettre ... (tu ne te permet surtout rien du tout, tu vas d'abord me soigner cette vilaine peau et puis peut être tu te permettra) ;-) avec un formatage email comme ceci: -- test si la variable a été modifiéeLastVarValue = variables[1][1] .. ' = ' .. variables[1][2] .. ' [' .. os.date("%d/%m/%Y %H:%M:%S", variables[1][3]).. ']' if LastVarValue ~= LastVarChanged then fibaro:setGlobal('LastVarChanged', LastVarValue) fibaro:debug('Changed variable : ' ..LastVarValue) -- envoie e-mail fibaro:call(push_dev, "sendEmail", "Changed variable", variables[1][1] .. '|=|' .. variables[1][2] .. '|' .. os.date("%d/%m/%Y|%H:%M:%S", variables[1][3])) end On peut utiliser cette formule =SPLIT(D15,"|",FALSE) dans google sheets et avoir son log bien découpé avec chaque partie découpée en colonnes: .[ Variable ][ Operateur (=) ][ Valeur ][ Date ][ Heure ] Après, pour filtrer les éléments "X" ça devient beaucoup plus facile Et merci encore !
  15. voici 3 captures d'écran, j'espère que ça va aider. Tu as fait un reload configuration pour que les switchs apparaissent ?
  16. Oki, voici la version 3.2 :-) Voici le Virtual device, il faut uniquement changer le emoncms id dans le code du bouton update et "c'est tout". Netatmo_Thermostat V3.2.vfib ----------------------------------------------------------------------------------------- -- Thermtatmo v3 -- Retreive Netatmo values for more than 2 modules, compute CO2 and push to EmonCMS -- Sebastien Jauquet -- Aoà»t 2015 -- Thanks to cedriclocqueneux, krikroff, i-magin and all contibutors to the netatmo code ----------------------------------------------------------------------------------------- -- Instructions: -- Create an free emoncms.org account -- Retrieve your Write API Key from it -- Create a Global variable (undefined) -> CO2_Max_Value to store the max value of CO2 of the house - if you dont need this, set CO2 to false (default: 0) -- Install my thermtatmo.php in your webserver and write his address in the ip Address of this module -- for each value you want to be pushed to emoncms, modify the section -- Push To EMONCMS -- below -- Create a block scene or use gea to click this button each 10 minutes (to avoid rejection from the api of Netatmo) -- V2.01 -- First released version -- V2.2 -- doesn't push to emonCMS if netatmo query return false -- V2.3 -- added push message to phone if error -- V3 -- changed name and added Netatmo thermostat retrieve and push modes away and program -- V3.1 -- Added customisation options for code Sharing -- V3.2 -- Added Frost Guard Mode and possibility for two thermostats local id = { PHONE_SEB = 1323, PHONE_GG = 53 } -- Prefix of the id of the inputs to be created in emoncms -- Use this for testing to not mess your current feeds with wrong values while testing -- When everything is ok, restore original prefix. I suggest "NETATMO_" and delete on emoncms the inputs created for testing -- local EmonCMS_Prefix = "NETATMO_" local EmonCMS_Prefix = "NETATMO_" ------------------------------------------------------------------------- local PushToEmonCMS = true -- true = push to emoncms - false = do not push local Thermostat = true -- true = get thermostat values - false = do not get them local VMC = true -- true = set in Global variable CO2_Max_Value the Max CO2 Value local selfId = fibaro:getSelfId(); local thismodule=fibaro:getSelfId() local domaine = fibaro:get(selfId, 'IPAddress') local PushItem local DoNotPush_Error = false local activatePush = false; -- activate push when netatmo error detected local ID_Smartphones = {id["PHONE_SEB"]}; -- list of device receiving Push local CO2_Max_Value_Local = 0 -- if you dont need this, set CO2 to false (default: 0) local emoncms = Net.FHttp("emoncms.org",80) local emoncms_api_key = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX" -- your EMONCMS WRITE api Key -- IDs générés le : 16/08/15 à 02:13:29 local id = { --Coin Chaudière TEMP_EAU_REZ = 1360, TEMP_EAU_BOILER = 1362, TEMP_EAU_1ER = 1361, --Grenier TEMP_GRENIER = 1359, } EmonCMS = {}; if (temperature_exterieure==nil) then temperature_exterieure = ""; end if (humidite_exterieure==nil) then humidite_exterieure = ""; end if (temperature_interieure==nil) then temperature_interieure = ""; end if (humidite_interieure==nil) then humidite_interieure = ""; end if (co2==nil) then co2 = ""; end if (pression==nil) then pression = ""; end if (bruit==nil) then bruit = ""; end if (temperature_int_mod2==nil) then temperature_int_mod2 = ""; end if (humidite_int_mod2==nil) then humidite_int_mod2 = ""; end if (co2_mod2==nil) then co2_mod2 = ""; end if (temperature_int_mod3==nil) then temperature_int_mod3 = ""; end if (humidite_int_mod3==nil) then humidite_int_mod3 = ""; end if (co2_mod3==nil) then co2_mod3 = ""; end if (temperature_int_mod4==nil) then temperature_int_mod4 = ""; end if (humidite_int_mod4==nil) then humidite_int_mod4 = ""; end if (co2_mod4==nil) then co2_mod4 = ""; end if (temperature_max==nil) then temperature_max = ""; end if (temperature_min==nil) then temperature_min = ""; end -- therm1 = 1er if (temperature_therm1==nil) then temperature_therm1 = ""; end if (temperature_setpoint_therm1==nil) then temperature_setpoint_therm1 = ""; end if (relay_therm1==nil) then relay_therm1 = ""; end -- therm2 = rez if (temperature_therm2==nil) then temperature_therm2 = ""; end if (temperature_setpoint_therm2==nil) then temperature_setpoint_therm2 = ""; end if (relay_therm2==nil) then relay_therm2 = ""; end if(refreshUI==nil) then -- Loads in memory only the first occurence function refreshUI(therm, therm2, therm1, ext, bruit, titre, tempmod, co2mod, humidmod, lastupdate, laststatus) fibaro:call(selfId,"setProperty","ui.thermstatus.value",therm); fibaro:call(selfId,"setProperty","ui.thermostat2.value",therm2); fibaro:call(selfId,"setProperty","ui.thermostat1.value",therm1); fibaro:call(selfId,"setProperty","ui.ext.value",ext); fibaro:call(selfId,"setProperty","ui.bruit.value",bruit); fibaro:call(selfId,"setProperty","ui.titre.value",titre); fibaro:call(selfId,"setProperty","ui.tempmod.value",tempmod); fibaro:call(selfId,"setProperty","ui.co2mod.value",co2mod); fibaro:call(selfId,"setProperty","ui.humidmod.value",humidmod); fibaro:call(selfId,"setProperty","ui.lastupdate.value",lastupdate); fibaro:call(selfId,"setProperty","ui.laststatus.value",laststatus); end; end pushMessage = function (sendPush) if (activatePush) then for i=1, #ID_Smartphones do fibaro:call(tonumber(ID_Smartphones[i]), 'sendPush', sendPush); fibaro:debug(string.format('<%s style="color:%s;">%s</%s>', "span", "orange", "Push message ("..sendPush..") sent to mobile: "..tonumber(ID_Smartphones[i]), "span")); end end end if(getTherm1==nil) then -- Loads in memory only the first occurence function getTherm1(retry) retry = retry or 0 -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo extérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=therm1"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_therm1 = result.body.measured.temperature or "n.c"; --fibaro:debug(temperature_therm1) temperature_setpoint_therm1 = result.body.measured.setpoint_temp or "n.c"; --fibaro:debug(temperature_setpoint_therm1) relay_therm1 = result.body.therm_relay_cmd or "n.c"; --fibaro:debug(relay_therm1) -- variable globale pour info sms local msg = "Température Thermostat 1 : "..temperature_therm1.."°C"; --fibaro:setGlobal("tempext", msg); return true; else fibaro:debug("Netatmo Therm1: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo Therm1: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo Therm1:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getInt(tonumber(retry+1)); else return false; end end; end if(getTherm2==nil) then -- Loads in memory only the first occurence function getTherm2(retry) retry = retry or 0 -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo extérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=therm2"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_therm2 = result.body.measured.temperature or "n.c"; --fibaro:debug(temperature_therm1) temperature_setpoint_therm2 = result.body.measured.setpoint_temp or "n.c"; --fibaro:debug(temperature_setpoint_therm1) relay_therm2 = result.body.therm_relay_cmd or "n.c"; --fibaro:debug(relay_therm1) -- variable globale pour info sms local msg = "Température Thermostat 2 : "..temperature_therm2.."°C"; --fibaro:setGlobal("tempext", msg); return true; else fibaro:debug("Netatmo Therm2: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo Therm2: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo Therm2:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getInt(tonumber(retry+1)); else return false; end end; end if(getExt==nil) then -- Loads in memory only the first occurence function getExt(retry) retry = retry or 0 -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo extérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=ext"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_exterieure = result.body[1].value[1][1] or "n.c"; humidite_exterieure =result.body[1].value[1][2] or "n.c"; -- variable globale pour info sms local msg = "Température extérieure : "..temperature_exterieure.."°C"; fibaro:setGlobal("tempext", msg); return true; else fibaro:debug("Netatmo EXT: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo EXT: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo EXT:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getInt(tonumber(retry+1)); else return false; end end; end if(getInt==nil) then -- Loads in memory only the first occurence function getInt(retry) retry = retry or 0; -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo intérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=int"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_interieure = result.body[1].value[1][1] or "n.c"; humidite_interieure = result.body[1].value[1][3] or "n.c"; co2 = result.body[1].value[1][2] or "n.c"; pression = result.body[1].value[1][4] or "n.c"; bruit = result.body[1].value[1][5] or "n.c"; -- variable globale pour info sms fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C"); return true; else fibaro:debug("Netatmo INT: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo INT: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo INT:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getExt(tonumber(retry+1)); else return false; end end; end if(getMod2==nil) then -- Loads in memory only the first occurence function getMod2(retry) retry = retry or 0; -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo intérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=mod2"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_int_mod2 = result.body[1].value[1][1] or "n.c"; humidite_int_mod2 = result.body[1].value[1][2] or "n.c"; co2_mod2 = result.body[1].value[1][3] or "n.c"; -- variable globale pour info sms -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C"); return true; else fibaro:debug("Netatmo INT_mod2: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo INT_mod2: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo INT_mod2:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getExt(tonumber(retry+1)); else return false; end end; end if(getMod3==nil) then -- Loads in memory only the first occurence function getMod3(retry) retry = retry or 0; -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo intérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=mod3"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_int_mod3 = result.body[1].value[1][1] or "n.c"; humidite_int_mod3 = result.body[1].value[1][2] or "n.c"; co2_mod3 = result.body[1].value[1][3] or "n.c"; -- variable globale pour info sms -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C"); return true; else fibaro:debug("Netatmo INT_mod3: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo INT_mod3: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo INT_mod3:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getExt(tonumber(retry+1)); else return false; end end; end if(getMod4==nil) then -- Loads in memory only the first occurence function getMod4(retry) retry = retry or 0; -- Setting up the connection data local FHTE = Net.FHttp(domaine, 80); -- Netatmo intérieur local response = FHTE:GET("/netatmo/thermtatmo.php?parameter=mod4"); -- decoding json string to table if (response~= nil) then local result = nil; result = json.decode(response); if (result ~= nil) then -- prevent: attempt to index field 'body' (a nil value) if (result.body ~= nil) then temperature_int_mod4 = result.body[1].value[1][1] or "n.c"; humidite_int_mod4 = result.body[1].value[1][2] or "n.c"; co2_mod4 = result.body[1].value[1][3] or "n.c"; -- variable globale pour info sms -- fibaro:setGlobal("tempint", "Température intérieure : "..temperature_interieure.."°C"); return true; else fibaro:debug("Netatmo INT_mod4: erreur le " .. os.date()); if (result.error ~= nil) then fibaro:debug("error code: "..result.error.code..", message: "..result.error.message); end end else fibaro:debug("Netatmo INT_mod4: erreur decodage json le " .. os.date()); end else fibaro:debug("Netatmo INT_mod4:la reponse est null !"); end if ((retry or 5)< 5) then fibaro:debug("Retry #"..retry.."process, please wait..."); fibaro:sleep(5000); return getExt(tonumber(retry+1)); else return false; end end; end function EmonCMS:Push(payloademon) payloademon = "/input/post.json?json={" .. EmonCMS_Prefix .. payloademon .. "}&apikey=" .. emoncms_api_key response, status, errorCode = emoncms:GET(payloademon); fibaro:debug("Payload: " .. payloademon) ; fibaro:debug("response: " .. response .. " Status: " .. status .. " errorcode: " .. errorCode) ; fibaro:sleep(500); end local function main() -- retrieve values from thermtatmo.php (res = result) add or remove the one you need local resTherm1, resInt, resExt, resMod2, resMod3, resMod4 = false, false, false, false, false, false; if Thermostat == true then local status, err = pcall(function () resTherm1 = getTherm1(); end); fibaro:debug("Récupération des valeurs du Thermostat 1: " .. tostring(resTherm1)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resTherm2 = getTherm2(); end); fibaro:debug("Récupération des valeurs du Thermostat 2: " .. tostring(resTherm2)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end end local status, err = pcall(function () resInt = getInt(); end); fibaro:debug("Récupération des données intérieures: " .. tostring(resInt)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resExt = getExt(); end); fibaro:debug("Récupération des données extérieures : " .. tostring(resExt)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resMod2 = getMod2(); end); fibaro:debug("Récupération des données intérieures Mod2: " .. tostring(resMod2)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resMod3 = getMod3(); end); fibaro:debug("Récupération des données intérieures Mod3: " .. tostring(resMod3)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end local status, err = pcall(function () resMod4 = getMod4(); end); fibaro:debug("Récupération des données intérieures Mod4: " .. tostring(resMod4)); if (status == false) then DoNotPush_Error = true; fibaro:debug("err: "..tostring(err or 'n.c')); end fibaro:debug("1") if DoNotPush_Error == false then -- if no retreive values error from netatmo, then display values in the virtual device and push to emon cms -- add or remove in the right order and separated by comma the definition of the display in the VD (definition of the array for the refresh ui function) -- calculate Min and Max temperature: if Thermostat == false then fibaro:debug("not calculating Temp Max & Min Values") else temperature_max = temperature_interieure if temperature_therm1 > temperature_max then temperature_max = temperature_therm1 end if temperature_therm2 > temperature_max then temperature_therm2 = temperature_int_mod2 end if temperature_int_mod2 > temperature_max then temperature_max = temperature_int_mod2 end if temperature_int_mod3 > temperature_max then temperature_max = temperature_int_mod3 end if temperature_int_mod4 > temperature_max then temperature_max = temperature_int_mod4 end temperature_min = temperature_interieure if temperature_therm1 < temperature_max then temperature_max = temperature_therm1 end if temperature_therm2 < temperature_max then temperature_therm2 = temperature_int_mod2 end if temperature_int_mod2 < temperature_min then temperature_min = temperature_int_mod2 end if temperature_int_mod3 < temperature_min then temperature_min = temperature_int_mod3 end if temperature_int_mod4 < temperature_min then temperature_min = temperature_int_mod4 end end -- call function refresh ui with retreived parameters: if relay_therm1 == "0" then relay_therm1_disp = "Décl." else relay_therm1_disp = "Encl."end if relay_therm2 == "0" then relay_therm2_disp = "Décl." else relay_therm2_disp = "Encl."end refreshUI( "Floor: T° (SetPoint - Max - Min)", "Rez: "..temperature_therm2.."° ("..relay_therm2_disp.." - "..temperature_setpoint_therm2.." - "..temperature_max.." - "..temperature_min..")", "1er: "..temperature_therm1.."° ("..relay_therm1_disp.." - "..temperature_setpoint_therm1.." - "..temperature_max.." - "..temperature_min..")", "Ext: "..temperature_exterieure.." °C - "..humidite_exterieure.." % - "..pression.." mbar", "Bruit Rez: "..bruit.." dB", "Rez - Emilien - Thomas - Parents", temperature_interieure.." - "..temperature_int_mod2.." - "..temperature_int_mod3.." - "..temperature_int_mod4.." °C ", co2.." - "..co2_mod2.." - "..co2_mod3.." - "..co2_mod4.." ppm", humidite_interieure.." - "..humidite_int_mod2.." - "..humidite_int_mod3.." - "..humidite_int_mod4.." % ", os.date("%H:%M"), tostring(resInt).." "..tostring(resExt).." "..tostring(resMod2).." "..tostring(resMod3).." "..tostring(resMod4) ); -- Push To EMONCMS -- -- Syntax: payload = set label of input on emoncms .. variable containing the value if PushToEmonCMS == true then if Thermostat == true then payloademon = "temperature_1er:"..temperature_therm1 EmonCMS:Push(payloademon); payloademon = "temperature_set_point_1er:".. temperature_setpoint_therm1 EmonCMS:Push(payloademon); payloademon = "relais_chaudiere_1er:".. relay_therm1 EmonCMS:Push(payloademon); payloademon = "temperature_Rez:"..temperature_therm2 EmonCMS:Push(payloademon); payloademon = "temperature_set_point_Rez:".. temperature_setpoint_therm2 EmonCMS:Push(payloademon); payloademon = "relais_chaudiere_Rez:".. relay_therm2 EmonCMS:Push(payloademon); end payloademon = "temperature_exterieure:"..temperature_exterieure EmonCMS:Push(payloademon); payloademon = "humidite_exterieure:".. humidite_exterieure EmonCMS:Push(payloademon); payloademon = "pression:".. pression EmonCMS:Push(payloademon); payloademon = "bruit:".. bruit EmonCMS:Push(payloademon); payloademon = "temperature_interieure_Rez:".. temperature_interieure EmonCMS:Push(payloademon); payloademon = "temperature_int_mod2_Emilien:".. temperature_int_mod2 EmonCMS:Push(payloademon); payloademon = "temperature_int_mod3_Thomas:".. temperature_int_mod3 EmonCMS:Push(payloademon); payloademon = "temperature_int_mod4_Parents:".. temperature_int_mod4 EmonCMS:Push(payloademon); payloademon = "humidite_interieure_Rez:".. humidite_interieure EmonCMS:Push(payloademon); payloademon = "humidite_int_mod2_Emilien:".. humidite_int_mod2 EmonCMS:Push(payloademon); payloademon = "humidite_int_mod3_Thomas:".. humidite_int_mod3 EmonCMS:Push(payloademon); payloademon = "humidite_int_mod4_Parents:".. humidite_int_mod4 EmonCMS:Push(payloademon); payloademon = "co2_Rez:".. co2 EmonCMS:Push(payloademon); payloademon = "co2_mod2_Emilien:".. co2_mod2 EmonCMS:Push(payloademon); payloademon = "co2_mod3_Thomas:".. co2_mod3 EmonCMS:Push(payloademon); payloademon = "co2_mod4_Parents:".. co2_mod4 EmonCMS:Push(payloademon); payloademon = "TEMP_EAU_REZ:".. fibaro:getValue(id["TEMP_EAU_REZ"], "value") EmonCMS:Push(payloademon); payloademon = "TEMP_EAU_BOILER:".. fibaro:getValue(id["TEMP_EAU_BOILER"], "value") EmonCMS:Push(payloademon); payloademon = "TEMP_EAU_1ER:".. fibaro:getValue(id["TEMP_EAU_1ER"], "value") EmonCMS:Push(payloademon); payloademon = "TEMP_GRENIER:".. fibaro:getValue(id["TEMP_GRENIER"], "value") EmonCMS:Push(payloademon); end if VMC == true then -- Compute Value MAX CO2 Maison, store in global variable (to adjust the VMC Speed in another VD) if CO2_Max_Value_Local == false then fibaro:debug("not calculating nor storing CO2 Max Value") else CO2_Max_Value_Local = co2 if CO2_Max_Value_Local < co2_mod2 then CO2_Max_Value_Local = co2_mod2 end if CO2_Max_Value_Local < co2_mod3 then CO2_Max_Value_Local = co2_mod3 end if CO2_Max_Value_Local < co2_mod4 then CO2_Max_Value_Local = co2_mod4 end if tonumber(fibaro:getGlobalValue("CO2_Max_Value")) == CO2_Max_Value_Local then CO2_Max_Value_Local = CO2_Max_Value_Local +1; fibaro:debug("added 1 to Max CO2"); end -- so CO2_Max_Value_Local is not the same between measures and global var is modified and can be detected in other scenes fibaro:setGlobal("CO2_Max_Value", CO2_Max_Value_Local ) fibaro:debug("CO2_Max_Value: ".. CO2_Max_Value_Local ) end end else -- if error detected, to not push to emoncms and push message to phone fibaro:debug("push error") pushMessage("Error with netatmo device. resInt:" .. tostring(resInt).." resExt:"..tostring(resExt).." resMod2:"..tostring(resMod2).." resMod3:"..tostring(resMod3).." resMod4:"..tostring(resMod4).." resTherm1:"..tostring(resTherm1)); end end -- launch main(); thermtatmo.shared.php voici le code php en clair, pas oublier de changer les paramètres au début. j'ai une configuration avec deux maisons (la mienne et chez ma mère) et deux thermostats (rez et étage) l'ordre des modules peut donc changer, utilisez les paramèttres pour afficher les configurations et faire votre choix. <?php //ini_set('display_errors', false); //set_exception_handler('ReturnError'); $parameter=$_GET['parameter']; $password="XXXXXXXXXXXXXXXXXXXX"; // netatmo password $username="XXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo username $app_id = "XXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo $app_secret = "XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX"; // netatmo $token_url = "https://api.netatmo.net/oauth2/token"; $postdata = http_build_query( array( 'grant_type' => "password", 'client_id' => $app_id, 'client_secret' => $app_secret, 'username' => $username, 'password' => $password, 'scope' => 'read_station read_thermostat write_thermostat' ) ); $opts = array('http' => array( 'method' => 'POST', 'header' => 'Content-type: application/x-www-form-urlencoded', 'content' => $postdata ) ); $context = stream_context_create($opts); $response = file_get_contents($token_url, false, $context); $params = null; $params = json_decode($response, true); // Section For Thermostat -------------------------------------- $therm_api_url = "https://api.netatmo.net/api/getuser?access_token=" . $params['access_token']."&app_type=app_thermostat"; $therm_requete = @file_get_contents($therm_api_url); //if ($therm_requete == "{"error":{"code":26,"message":"User usage reached"}}") { //echo $therm_requete ; //exit(); //} $therm_url_devices = "https://api.netatmo.net/api/devicelist?access_token=" . $params['access_token']."&app_type=app_thermostat"; $therm_resulat_device = @file_get_contents($therm_url_devices); $therm_json_devices = json_decode($therm_resulat_device,true); $therm1_device = $therm_json_devices["body"]["modules"][1]["_id"]; $therm1_relay = $therm_json_devices["body"]["devices"][0]["_id"]; $therm2_device = $therm_json_devices["body"]["modules"][0]["_id"]; $therm2_relay = $therm_json_devices["body"]["devices"][1]["_id"]; if ($parameter == "json_viewer_therm") { print(' <html> <style type="text/css"> body { font: 11pt arial; } #jsoneditor { width: 800px; height: 2000px; } </style> <head> <title><YAGDA></title> </head> <body> '); echo "nombre de devices Thermostat: " . count($therm_json_devices["body"]["devices"]) . "<br>"; for ($i = 0; $i <= count($therm_json_devices["body"]["devices"]) - 1; $i++) { echo "Station Name: " . $therm_json_devices["body"]["devices"][$i]["station_name"]; echo " - Device No: " . $i ." id: " . $therm_json_devices["body"]["devices"][$i]["_id"] . " Name: " . $therm_json_devices["body"]["devices"][$i]["module_name"] . "<br>"; } echo "<br>nombre de modules Thermostat: " . count($therm_json_devices["body"]["modules"]) . "<br>"; for ($i = 0; $i <= count($therm_json_devices["body"]["modules"]) - 1; $i++) { echo "Parent Device: " . $therm_json_devices["body"]["modules"][$i]["main_device"]; echo " - Module No: " . $i ." id: " . $therm_json_devices["body"]["modules"][$i]["_id"] . " Name: " . $therm_json_devices["body"]["modules"][$i]["module_name"] . "<br>"; } print(' <br> <link rel="stylesheet" type="text/css" href="jsoneditor/jsoneditor.css"/> <script src="jsoneditor/jsoneditor.js"></script> <div id="jsoneditor"></div> <script> var container = document.getElementById(\'jsoneditor\'); var options = { mode: "view" }; var json = '); echo $therm_resulat_device; print(' var editor = new jsoneditor.JSONEditor(container, options, json); </script> '); } if ($parameter == "xml_therm") { // setup Station continue $device1 = $therm_json_devices["body"]["modules"][0]["main_device"]; $module1 = $therm_json_devices["body"]["modules"][0]["_id"]; //$device2 = $therm_json_devices["body"]["modules"][1]["main_device"]; //$module2 = $therm_json_devices["body"]["modules"][1]["_id"]; //$device3 = $therm_json_devices["body"]["modules"][2]["main_device"]; //$module3 = $therm_json_devices["body"]["modules"][2]["_id"]; $url_thermostat1="http://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token']."&device_id=".$device1."&module_id=".$module1; $value_thermostat1= file_get_contents($url_thermostat1); $json_mesures_thermostat1 = json_decode($value_thermostat1, true); $temperature_thermostat1 = $json_mesures_thermostat1["body"]["measured"]["temperature"]; $run_thermostat1 = $json_mesures_thermostat1["body"]["therm_relay_cmd"]; $setpoint_thermostat1=$json_mesures_thermostat1["body"]["measured"]["setpoint_temp"]; //$url_thermostat2="http://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token']."&device_id=".$device2."&module_id=".$module2; //$value_thermostat2= file_get_contents($url_thermostat2); //$temperature_thermostat2 = $json_mesures_thermostat2["body"]["measured"]["temperature"]; //$run_thermostat2 = $json_mesures_thermostat2["body"]["therm_relay_cmd"]; //$setpoint_thermostat2=$json_mesures_thermostat2["body"]["measured"]["setpoint_temp"]; //$url_thermostat3="http://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token']."&device_id=".$device3."&module_id=".$module3; //$value_thermostat3= file_get_contents($url_thermostat3); //$json_mesures_thermostat3 = json_decode($value_thermostat3, true); //$temperature_thermostat3 = $json_mesures_thermostat3["body"]["measured"]["temperature"]; //$run_thermostat3 = $json_mesures_thermostat3["body"]["therm_relay_cmd"]; //$setpoint_thermostat3=$json_mesures_thermostat3["body"]["measured"]["setpoint_temp"]; echo '<?xml version="1.0" encoding="utf8" ?>'; echo "<netatmo>"; echo "<Temp_Thermo_1>" . $temperature_thermostat1 . "</Temp_Thermo_1>"; echo "<Etat_Thermo_1>" . $run_thermostat1 . "</Etat_Thermo_1>"; // Etat du thermostat, 0 chaudiere a l'arret, 100 chaudiere en marche echo "<Consigne_Thermo_1>" . $setpoint_thermostat1 . "</Consigne_Thermo_1>"; //echo "<Temp_Thermo_2>" . $temperature_thermostat2 . "</Temp_Thermo_2>"; //echo "<Etat_Thermo_2>" . $run_thermostat2 . "</Etat_Thermo_2>"; //echo "<Consigne_Thermo_2>" . $setpoint_thermostat2 . "</Consigne_Thermo_2>"; //echo "<Temp_Thermo_3>" . $temperature_thermostat3 . "</Temp_Thermo_3>"; //echo "<Etat_Thermo_3>" . $run_thermostat3 . "</Etat_Thermo_3>"; //echo "<Consigne_Thermo_3>" . $setpoint_thermostat3 . "</Consigne_Thermo_3>"; echo "</netatmo>"; } if ($parameter == "json_therm") { echo $therm_resulat_device; } if ($parameter == "names_therm") { echo "nombre de devices: " . count($therm_json_devices["body"]["devices"]) . "<br>"; for ($i = 0; $i <= count($therm_json_devices["body"]["devices"]) - 1; $i++) { echo "Station Name: " . $therm_json_devices["body"]["devices"][$i]["station_name"]; echo " - Device No: " . $i ." id: " . $therm_json_devices["body"]["devices"][$i]["_id"] . " Name: " . $therm_json_devices["body"]["devices"][$i]["module_name"] . "<br>"; } echo "<br>nombre de modules: " . count($therm_json_devices["body"]["modules"]) . "<br>"; for ($i = 0; $i <= count($therm_json_devices["body"]["modules"]) - 1; $i++) { echo "Parent Device: " . $therm_json_devices["body"]["modules"][$i]["main_device"]; echo " - Module No: " . $i ." id: " . $therm_json_devices["body"]["modules"][$i]["_id"] . " Name: " . $therm_json_devices["body"]["modules"][$i]["module_name"] . "<br>"; } } if ($parameter == "therm1") { $url_mesures_therm1 = "https://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token'] . "&device_id=" . $therm1_relay . "&module_id=".$therm1_device; $mesures_therm1 = file_get_contents($url_mesures_therm1); echo $mesures_therm1 ; } if ($parameter == "therm1_set_away") { $url_set_therm1 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm1_relay . "&module_id=" . $therm1_device. "&setpoint_mode=away"; $set_therm1 = file_get_contents($url_set_therm1); echo $set_therm1 ; } if ($parameter == "therm1_set_program") { $url_set_therm1 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm1_relay . "&module_id=" . $therm1_device. "&setpoint_mode=program"; $set_therm1 = file_get_contents($url_set_therm1); echo $set_therm1 ; } if ($parameter == "therm1_set_hg") { $url_set_therm1 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm1_relay . "&module_id=" . $therm1_device. "&setpoint_mode=hg"; $set_therm1 = file_get_contents($url_set_therm1); echo $set_therm1 ; } if ($parameter == "therm2") { $url_mesures_therm2 = "https://api.netatmo.net/api/getthermstate?access_token=" . $params['access_token'] . "&device_id=" . $therm2_relay . "&module_id=".$therm2_device; $mesures_therm2 = file_get_contents($url_mesures_therm2); echo $mesures_therm2 ; } if ($parameter == "therm2_set_away") { $url_set_therm2 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm2_relay . "&module_id=" . $therm2_device. "&setpoint_mode=away"; $set_therm2 = file_get_contents($url_set_therm2); echo $set_therm2 ; } if ($parameter == "therm2_set_program") { $url_set_therm2 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm2_relay . "&module_id=" . $therm2_device. "&setpoint_mode=program"; $set_therm2 = file_get_contents($url_set_therm2); echo $set_therm2 ; } if ($parameter == "therm2_set_hg") { $url_set_therm2 = "https://api.netatmo.net/api/setthermpoint?access_token=" . $params['access_token'] . "&device_id=" . $therm2_relay . "&module_id=" . $therm2_device. "&setpoint_mode=hg"; $set_therm2 = file_get_contents($url_set_therm2); echo $set_therm2 ; } // Section For Weather Station ----------------------------------- $api_url = "https://api.netatmo.net/api/getuser?access_token=" . $params['access_token']; $requete = file_get_contents($api_url); $url_devices = "https://api.netatmo.net/api/devicelist?access_token=" . $params['access_token']; $resulat_device = file_get_contents($url_devices); $json_devices = json_decode($resulat_device,true); $json_objects = json_decode($resulat_device); $module_interne = $json_devices["body"]["devices"][0]["_id"]; $module_externe = $json_devices["body"]["modules"][1]["_id"]; $module_interne2 = $json_devices["body"]["modules"][2]["_id"]; $module_interne3 = $json_devices["body"]["modules"][3]["_id"]; $module_interne4 = $json_devices["body"]["modules"][4]["_id"]; if ($parameter == "json") { echo $resulat_device; } if ($parameter == "json_viewer") { print(' <html> <style type="text/css"> body { font: 11pt arial; } #jsoneditor { width: 800px; height: 2000px; } </style> <head> <title><YAGDA></title> </head> <body> '); echo "nombre de devices: " . count($json_devices["body"]["devices"]) . "<br>"; for ($i = 0; $i <= count($json_devices["body"]["devices"]) - 1; $i++) { echo "Station Name: " . $json_devices["body"]["devices"][$i]["station_name"]; echo " - Device No: " . $i ." id: " . $json_devices["body"]["devices"][$i]["_id"] . " Name: " . $json_devices["body"]["devices"][$i]["module_name"] . "<br>"; } echo "<br>nombre de modules: " . count($json_devices["body"]["modules"]) . "<br>"; for ($i = 0; $i <= count($json_devices["body"]["modules"]) - 1; $i++) { echo "Parent Device: " . $json_devices["body"]["modules"][$i]["main_device"]; echo " - Module No: " . $i ." id: " . $json_devices["body"]["modules"][$i]["_id"] . " Name: " . $json_devices["body"]["modules"][$i]["module_name"] . "<br>"; } print(' <br> <link rel="stylesheet" type="text/css" href="jsoneditor/jsoneditor.css"/> <script src="jsoneditor/jsoneditor.js"></script> <div id="jsoneditor"></div> <script> var container = document.getElementById(\'jsoneditor\'); var options = { mode: "view" }; var json = '); echo $resulat_device; print(' var editor = new jsoneditor.JSONEditor(container, options, json); </script> '); } if ($parameter == "names") { echo "nombre de devices: " . count($json_devices["body"]["devices"]) . "<br>"; for ($i = 0; $i <= count($json_devices["body"]["devices"]) - 1; $i++) { echo "Station Name: " . $json_devices["body"]["devices"][$i]["station_name"]; echo " - Device No: " . $i ." id: " . $json_devices["body"]["devices"][$i]["_id"] . " Name: " . $json_devices["body"]["devices"][$i]["module_name"] . "<br>"; } echo "<br>nombre de modules: " . count($json_devices["body"]["modules"]) . "<br>"; for ($i = 0; $i <= count($json_devices["body"]["modules"]) - 1; $i++) { echo "Parent Device: " . $json_devices["body"]["modules"][$i]["main_device"]; echo " - Module No: " . $i ." id: " . $json_devices["body"]["modules"][$i]["_id"] . " Name: " . $json_devices["body"]["modules"][$i]["module_name"] . "<br>"; } } if ($parameter == "selected_modules") { echo "Selected Modules: <br>"; echo "mod interne ----- (int): " . $module_interne . "<br>"; echo "mod externe ---- (ext): " . $module_externe . "<br>"; echo "mod interne2 (mod2): " . $module_interne2 . "<br>"; echo "mod interne3 (mod3): " . $module_interne3 . "<br>"; echo "mod interne4 (mod4): " . $module_interne4 . "<br>"; } if ($parameter == "int") { $url_mesures_internes = "https://api.netatmo.net/api/getmeasure?access_token=" . $params['access_token'] . "&device_id=" . $module_interne . "&scale=max&type=Temperature,CO2,Humidity,Pressure,Noise&date_end=last"; $mesures_internes = file_get_contents($url_mesures_internes); echo $mesures_internes ; } if ($parameter == "ext") { $url_mesures_externes = "https://api.netatmo.net/api/getmeasure?access_token=" . $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $module_externe . "&scale=max&type=Temperature,Humidity&date_end=last"; $mesures_externes = file_get_contents($url_mesures_externes); echo $mesures_externes ; } if ($parameter == "mod2") { $url_mesures_internes2 = "https://api.netatmo.net/api/getmeasure?access_token=" . $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $module_interne2 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last"; $mesures_internes2 = file_get_contents($url_mesures_internes2); echo $mesures_internes2 ; } if ($parameter == "mod3") { $url_mesures_internes3 = "https://api.netatmo.net/api/getmeasure?access_token=" . $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $module_interne3 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last"; $mesures_internes3 = file_get_contents($url_mesures_internes3); echo $mesures_internes3 ; } if ($parameter == "mod4") { $url_mesures_internes4 = "https://api.netatmo.net/api/getmeasure?access_token=" . $params['access_token'] . "&device_id=" . $module_interne . "&module_id=" . $module_interne4 . "&scale=max&type=Temperature,Humidity,CO2&date_end=last"; $mesures_internes4 = file_get_contents($url_mesures_internes4); echo $mesures_internes4 ; } // Section Infos if ($parameter == "") { print(' <html> <style type="text/css"> body { font: 11pt arial; } </style> <head> <title><YAGDA></title> </head> <body> <br> Available parameters: <br><br> For Netatmo thermostat: <br><br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=json_viewer_therm<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=xml_therm<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=json_therm<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=names_therm<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=therm1<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=therm1_set_away<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=therm1_set_program<br> <br><br> For Netatmo Weather:<br><br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=json<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=json_viewer<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=names<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=selected_modules<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=int<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=ext<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=mod2<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=mod3<br> http://XXX.XXX.XXX.XXX/netatmo/thermtatmo.php?parameter=mod4<br> '); } ?> Netatmo_Thermostat V3.2.vfib thermtatmo.shared.php
  17. merci jojo merci steven, ça marche d'enfer !!!
  18. ok, j'ai réussi à adapter 2-3 équations et le script d'aube pour mes besoins. @steven @jojo, j'ai encore réfléchi, et je ne voit pas comment je pourrais avec une seule scène gérer toutes les lampes. Si on les actionne une par unes, ça devrait aller, il y aura autant de scènes en parallèle que de lampes à dimmer. Mais disons que j'ai demandé un allumage progressif de la lampe de chambre le matin. j'ai donc écrit l'ordre dans la vg: Au passage Steven, quel est l'avantage d'encoder et de décoder en json par rapport à directement stocker un tableau ? fibaro:setGlobal("Curves_Dimmer", {device=25, curve="outinExpo", delai=120, max=80}) la scène à reçu l'ordre et est occupée à boucler pendant 2 minutes.. ensuite j'allume une chambre d'enfant et la VG est remplacée par un autre ordre. une scène parallèle se lance et effectue le dimming jusqu'ici tout va bien. Ensuite j'arrive dans la sdb et je demande l'extinction... effectuée directement ou via un gea -1 fibaro:setGlobal("Curves_Dimmer",{device=25, curve="outinExpo", delai=10, max=0}) Et c'est là que les Athéniens s'atteignirent et que les satrapes s'attrapèrent... On va avoir les deux scripts qui vont pas s'entendre. Deux solutions que j'imagine. Solution 1: Durant les boucles, vérifier la vg, décoder et vérifier si l'ordre y est toujours la VG globale devra donc pouvoir contenir plusieurs tableaux: fibaro:setGlobal("Curves_Dimmer",{{device=25, curve="outinExpo", delai=10, max=0},{device=30, curve="inExpo", delai=20, max=100}) Ceci implique: - à chaque écriture de la VG, nécessité de la lire, de la "décoder", de la modifier (mette une autre demande pour la lampe 25 par exemple) et de la re-stocker ... tout ça en espérant que ailleurs un autre script ne décide pas d'en faire autant pile en même temps... - de l'autre côté, la scène de dimming doit a chaque boucle verifier si l'ordre de la vg n'a pas changé, donc lire et décoder la vg. - il peut y avoir plusieures scènes en parallèle mais elles doivent pouvoir flagger "je m'occupe de ce dimming" et si une scène se lance et qu'il n'y a rien de nouveau, elle abort solution 2: Ne gérer les courbes que les ordres en automatique via GEA, s'il y a une action manuelle(0 ou 99%) durant la boucle -> abort Normalement si le mode automatique est logique, il ne devrait pas y avoir de télescopage. On pourra donc laisser les scènes tourner en parallèle Avis ? astuces ? mars ? chocolat glacé ? sourire de la crémière ? :-)
  19. Oui. Les inputs coté fibaro (zones de satel) ne sont que en lecture pour la fibaro. Pour agir sur la satel, tu dois actionner des outputs côté fibaro. Côté Satel, l'astuce c'est que ces outputs doivent être configurées en 24 ou 25 (mono ou bi switch) et avec comme triggering partition, la partition Fibaro. Quand on bascule ce switch côté fibaro, la satel voit ça comme si un capteur était activé et active une sortie en conséquence.
  20. avec ceci ça ira mieux ce soir pour générer des fonctions descendantes... http://www.math10.com/en/problem-solver/ ça m'aurais bien aidé à l'époque ça... nos enfants seront des imbéciles en math... ou pas :-p
  21. Merci Steven, je garde ça. J'ai déjàun simple tableau basé sur le premier exemple de Jojo. Pour le moment je cale sur les courbes. Le simulateur d'aube de @Krikroff n'est malheureusement pas réversible... donc si je lui demande de varier de 15 à50 en 25secondes ça va, mais malheureusement les équations ne fonctionnent plus lorsque je demande de varier de 50 à15 en 20 secondes... ça aurait pu me rendre heureux et faire un beau simulateur de coucher de soleil ... ;-) Soit, j'ai jamais touché aux math.pow et autres, je cherche un peu (beaucoup même... :-/ ) po'v neurone :-p
  22. oui mais la mesure netatmo laisse àdésirer question précision...
  23. Voilà, j'ai modifié mon post en mettant les doublons que j'aimerais voir intégrer
  24. CO, pas CO2.Ça m'intéressait du coup, mais malheureusement il ne mesure pas le CO2 :/ Sent from my SM-N910F using Tapatalk
  25. Bonjour, quelqu'un sais si les fgd212 sont supportés en firmware 3.6 ? Merci ! Sent from my SM-N910F using Tapatalk
×
×
  • Créer...