Aller au contenu
ericl78

QA et variable

Recommended Posts

Bonjour

 

Est il possible depuis une scène de modifier une variable créée dans un QA ?

J'ai regarder dans la doc officielle Fibaro Lua, mais rien trouvé. Je reste sur du fibaro.setglobalVariable ....

 

Merci à vous

 

Partager ce message


Lien à poster
Partager sur d’autres sites

La méthode setVariable étant une fonction de la classe QuickApp, elle est automatiquement exportée, donc tu peux l'appeler depuis n'importe où : un autre QA, une scène .... (ou même depuis l'extérieur via l'API HTTP)

 

Le plus simple, avec un truc dans le genre je pense que ça doit fonctionner :

fibaro.call(ID, "setVariable", "variable", "valeur")

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer, toujours la bonne réponse :=)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Mais alors la getVariable() aussi ?

 

Mais pourquoi on se complique la vie avec une fonction écrite juste pour ça ?

 

EDIT : Question con réponse con : pas de retour possible avec le fibaro.call() - avais oublié ça...

Modifié par jjacques68

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour le getVariable, allez voir dans le code source de GEA :)

L'idée de base est simple : api.get("/devices/" .. ID) puis on parcoure les variables pour récupérer celle qui nous intéresse.

 

On peut aussi en supprimer d'ailleurs.

 

Tout est possible.

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

Je suis un peu perdu dans les variables et déclaration...

Pouvez vous m'aider?

 

On peut en déclarer dans l'interface du QA, en lua dans la/le QA, dans l'onglet Général/Variables, dans les scènes...

Les variables créées en Lua (QA ou Scène) perdent leurs valeurs après un redémarrage. Confirmez vous?

Les variables créées dans l'interface QA ou Général/variables conservent leurs valeurs après un redémarrage. Confirmez vous?

Pourquoi créer des variables dans l'interface du QA plutôt que dans Général/Variables? Pour éviter de les avoir "pèle mêle" dans le Général ? C'est ça?

 

self:getVariable("MaVariable") -- Pour utiliser une variable dans une QA créée dans celle ci?
fibaro.getGlobalVariable("MaVariable") -- Pour utiliser une variable dans une QA ou Scène créée dans Général?
api.get("/devices/" .. ID) -- Pour utiliser dans une QA ou Scène une variable d'une autre QA?
fibaro.call(ID, "getVariable", "MaVariable") --Pour utiliser dans une QA ou Scène une variable d'une autre QA?

C'est bien ça?

 

 

et heu... si déjà j'y suis avec toutes mes questions...

Dans les exemples de la doc Fibaro sur les QA, ils mettent toujours self.Mavariable. Mais il me semble que ça fonctionne aussi sans. C'est quoi l'utilité?

 

Les variables utilisées dans le QA ou scène, (pas déclaré dans une interface). Sont elles accessibles de l'extérieur?

Modifié par Franco268
Une question de plus

Partager ce message


Lien à poster
Partager sur d’autres sites

Hello,

 

J'essai d'utiliser cette fonction dans une QA pour récupérer une varaible d'une autre QA:

fibaro.call(ID, "getVariable", "MaVariable")

C'est sensé fonctionner? Car j'obtiens toujours un nil. Pourtant je suis sûr de l' ID, de ma variable et de sa valeur.

Faut il faire qqchose de spécial? 

 

EDIT: Je commence à comprendre plus clairement ce qui est dit dans ce fil...

fibaro.call ne peut rien retourner, du coup, ça ne peut pas fonctionner...

 

J'ai essayé la fonction du code GEA: 

function tools.getVariable(self, variable)

Elle fonctionne sans problème pour récupérer une variable dans ma QA écrite comme ceci: 

tools.getVariable(self, "MaVairable")

Mais pas quand je l'écris comme ça pour récupérer une variable d'une autre QA:

tools.getVariable(38, "MaVairable")

Pouvez vous m'aider?

Modifié par Franco268
Précision/update

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors en effet, fibaro.call() ne peut être utilisé que pour appeler (= exécuter) une fonction dans un autre QuickApp, mais sans retour d'état.

Ce qui implique :

- impossible de savoir si l'action demandée a bien été exécutée

- impossible d'appeler une fonction qui retourne une valeur

 

Je remets ici la code source de la fonction tools.getVariable() pour être certain qu'on parle bien de la même :

tools = tools or {}

