Aller au contenu
J3R3M

[Résolu][LUA] Création automatique d'une Variable Globale depuis un VD

Recommended Posts

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é par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci de ta réponse @pepite.

Ce code tel quel ne fonctionne pas, peut être faut-il procéder à une authentification auparavant ?

Partager ce message


Lien à poster
Partager sur d’autres sites
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!

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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)

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

×