Fredmas Posté(e) le 18 novembre 2021 Signaler Posté(e) le 18 novembre 2021 (modifié) Je pense que c'est ton "lastSetValue" qui ne va pas dans ton code : Brillance = fibaro.getValue(Walli, "lastSetValue") Dans la liste des properties que tu as partagée, c'est d'abord parameters qu'il faut atteindre, qui est une table. La table semble être indexée (le [ m'y fait penser), et pour chaque index tu as une nouvelle table. Et c'est là que je bloque. J'ai pensé : Brillance = fibaro.getValue(Walli, "parameters[13].lastSetValue") pensant que les paramètres seraient dans l'ordre, mais ça renvoie toujours nil. si tu laisses uniquement parameters pour vérifier ça renvoie une table, normal Au pire il faudrait faire une recherche de ton id13 dans la table parameters, mais je ne sais pas faire... Modifié le 18 novembre 2021 par Fredmas 1
Fredmas Posté(e) le 18 novembre 2021 Signaler Posté(e) le 18 novembre 2021 (modifié) Je pense avoir trouvé A la place de ça : Brillance = fibaro.getValue(Walli, "lastSetValue") Essaie avec ça : Brillance = api.get("/devices/"..Walli).properties.parameters[13].lastSetValue Mais en remplaçant le 13 par la réelle position de ton id:13 dans la liste de tes paramètres. Par exemple dans ta citation page précédente ça a l'air d'être le 1. Mais à toi de vérifier. Chez moi avec un Wall Plug ça marche. Et avec toujours Walli qui est une variable contenant ton ID du module. Modifié le 18 novembre 2021 par Fredmas 1
Lazer Posté(e) le 18 novembre 2021 Signaler Posté(e) le 18 novembre 2021 il y a 46 minutes, Fredmas a dit : Au pire il faudrait faire une recherche de ton id13 dans la table parameters, mais je ne sais pas faire... C'est ce qu'il faut faire, c'est facile à faire avec une boucle for _, parameter in ipairs(...parameters) do Puis tu testes chaque élément : if parameter.id == 13 then ... end J'ai pas le courage d'écrire le code, et je préfère pas le donner car ça ne sera pas formateur, mais avec les indices que je viens de donner tu vas trouver facilement. 2
triossrf Posté(e) le 19 novembre 2021 Signaler Posté(e) le 19 novembre 2021 Salut ! Je vous remercie pour vos réponses ! Pour un premier Q.A ce n'est pas évident. Avec : Brillance = api.get("/devices/"..Walli).properties.parameters[3].lastSetValue Cela fonctionne j'ai bien la valeur du lastSetValue de l'ID 13 qui s'affiche (je l'ai confirmer en remplaçant .lastSetValue par .ID) Je suis parti du principe qu'il s'agissait de la troisième table dans "Parameters du coup j'ai mit [3] et j'ai eu le résultat directement. "properties": { "parameters": [ { "id": 11, <-- Premiere table [1] "lastReportedValue": 2, "lastSetValue": 2, "size": 1, "value": 2 }, { "id": 12, <-- Deuxieme table [2] "lastReportedValue": 0, "lastSetValue": 0, "size": 1, "value": 0 }, { "id": 13, <-- Troisieme table [3] "lastReportedValue": 76, "lastSetValue": 76, "size": 1, "value": 76 }, Corriger moi si mon raisonnement est faux. Cependant je vais m'exercer à la méthode de @Lazer car, si j'ai besoin d'avoir une information sur la table 156, je compte pas les compter un par un En tout cas merci à vous pour votre aide, j'ai beaucoup appris. 2
Fredmas Posté(e) le 19 novembre 2021 Signaler Posté(e) le 19 novembre 2021 Bon ben je n'ai pas passé 45min hier soir à te chercher cette solution pour rien si ça fonctionne et te dépanne sur cet exemple C'est cool pour toi, et aussi pour moi car au passage ça m’a permis de commencer à investiguer et apprendre la manipulation des API Fibaro, que ce soit dans un navigateur ou dans le swagger, ce que je n’avais pas encore réellement utilisé jusque-là. En parallèle oui la solution de recherche est bien plus propre, et plus facile à adapter/maintenir. Avec l'indice donné par @Lazer j'ai failli m'y mettre hier soir pour essayer de sortir un bout de code alternatif 1 1
971jmd Posté(e) le 21 novembre 2021 Auteur Signaler Posté(e) le 21 novembre 2021 (modifié) salut à tous merci pour ce partage, j'ai tester de mon cotée et ça fonctionne bien Mais j'ai une question, est-il possible de réaliser la méthode PUT avec Quick app ? Si par exemple on souhaite modifier une valeur unction QuickApp:onInit() Walli = 235 self:Raf1() end function QuickApp:Raf1() --- ID ID = api.get("/devices/"..Walli).properties.parameters[3].id self:debug("Intensité du Walli", ID) self:updateView("etat", "text", "ID " ..ID.. " ") self:debug("Intensité du Walli", ID) ---lastReportedValue lastReportedValue = api.get("/devices/"..Walli).properties.parameters[3].lastReportedValue self:debug("Intensité du Walli", lastReportedValue) self:updateView("etat2", "text", "lastReportedValue " ..lastReportedValue.. " ") self:debug("Intensité du Walli", lastReportedValue) ---brightness 13 brightness = api.get("/devices/"..Walli).properties.parameters[4].value self:debug("Intensité du Walli", value) self:updateView("etat3", "text", "brightness " ..brightness.. " % ") self:debug("Intensité du Walli", brightness) setTimeout(function() self:Raf1() end, 4*1000) end Modifié le 21 novembre 2021 par 971jmd
triossrf Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 (modifié) Salut @971jmd. Je ne sais pas si c'est exactement ça que tu entends par "put", mais je suppose que tu veux récupérer la valeur de l'API (l'ID , lastReportedValue, etc...) afin de le mettre dans un label par exemple? Si oui, je récupère les données de l'API afin de mettre à jour un label en lien avec un slider. J'ai procédé de cette manière. function QuickApp:onInit() self:WalliMaj() end local Brillance = api.get("/devices/"..Walli).properties.parameters[3].lastSetValue --<Cherche la valeur lastSetValue de l'ID 13 dans le fichier Json> function QuickApp:WalliMaj() self:debug("Intensite:" ..Brillance) --<Débug Local Brillance> self:updateView("LblSlider", "text", "Intensité:" ..Brillance) --<M.A.J Lbl Slider> self:updateView("SliderBrightness", "value", tostring(Brillance)) --<M.A.J Slider> end Modifié le 21 novembre 2021 par triossrf 1
Fredmas Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 (modifié) Je pense que @971jmd voulait parler d'un api.put pour modifier un paramètre, à la place d'un api.get pour lire un paramètre Mais il faut qu'il confirme sa question dans le doute. Modifié le 21 novembre 2021 par Fredmas
Fredmas Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 (modifié) Le 18/11/2021 à 22:48, Lazer a dit : C'est ce qu'il faut faire, c'est facile à faire avec une boucle for _, parameter in ipairs(...parameters) do Puis tu testes chaque élément : if parameter.id == 13 then ... end J'ai pas le courage d'écrire le code, et je préfère pas le donner car ça ne sera pas formateur, mais avec les indices que je viens de donner tu vas trouver facilement. Salut @Lazer en me réveillant ce matin je me suis dit : allé je sais faire une boucle donc cherche un peu tu as le cerveau frais Alors j'ai testé cela et ça a fonctionné, mais avec un principal problème qui est de définir le 5 de la boucle car si on met un chiffre trop élevé évidemment ça plante puisqu'on indexe un i qui pour la recherche d'une valeur qui n'existe pas dans la table, et pas assez élevé ça ne couvre pas toute la table. Et compter à la main combien de paramètres existent tu m'as compris. Voir ci-dessous : local Walli = 85 -- ici ID du module concerné de triossrf local Brillance -- la variable de triossrf local data = {} for i = 1,5 do data[i] = {} local m,rechercheId = data[i],nil m.rechercheId = api.get("/devices/"..Walli).properties.parameters[i].id if m.rechercheId == 10 then Brillance = api.get("/devices/"..Walli).properties.parameters[i].lastSetValue print(Brillance) end end J'ai vaqué à mes occupations le reste de la journée, puis je m'y suis remis ce soir en regardant ton idée de ipairs que je n'avais encore jamais testé, sachant que la solution devait être vers là, . Et voilà ce que ça donne après quelques tests : le code ci-dessous qui fonctionne très bien chez moi : local Walli = 85 -- ici ID du module concerné de triossrf local Brillance -- la variable de triossrf for i, parameters in ipairs(api.get("/devices/"..Walli).properties.parameters) do if parameters.id == 13 then Brillance = (api.get("/devices/"..Walli).properties.parameters[i].lastSetValue) print("La valeur est "..Brillance) end end J'ai remplacé ton _ par i mais uniquement pour ma compréhension. Car j'ai essayé et les 2 fonctionnent, mais il y a peut-être une subtilité avec le _ que je ne connais pas. Sois indulgent c'est mon premier ipairs, mais n'hésite pas à me dire si je n'ai pas trouvé la bonne solution ou si on peut mieux faire Modifié le 21 novembre 2021 par Fredmas
971jmd Posté(e) le 21 novembre 2021 Auteur Signaler Posté(e) le 21 novembre 2021 il y a une heure, Fredmas a dit : Je pense que @971jmd voulait parler d'un api.put pour modifier un paramètre, à la place d'un api.get pour lire un paramètre Mais il faut qu'il confirme sa question dans le doute. salut oui il s'agit bien d'un api.put pour modifier un paramètre 1
Lazer Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 il y a une heure, Fredmas a dit : Alors j'ai testé cela et ça a fonctionné, mais avec un principal problème qui est de définir le 5 de la boucle car si on met un chiffre trop élevé évidemment ça plante puisqu'on indexe un i qui pour la recherche d'une valeur qui n'existe pas dans la table, et pas assez élevé ça ne couvre pas toute la table. Et compter à la main combien de paramètres existent tu m'as compris. Voir ci-dessous : Tu peux compter le nombre d'éléments d'une table avec # Tes boucles sont une horreur ( ) car tu refais un appel à api.get à chaque passage dans la boucle... niveau performance c'est catastrophique. local parameters = api.get("/devices/"..Walli).properties.parameters for i = 1, #parameters do local parameter = parameters[i] if parameter.id == 10 then local brillance = parameter.lastSetValue print(brillance) break -- pour sortir immédiatement de la boucle, inutile de continuer end end il y a une heure, Fredmas a dit : J'ai remplacé ton _ par i mais uniquement pour ma compréhension. Car j'ai essayé et les 2 fonctionnent, mais il y a peut-être une subtilité avec le _ que je ne connais pas. On n'a pas besoin de i (qui est l'index, la clé, ou key en anglais), donc on met _ pour ne pas utiliser cette variable Du coup le code ci-dessous fait la même chose que le précédent : for _, parameter in ipairs(api.get("/devices/"..Walli).properties.parameters) do if parameter.id == 13 then local Brillance = parameter.lastSetValue print("La valeur est "..Brillance) break -- pour sortir immédiatement de la boucle, inutile de continuer end end 1
Fredmas Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 Oui merci pour la précision concernant l'horreur des boucles du premier essai. Maintenant que tu le dis je ne peux qu'être d'accord avec toi et il faut que j'essaie de prendre l'habitude de faire attention à cela. Je l'ai mis pour partager mon évolution de la journée entre les 2 solutions réfléchies, je n'aurais peut-être pas du poster la première m'ayant servie de brouillon pour la deuxième Du coup ma solution finale n'était pas si nulle alors en comparaison (me servant de ton indice donné) for i, parameters in ipairs(api.get("/devices/"..Walli).properties.parameters) do if parameters.id == 13 then Brillance = (api.get("/devices/"..Walli).properties.parameters[i].lastSetValue) print("La valeur est "..Brillance) end end for _, parameter in ipairs(api.get("/devices/"..Walli).properties.parameters) do if parameter.id == 13 then local Brillance = parameter.lastSetValue print("La valeur est "..Brillance) break -- pour sortir immédiatement de la boucle, inutile de continuer end end Merci pour la précision du _ que j'avais bien testé mais ton explication aide à comprendre le pourquoi du comment. Bien vu pour la différence d'écriture de la valeur dans la variable Brillance. A lire c'est logique, mais je n'y avais absolument pas pensé Pareil pour le break, absolument pas pensé. Comme quoi j'ai encore à apprendre En tout cas cet exercice du jour m'a permis de mieux appréhender la gestion des tables, et m'ouvre des possibilités à réfléchir dans mes QA existants... mais il me faut un peu de temps de digestion Merci pour la mise sur la piste sans avoir donné la réponse 1
Fredmas Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 En tout cas @triossrf tu as ta solution de recherche de paramètres maintenant 1
triossrf Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 Vous êtes des machines les mecs ! En tout cas dans ce topic j'aurais appris comment aller chercher dans l'A.P.I et comment faire une boucle. Si je comprend bien, ipairs correspond à un index ou une valeur numérique? Par contre je n'ai pas compris la subtilité du "_" a la place du "i". 1
Lazer Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 for, pairs, et ipairs, permettent tous les 3 de parcourir une table (en fait for est même plus générique que ça) ipairs() s'utilise avec les tables qui ont un index numérique => {"apple", "banana"} pairs() s'utilise avec les tables qui ont un index alphanumérique => {pomme = "apple", banane = "banana"} ipairs est préférable quand c'est possible car : - plus rapide - respecte l'ordre des éléments du tableau... ce qui n'est pas le cas de pairs car il parcoure la table dans un ordre indéfini qui peut changer à tout moment En terme de performance, for est le plus rapide de tous, mais la syntaxe est un peu plus lourde comme on le voit dans l'exemple ci-dessus, ça rend le code moins lisible, donc pas forcément conseillé. Je ne sais pas trop comment expliquer pour _, tu peux aller voir cet échange peut être que ça sera plus clair : https://stackoverflow.com/questions/34475995/variable-in-lua-has-a-special-meaning/34476522 Citation It's usually used as a throwaway variable. It has no "real" special meaning, but is used to signify that the indicated value is not important. The variable consisting of only an underscore "_" is commonly used as a placeholder when you want to ignore the variable... Et là : http://lua-users.org/wiki/LuaStyleGuide 2
Fredmas Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 (modifié) il y a 36 minutes, triossrf a dit : Vous êtes des machines les mecs ! En tout cas dans ce topic j'aurais appris comment aller chercher dans l'A.P.I et comment faire une boucle. J'adore, merci Mais de mon côté je fais ce que je peux pour apprendre et pour aider. @Lazer maitrise et répond du tac au tac Parce que même quand je ne sais pas faire, chercher pour aider quelqu'un me permet aussi d'apprendre, la meilleure preuve avec tes demandes dans ce topic Et si tu as appris c'est mission remplie. Parce que donner la solution appliquée sans apprendre c'est dommage selon moi il y a 36 minutes, triossrf a dit : Si je comprend bien, ipairs correspond à un index ou une valeur numérique? Un lien qui me sert beaucoup pour lire, relire, lire, et relire, afin d'apprendre à coder en LUA. il y a 36 minutes, triossrf a dit : Par contre je n'ai pas compris la subtilité du "_" a la place du "i". Si j'ai bien compris, que tu précises "index", "i", "key", "toto", ça revient au même pour appeler l'indexage numérique d'une table. Sauf que mettre _ semble faire pareil sans avoir besoin d'utiliser un caractère créant une variable. Mais là je te dis ce que je pense, je peux me tromper même si j'ai l'impression d'avoir compris. Modifié le 21 novembre 2021 par Fredmas 1 1
jang Posté(e) le 21 novembre 2021 Signaler Posté(e) le 21 novembre 2021 il y a 47 minutes, Fredmas a dit : I love it, thank you But for my part I do what I can to learn and to help.@Leisure masters and responds tit for tat Because even when I don't know how to do it, looking to help someone also allows me to learn, the best proof with your requests in this topic And if you have learned it is mission fulfilled. Because giving the applied solution without learning is a shame in my opinion A link that I use a lot to read, reread, read, and reread, in order to learn to code in LUA. If I understood correctly, that you specify "index", "i", "key", "foo", it is the same to call the numerical indexing of a table. Except that putting _ seems to do the same without needing to use a character creating a variable. But here I am telling you what I think, I could be wrong even if I have the impression of having understood. _ is a variable like all others... _ = 42 for _,_ in ipairs(({ 6,5,4,3 })) do print(_) end print(_G['_']) A_B, _A, _ are all valid variable names. However, as @Leisure points out it's a convention to name a temporary (local) variable that you don't need '_' as a signal to other that reads the code. Ex. code checking programs (LuaLint, Luacheck) also don't warn for "unused variables" if the variable is named '_'. 1 1
triossrf Posté(e) le 22 novembre 2021 Signaler Posté(e) le 22 novembre 2021 Pour revenir aux moutons de @971jmd! Et non, on ne ta pas oublié ! Je pense que l'on peut utiliser les codes suivants: api.delete("") api.get("") api.post("", {}) api.put("", {}) Aprés c'est toujours le même soucis, il faut trouver la bonne synthax ^^ 1
Fredmas Posté(e) le 22 novembre 2021 Signaler Posté(e) le 22 novembre 2021 (modifié) Le 21/11/2021 à 21:27, Lazer a dit : (...) tu peux aller voir cet échange peut être que ça sera plus clair : https://stackoverflow.com/questions/34475995/variable-in-lua-has-a-special-meaning/34476522 Et là : http://lua-users.org/wiki/LuaStyleGuide Merci @Lazer pour ton explication et pour les liens que j'ai commencé à lire hier soir Le 21/11/2021 à 22:27, jang a dit : A_B, _A, _ are all valid variable names. However, as @Leisure points out it's a convention to name a temporary (local) variable that you don't need '_' as a signal to other that reads the code. Ex. code checking programs (LuaLint, Luacheck) also don't warn for "unused variables" if the variable is named '_'. Thank you @jang for you complementary explanation Modifié le 6 décembre 2021 par Fredmas
Lazer Posté(e) le 22 novembre 2021 Signaler Posté(e) le 22 novembre 2021 Il y a 22 heures, jang a dit : However, as @Leisure points out This guy looks cool Oh wait, it's me.... very strange bug 1
971jmd Posté(e) le 22 novembre 2021 Auteur Signaler Posté(e) le 22 novembre 2021 Il y a 11 heures, triossrf a dit : Pour revenir aux moutons de @971jmd! Et non, on ne ta pas oublié ! Je pense que l'on peut utiliser les codes suivants: api.delete("") api.get("") api.post("", {}) api.put("", {}) Aprés c'est toujours le même soucis, il faut trouver la bonne synthax ^^ oui sur HC 2 j'étais assez alése avec la méthode PUT deviceID=52 local json = '{"id":'..deviceID..',"properties":{"localProtectionState": "2"}}'; -- valeurs à changer dans parametres local HC2 = Net.FHttp("127.0.0.1", 11111) local response, status, errorCode = HC2:PUT("/api/devices?id="..deviceID, json) if tonumber(status) == 200 then fibaro:debug("Security locked") else fibaro:debug("err ID: "..deviceID.. " status: "..status) end 1
triossrf Posté(e) le 25 novembre 2021 Signaler Posté(e) le 25 novembre 2021 @971jmd As tu réussis à faire un api.put ?
971jmd Posté(e) le 25 novembre 2021 Auteur Signaler Posté(e) le 25 novembre 2021 (modifié) non pas sur HC3, c'est trop fort pour moi Modifié le 25 novembre 2021 par 971jmd
triossrf Posté(e) le 28 novembre 2021 Signaler Posté(e) le 28 novembre 2021 Salut a tous. Me revoilà avec une petite question. Je me suis amuser à utiliser le API.get mais cela ne fonctionne pas pour tout et je ne sais l'expliquer... Des lumières aussi briantes que vous pourrons m'éclairer je n'en doute pas. Je voulais donc récupérer la valeur suivantes (ringcolor, je suppose que c'est la couleur actuel): "type": "com.fibaro.FGWR111", "baseType": "com.fibaro.FGR", "enabled": true, "visible": true, "isPlugin": false, "parentId": 38, "viewXml": false, "configXml": false, "interfaces": [ "energy", "levelChange", "power", "ringColor", <----- Je voudrais la valeur du ringcolor "zwave", "zwaveAlarm", "zwaveMultiChannelAssociation", "zwaveProtection" ], J'ai donc écrit le code suivant: local Walli = 41 local APIRing = api.get("/devices/"..Walli).interfaces.ringColor function QuickApp:WalliMaj() self:debug("APIRING:" ..APIRing) --<Débug A.P.I > end Ce qui me donne la réponse: main.lua:61: attempt to concatenate a nil value (upvalue 'APIRing') J'ai essayer plusieurs synthax mais le résultat n'est jamais concluant. Pourtant j'arrive à récupérer d'autres éléments mais seulement numérique mais dés lors que c'est du texte ou du boolean hé bien je n'est pas de résultat. merci du coup de pousse.
Fredmas Posté(e) le 2 décembre 2021 Signaler Posté(e) le 2 décembre 2021 Au risque de me tromper, je pense que tu n'appelles pas au bon endroit. Tu appelles "ringColor" dans la table "interfaces" et qui plus est ne semble pas avoir de valeur. Rien d'intéressant pour ton besoin plus bas dans le json dans les proterties ? 1
Messages recommandés