--
-- Get QuickApp variable silently without showing warning message in case variable does not exist
--
-- Usage :
-- local mavariable = tools.getVariable(self, "debug")
-- local mavariable = tools.getVariable(1234, "debug")
--
function tools.getVariable(self, variable)
	local id = type(self) == "userdata" and self ~= tools and self.id or type(self) == "number" and self > 0 and self
	if id then
		if type(variable) == "string" and name ~= "" then
			local device
			if type(self) == "userdata" then
				device = self
			else
				device = api.get('/devices/' .. tostring(id))
			end
			if device then
				if type(device.properties) == "table" and type(device.properties.quickAppVariables) == "table" then
					for _, v in ipairs(device.properties.quickAppVariables) do
						if v.name == variable then
							return v.value
						end
					end
				else
					tools:warning("tools:getVariable() : can't get QuickApp variables")
				end
			else
				tools:error("tools:getVariable() : can't find device", type(self), tostring(self))
			end
		else
			tools:error("tools:getVariable() : invalid variable name :", type(variable), tostring(variable))
		end
	else
		tools:error("tools:getVariable() : invalid self device :", type(self), tostring(self))
	end
end

 

Du coup, si tu l'utilises sur le device ID 38, ça devrait fonctionner, si ce module possède bien la variable demandée (attention aux fautes, majuscule, etc)

 

Si ça ne fonctionne pas chez toi, quelle affichage as-tu ? Tu dois au moins avoir un message d'erreur.
 

Attention, cette fonction de ma librairie tools utilise également d'autres fonctions : tools:warning et tools:error() qu'il faut que tu penses à copier/coller également (ou bien remplacer par un print() tout simple)

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

