Lazer Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 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.
OJC Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 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
Lazer Posté(e) le 11 décembre 2017 Auteur Signaler Posté(e) le 11 décembre 2017 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.
jojo Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 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 ...
Lazer Posté(e) le 11 décembre 2017 Auteur Signaler Posté(e) le 11 décembre 2017 Trouvé 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 }] } 2 1
jojo Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 comment tu as fait pour deviner ? tu as regardé dans ta boule de cristal ?
mprinfo Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 n'est pas dieu qui veut [mention=1320]jojo[/mention] tu vois tout ce que tu loupes .... Envoyé de mon SM-G901F en utilisant Tapatalk
Lazer Posté(e) le 11 décembre 2017 Auteur Signaler Posté(e) le 11 décembre 2017 @jojo oui celle-ci : 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), 1 1 1
jojo Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 qui a une HC2 d'occasion à vendre ? C'est bientôt Noël. 1
pepite Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 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
jojo Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 toi aussi tu as des dons de voyance ?
pepite Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 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
jjacques68 Posté(e) le 11 décembre 2017 Signaler Posté(e) le 11 décembre 2017 merci @Lazer, c’est de la tuerie ça !!!!
mprinfo Posté(e) le 12 décembre 2017 Signaler Posté(e) le 12 décembre 2017 qui a une HC2 d'occasion à vendre ? C'est bientôt Noël.@lazer on peut pas faire un concours pour gagner une hc2 si il faut je suis prêt a faire plein de compte pour faire gagner@jojoEnvoyé de mon SM-G901F en utilisant Tapatalk 1
OJC Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 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 ?
pepite Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 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) 1
OJC Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 @pepite oué, du coup c'est ce que je suis en train de coder . Merci ! 1
Lazer Posté(e) le 5 janvier 2018 Auteur Signaler Posté(e) le 5 janvier 2018 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....
pepite Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 il y a 8 minutes, Lazer a dit : mais ça ne répond pas à la question. ca detourne ;-)
Lazer Posté(e) le 5 janvier 2018 Auteur Signaler Posté(e) le 5 janvier 2018 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.
OJC Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 (modifié) @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' Modifié le 5 janvier 2018 par OJC 1
MAM78 Posté(e) le 5 janvier 2018 Signaler Posté(e) le 5 janvier 2018 Est-ce que ça fonctionne également dans le main loop du VD afin d'y déporter le code identique relatif aux différents boutons du même VD ?
Lazer Posté(e) le 5 janvier 2018 Auteur Signaler Posté(e) le 5 janvier 2018 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.
Messages recommandés