J3R3M Posté(e) le 7 août 2018 Signaler Posté(e) le 7 août 2018 (modifié) Bonjour à tous, Certains VD créent automatiquement les Variables Globales dont ils ont besoin pour fonctionner correctement. Je n'ai pas réussi à comprendre comment cette opération était effectuée... Donc je viens une fois de plus vers vous ! Je comprends bien que le but est d'abord de vérifier si la VG existe et si la requête échoue, la créer... Mais comment s'opère cette création ? J'ai essayé d'analyser ce sujet, mais sans comprendre le pourquoi du comment... Pouvez-vous m'expliquer comment faire s'il-vous-plaît ? Avec un morceau de code basique, que l'on puisse ensuite agrémenter en fonction de nos besoins. Merci d'avance ! Modifié le 7 août 2018 par J3R3M
pepite Posté(e) le 7 août 2018 Signaler Posté(e) le 7 août 2018 Bonjour, Comme ceci, ca devrait être ok. function isNil(variable) return type(variable) == "nil" end if isNil(fibaro:getGlobalValue("variable")) then api.post("/globalVariables", {name="nom_variable", isEnum=0}) end
J3R3M Posté(e) le 7 août 2018 Auteur Signaler Posté(e) le 7 août 2018 Merci de ta réponse @pepite. Ce code tel quel ne fonctionne pas, peut être faut-il procéder à une authentification auparavant ?
J3R3M Posté(e) le 7 août 2018 Auteur Signaler Posté(e) le 7 août 2018 function createGlobalVariable(variableName, variableValue) local created = false; local data = {name = variableName, value=tostring(variableValue)} response, status = api.post("/globalVariables", data); -- If creation successful, then return created=true if (status == 201) then fibaro:debug("Global variable " .. variableName .. " created"); created = true else fibaro:debug("Failed to create global variable " .. variableName .. "!"); end return created; end Grâce au mot clé "api.post", j'ai pu trouver ce code qui fonctionne parfaitement! Merci beaucoup de m'avoir aiguillé @pepite! Analyser ces quelques lignes va beaucoup m'aider! 1
J3R3M Posté(e) le 7 août 2018 Auteur Signaler Posté(e) le 7 août 2018 J'ai compris! Ton code fonctionne également @pepite! Simplement, la méthode de vérification n'est pas adéquate. En effet, on a un retour d'erreur de L'API si la variable globale n'existe pas. Ce qui est logique, puisqu'on lui demande de nous sortir une valeur qui n'existe pas... Peut-être existe-t'il une autre méthode pour vérifier si une VG existe ou pas ? Enfin, celle-ci fonctionne mais crée forcément une erreur si elle n'existe pas.
Lazer Posté(e) le 7 août 2018 Signaler Posté(e) le 7 août 2018 Petit extrait de l'un de mes VD : local VG = { ["toto"] = {['default']='valeur', ['enum']={}}, ["titi"] = {['default']='', ['enum']={}}, } local debug = false -- -- createVG() -- local createVG = function(varName, varValue, varEnum) local isEnum = (#varEnum > 0) and 1 or 0 local HC2 = Net.FHttp("127.0.0.1", 11111) local payload = '{"name":"'..varName..'","isEnum":'..isEnum..',"value":"'..(varValue or "")..'"}' local response, status, errorCode = HC2:POST("/api/globalVariables/"..varName, payload) if tonumber(errorCode) == 0 and (tonumber(status) == 200 or tonumber(status) == 201) and response ~= nil and response ~= "" then fibaro:debug('Global variable "'..varName..'" created') if isEnum > 0 then local payload = '{"name":"'..varName..'","isEnum":true,"enumValues":'..json.encode(varEnum)..'}' local response, status, errorCode = HC2:PUT("/api/globalVariables/"..varName, payload) if tonumber(errorCode) == 0 and (tonumber(status) == 200 or tonumber(status) == 201) and response ~= nil and response ~= "" then fibaro:debug('Global variable "'..varName..'" modified with enum values') else fibaro:debug('Error : Can not modify enum global variable, errorCode='..errorCode..', status='..status..', payload='..payload..', response='..(response or "")) end end else fibaro:debug('Error : Can not create global variable, errorCode='..errorCode..', status='..status..', payload='..payload..', response='..(response or "")) end HC2 = nil end -- -- checkVG() -- local checkVG = function(VG) local vg, param for vg, param in pairs(VG) do if debug then fibaro:debug("Check if global variable '"..vg.."' exists") end local response = api.get("/globalVariables/"..vg) if type(response) == "table" then if not response.name or response.name ~= vg then if debug then fibaro:debug('Response OK but global variable "'..vg..'" does not exist...') end createVG(vg, param['default'], param['enum']) end else if debug then fibaro:debug('Global variable "'..vg..'" does not exist...') end createVG(vg, param['default'], param['enum']) end end end -- Check if global variable exist checkVG(VG) 1
pepite Posté(e) le 7 août 2018 Signaler Posté(e) le 7 août 2018 Tu peux tester l'existence de la variable comme le fait @Lazer ;-) Lemix des 2 codes est t'es au top. Encore plus simple, tu récupères le code de @Lazer
Lazer Posté(e) le 7 août 2018 Signaler Posté(e) le 7 août 2018 En fait mon code est dans une mainloop, comme ça toutes les 5 Minutes je check si la variable existe, et le script la récrée automatiquement si nécessaire.... utile si l'utilisateur efface une VG par erreur. 1
Messages recommandés