ne serait pas simplement un problème lié aux variables locales qui ne peuvent être appelées que dans dans leur propre QA (sans faire intervenir l'artillerie lourde), à contrario des VG ?

 

Stef

Modifié par couillerot

Partager ce message


Lien à poster
Partager sur d’autres sites

Qu'appelles-tu variables "locales" ?

Si ce sont des variables créées à l'exécution dans le code LUA (local mavariable = valeur), alors oui en effet, il est évident qu'elles ne peuvent être accédées en dehors du code lui-même.

 

Pour moi la discussion porte bien que les variables du QuickApp, telles que définies dans son onglet Variables :

 

image.png.47688ec06df4504e42053f77fc3d77c8.png

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci Lazer pour tes réponses!

Concernant le fibaro.call, c'est bien plus clair!

Concernant ta fonction ci dessous: 

tools.getVariable(38, "MaVairable")

Ben..heu...comment dire... je cherchais une variable...que heu...je pensais... avoir créée. Et qui ben... n'existait pas... :94:

Concernant le message d'erreur, je n'avais que celui ci dessous. Pas assez explicite pour moi puisque j'étais convaincu que ma variable n'était pas vide. Quand on persiste.. on persiste aussi dans la bêtise!

main.lua:578: attempt to concatenate a nil value (local 'JourChome')

 

Mais n'existe t il pas une fonction plus direct pour récupérer des variables d'un autre VD?

On est obligé de les lister et filtrer?

Partager ce message


Lien à poster
Partager sur d’autres sites

A ma connaissance, non, il n'existe pas de fonction plus directe pour récupérer des variables d'un autre QA.... d'où ma fonction perso.

Et oui, obligé de parcourir la liste jusqu'à trouver la bonne, de toute façon je suis persuadé que la fonction native QuickApp:setVariable() fait la même chose sur la QA lui-même (avec au moins 2 différences par rapport à ma fonction quand la variable n'existe pas : elle renvoie une string vide "" au lieu de nil, et affiche un message d'avertissement dans le log). Si la variable n'existe pas, ma fonction est silencieuse (elle n'affiche rien), et renvoie juste nil. Ce qui permet au programmeur de tester la valeur de retour et en déduire si la variable existe ou non.

 

Ce test de la valeur de retour, m'amène à te conseiller de systématiquement tester la valeur de retour d'une fonction avant de l'exploiter, sous peine de plantage de code, ce qui t'es justement arrivé : "attempt to concatenate a nil value"

Je dis cela en général dans tous tes codes LUA, pas uniquement pour la fonction getVariable()

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon aller la question sera peut être ridicule, mais cela fait 4 heures que je tourne en rond, à croire que j'aurais du rester sur ma HC2...

J'essaie de remettre en place des fonctions que j'avais sur ma HC2, le lua était déjà pas mon fort, mais à force j'avais trouvé quelques repère, mais là je sombre.

 

Je souhaite tout simplement récupérer la valeur d'un ID et l'intégrer dans une variable de mon QA

En bref

mon QA 426 est un " ID fake"  avec les valeurs remontée par ma Jeedom (Je remonte ma distance entre Tel et mon domicile, cela fonctionne en propriété "Value")

mon QA 401 doit lire la valeur l'intégrer dans une variable propre à lui. En option l'afficher dans le label QA, mais j'ai bien compris que sur cette partie il faut peut être changer la façon de faire.

 

function QuickApp:loop()
 
 
self:statut_dst = fibaro.getValue (426"Value"--on lit la valeur    Comment récupère on la propriété value ?? 
self:setVariable("DISTANCE_TEL",  self.statut_dst)
self:updateView("DSTHome""text", self.statut_dst)   --DSTHome étant l'ID de mon Label
 
fibaro.setTimeout(1000function() self:loop()end)
end

Merci d'avance.

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je pense que ça devrait fonctionner, condensé en 1 seule ligne :

local value = api.get("/devices/426").properties.value

Après tu fais ce que tu veux de la variable value, l'afficher dans un label, etc

 

EDIT : mais pourquoi afficher ça dans un label, alors que ton module 426 a déjà la bonne value ?

Tu as juste à lui mettre la bonne unité (en mètres, km, etc), et l'affichage sera juste parfait dans la page web, sur l'appli mobile, etc.

 

EDIT 2 : je n'avais pas vu ton code LUA (pense à utiliser les balises qui vient bien pour l'insérer dans ton post)

Donc tu as déjà fait le boulot visiblement.

 

Modifié par Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci pour ton rapide retour, j'ai le réveil à 3h donc je vais tester cela demain...mais tu as surement raison. 

Il faut que je travail encore la manipulation général pour utiliser la variable, et que je fasse la différence entre la local celle dans le QA et la VG.

D'ailleurs pourrais tu me dire comment tu aurais écrit ton exemple mais pour une variable stocké dans le QA. Merci

 

Edit : Sur le module 426, j'ai déjà réussi à modifié l'unité en plus donc oui, je me complique peut être. En faite le module que je travail est plus un récap de différents éléments pour avoir un QA de visu utilisateur. Mais j'ai peut être encore trop le réflexe de reproduire mes éléments précédents (HC2). Je vais réfléchir ce sujet, je gagnerais peut être en simplicité...

 

Edit 2 : Pour les balises, on est d'accord on parle des balises </> code pour faire l'insertion. Je dormirais moins c.. ce soir et j'essayerais de ne pas oublier. 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Je répond à l'envers :D (mais y'a une certaine logique)

 

Réponse 2 : oui la balise </>, et dans la liste déroulante tu choisis LUA pour avoir la bonne coloration syntaxique.

 

Réponse 1 : voilà justement, tu raisonnes encore HC2, pour moi sur HC3 la notion de VD (ou QA) récapitulatif, avec tous ses labels, n'a plus vraiment de sens... ce qui amène à la réponse à la question originale :

 

Réponse 0 : je n'aurais pas écris une seule ligne de LUA. En effet, ton module 426 (mis à jour de façon externe par Jeedom) porte déjà l'information dans ses propriétés, et avec la bonne unité en prime, donc tu as tout ce qu'il faut pour l'afficher, ou bien l'exploiter dans les scénarios. D'autant plus qu'il est très facile de lire une propriété d'un module, mais bien plus complique de lire une variable, et encore pire pour un label (et pire encore, celui-ci n'est pas persistant).

 

Ma philosophie c'est d'utiliser au maximum les possibilités natives mises à disposition par la box. Sur la HC3, grâce aux QuickApps correctement typés, on couvre déjà 90% des besoins. Besoins qui n'étaient pas comblés sur HC2, puisque les VD n'étant pas typés, on était contraint de stocker et afficher les informations de manière détournée (des labels et variables globales essentiellement)

 

J'ai un cas de figure similaire au tient, j'ai une instance FHEM qui récolte des informations provenant de divers capteurs EnOcean.

Pour chaque capteur, j'ai créé un QA tout simple, du bon type, mais sans aucune ligne de code LUA.

Chaque QA voit sa propriété value mise à jour par FHEM via l'API, rien de plus, cela suffit. Je peux voir les mesures directement sur les icônes des QA, sur la page Web, sur l'application mobile, et exploiter ces valeurs dans mes scénarios (GEA quasi exclusivement)

Partager ce message


Lien à poster
Partager sur d’autres sites

Bon tu as raison je vais essayer d'évoluer sur le sujet.

J'ai modifié ma façon d'interagir avec mon ex VD dans ma GEA.. J'ai adapté mes interrogations GEA pour me passer de la gestion de variable.

Par contre j'ai encore du boulot sur la création "propre" de QA car pour démarrer j'ai repris un post existant, mais je sens bien que l'adaptation est un peu fait à l'arrache.. Je vais chercher un tuto sur le forum.

Encore Merci 

Partager ce message


Lien à poster
Partager sur d’autres sites

Il n'existe pas de tuto sur le forum pour réaliser un QuickApp pas à pas.

Il faut dire que le sujet est vaste, tant les possibilités avec les QA sont infinies.

 

Si tu lis l'anglais, et que tu n'as pas peur de passer un peu de temps à bien comprendre les fondamentaux du LUA et des QuickApps, je te conseille le tuto de @jang sur le forum officiel, en particulier ces 4 messages :

J'ai commencé par ça :)

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

:60: Merci.

Pour le temps et mon English..cela sera surement long, mais l'intérêt y est !

Partager ce message


Lien à poster
Partager sur d’autres sites

×