Aller au contenu

Equivalent de fibaro:getSelfId() mais pour un bouton


Lazer

Recommended Posts

On connait tous la fonction fibaro:getSelfId() qui permet au code LUA d'obtenir l'ID du VD dans lequel il est en train de s'exécuter. Pratique pour mettre à jour l'icone, un label, etc.

 

Mais est-il possible d'obtenir l'ID du bouton sur lequel l'utilisateur a cliqué ?

J'avoue que je sèche là, je ne sais même pas si c'est possible.

Lien vers le commentaire
Partager sur d’autres sites

Possible, oui, de manière simple, non.

 

Il faut boucler la table retournée par api.get(/devices/ID) pour retrouver le numéro d'ordre (je pense que c'est ce que tu entends pas ID) du bouton avec son nom. J'avais commencé à regarder, l'organisation de la table est assez complexe...

 

Très précisément, il faut boucler la propriété rows et, quand tu tombes sur une propriété type = button, boucler la table elements qui contient une table pour chaque bouton, table dans laquelle caption contient le nom du bouton (qu'a priori tu connais) et l'ID. Pb, si le nom du bouton change, plus moyen de retrouver l'ID (sauf éventuellement à rechercher avec string.match un marqueur spécifique dans le code du bouton (propriété msg).

 

Pour être franc, j'en était arrivé à une telle usine à gaz que j'ai laissé tomber <_<

Lien vers le commentaire
Partager sur d’autres sites

Parcourir la table ne me pose pas de souci, je le fais déjà.

 

Mais là où je bute, c'est justement sur le " dans laquelle caption contient le nom du bouton (qu'a priori tu connais) " que justement je ne connais pas, c'est ce que je cherche à récupérer !

C'est bien ce qui me gène, comment savoir sur quel bouton a appuyé l'utilisateur ? Je veux dire, comment le code peut le détecter tout seul ?

 

Prenons un cas concret : j'ai un VD de pilotage d'un ampli... avec 15 boutons identiques permettant de choisir la source (entrée audio) de l'ampli. Ces boutons sont tous identiques, à un détail prêt, une variable dans le code LUA qui contient l'identifiant de l'entrée à passer en paramètre de la requête Web de l'API HTTP de l'ampli.

Plutôt que de multiplier le code LUA correspondant, l'idée c'est d'envoyer le tout en paramètre à une scène avec startScene() et les arguments qui vont bien. Dans les arguments, je voudrais mettre l'ID du bouton, afin que la scène puisse faire un retour vers le bouton lorsqu'elle a fini de s'exécuter. Par exemple, écrire un message dans le debug du bouton.

 

Lien vers le commentaire
Partager sur d’autres sites

il y a 57 minutes, Lazer a dit :

On connait tous la fonction fibaro:getSelfId() qui permet au code LUA d'obtenir l'ID du VD dans lequel il est en train de s'exécuter. Pratique pour mettre à jour l'icone, un label, etc.

 

Mais est-il possible d'obtenir l'ID du bouton sur lequel l'utilisateur a cliqué ?

J'avoue que je sèche là, je ne sais même pas si c'est possible.

demande au support, maintenant que tu as tes entrées.

et quand tu auras trouvé avec l'aide de @OJC, tu leur expliqueras comment ...

Lien vers le commentaire
Partager sur d’autres sites

Trouvé :D

 

Variable interne non documentée :

fibaro:debug(_elementID_)

Retourne l'ID du bouton, tel que présent dans le JSON du VD, c'est le même ID qu'on utilise quand on fait des pressButton depuis un autre VD/Scène.

 

Dans l'exemple présent, le code ci-dessus affiche 20, ce qui correspond bien :

{
	"type": "button",
	"elements": [{
		"id": 20,
		"lua": true,
		"waitForResponse": false,
		"caption": "Test appel scene",
		"name": "Button51",
		"empty": false,
		"msg": "fibaro:debug(_elementID_)\n",
		"buttonIcon": 0,
		"favourite": false,
		"main": false
	}]
}

 

  • Like 2
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

@jojo oui celle-ci :

gallery_133_82_113267.jpg

En vrai, cela se passe dans /opt/fibaro/PluginManagerGluer.lua :

fibaro.debug = function(self, text)
        fibaro:call(fibaro:getSelfId(), "addDebugMessage", _elementID_, text, "debug")
end

 

 

Dans la Main Loop d'un VD, la variable _elementID_ vaut tout simplement 0.

 

 

J'arrive à faire ce que je veux, c'est juste parfait.

 

Code dans un bouton de VD :

fibaro:startScene(2, {{VD_ID = fibaro:getSelfId()}, {Button_ID = _elementID_}})
fibaro:debug("Scene launched")

Extrait simplifié du code dans la scène :

local VD_ID
local Button_ID
local params = fibaro:args()
if params then
	for k, v in ipairs(params) do
		if v.VD_ID then
			VD_ID = v.VD_ID
		end
		if v.Button_ID then
			Button_ID = v.Button_ID
		end
	end
end

-- Ici la scène effectue tout plein de traitements qui prennent du temps

-- Envoie le message de fin de traitement de la scène dans le debug du bouton appelant :
fibaro:call(VD_ID, "addDebugMessage", Button_ID, "Message injecté depuis la scène", "debug")

Et dans le debug du bouton, on retrouve bien ses propres messages, ainsi que ceux envoyés depuis la scène :

[DEBUG] 21:05:56: Scene launched
[DEBUG] 21:05:56: Message injecté depuis une scène

 

En synthèse, depuis une scène, on sait maintenant effectuer tous les traitements autrefois dévolus aux boutons de VD, grâce aux passages de paramètres : mise à jour d'icone, mise à jour de label, mise à jour de debug, mise à jour de slider, etc.

L'intérêt est la simplification du code, au lieu de répéter N fois du code similaire dans chaque bouton, on déporte tout cela dans la scène.

 

C'est particulièrement utile dans les VD permettant de piloter des éléments Home cinéma (réglage des nombreuses entrées, des DSP, etc),

  • Like 1
  • Haha 1
  • Upvote 1
Lien vers le commentaire
Partager sur d’autres sites

Bonsoir, bonsoir, 

 

Je passe tard, désolé, je l'avais aussi ;-) en tout cas merci @Lazer.

 pour l'explication.

@jojo tu vas craquer ça te manque trop ;-)

 

Je l'avais découvert quand @Steven nous avait fait sin auto sur le addDebugMessage

Lien vers le commentaire
Partager sur d’autres sites

Non non, moi aucun, ou alors je suis la boule du voyant @Steven ;-)

 

En fait au moment du auto sur le addDebugMessage j'avais essaye de le "porter" pour GEA. Je lui avais proposé. 

J'avais donc cherché ce que elementID de son auto voulait dire. 

En fait, il peut prendre la valeur 0 ou 2 uniquement pour les addDebugMessage

Lien vers le commentaire
Partager sur d’autres sites

  • 4 weeks later...
Le 11/12/2017 à 21:16, Lazer a dit :

-- Envoie le message de fin de traitement de la scène dans le debug du bouton appelant : fibaro:call(VD_ID, "addDebugMessage", Button_ID, "Message injecté depuis la scène", "debug")

@Lazer Existe-t-il une fonction équivalente permettant de faire l'inverse, c'est-à-dire que le VD envoie un message dans le debug d'une scène ?

Lien vers le commentaire
Partager sur d’autres sites

tu peux peut-etre utilise fibaro:args() depuis le VD qui envoie à la scene ce que tu souhaites dans le debug

 

du genre


 

-- depuis le VD
fibaro:startScene(id_scene,
  {
    {toto = "ok"},
    {titi = 'vancances'},
  }
)

-- Dans la scene
local params = fibaro:args()
if params then
    for k,v in ipairs(params) do
      if v.toto then v.toto = toto end
      if v.titi then v.titi = titi end
    end
end

print(v.toto.. "-" ..v.titi)

 

  • Like 1
Lien vers le commentaire
Partager sur d’autres sites

Ca fonctionne et c'est ce que j'utilise, mais ça ne répond pas à la question.

 

J'avais donné l'API sur un autre topic (qui avait donné lieu au watchdog à l'époque). Faudrait retrouver le truc....

Lien vers le commentaire
Partager sur d’autres sites

Bon en fait je viens de regarder, ça ne va pas être simple, l'injection de message dans le debug d'une scène ne passe plus par l'API http, mais par une communication IPC entre processus Linux.

Donc on peut lire sans problème le debug d'une scène "GET: /api/scenes/1/debugMessages", mais on ne peut plus l'écrire.

Lien vers le commentaire
Partager sur d’autres sites

@pepite@Lazer C'est étrange... Quand je clique sur le bouton du VD, j'ai bien mon message qui vient s'ajouter dans la zone de debug de la scène. En revanche, quand depuis cette scène, je clique sur le bouton, rien ne s'affiche (alors que je clique bien sur le bon bouton).

 

Auriez-vous une idée du problème ?

 

EDIT = Compris, en fait ça va trop vite pour c'te pauvre HC2... Du coup, j'ai ajouté un fibaro:sleep(1000) juste avant de faire fibaro:startScene() et ça roule impec' :60:

Modifié par OJC
  • Haha 1
Lien vers le commentaire
Partager sur d’autres sites

Je suppose que oui, mais pas testé.

Perso pour la Main loop, je préfère conserver un design monolithique avec un code autosuffisant, qui ne dépend pas d'une scène externe.

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...