Aller au contenu

Messages recommandés

Posté(e) (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 :D

Au pire il faudrait faire une recherche de ton id13 dans la table parameters, mais je ne sais pas faire...

Modifié par Fredmas
  • Like 1
Posté(e) (modifié)

Je pense avoir trouvé :P

 

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é par Fredmas
  • Like 1
Posté(e)
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.

  • Like 2
Posté(e)

Salut !

 

Je vous remercie pour vos réponses ! 

Pour un premier Q.A ce n'est pas évident. :blink:

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

 

En tout cas merci à vous pour votre aide, j'ai beaucoup appris. 

 

 

 

 

  • Like 2
Posté(e)

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à. :D

 

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

  • Like 1
  • Thanks 1
Posté(e) (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é par 971jmd
Posté(e) (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é par triossrf
  • Like 1
Posté(e) (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é par Fredmas
Posté(e) (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 :D

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

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.

:P 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 :D

 

Modifié par Fredmas
Posté(e)
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

  • Like 1
Posté(e)
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

 

  • Thanks 1
Posté(e)

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  :unsure: 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 :2:

 

Du coup ma solution finale n'était pas si nulle alors en comparaison (me servant de ton indice donné)  :D

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

 

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 ;)

 

  • Thanks 1
Posté(e)

Vous êtes des machines les mecs ! :13:

 

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". 

 

  • Thanks 1
Posté(e)

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

  • Thanks 2
Posté(e) (modifié)
il y a 36 minutes, triossrf a dit :

Vous êtes des machines les mecs ! :13:

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 :2: 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 :P

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é par Fredmas
  • Thanks 1
  • Upvote 1
Posté(e)
il y a 47 minutes, Fredmas a dit :

I love it, thank you  :2: But for my part I do what I can to learn and to help.@Leisure masters and responds tit for tat :P

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 '_'.

 

  • Thanks 1
  • Upvote 1
Posté(e)

Pour revenir aux moutons de @971jmd!  :P 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 ^^ 

  • Like 1
Posté(e) (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é par Fredmas
Posté(e)
Il y a 11 heures, triossrf a dit :

Pour revenir aux moutons de @971jmd!  :P 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

 

 

  • Like 1
Posté(e)

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. 

Posté(e)

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 ?

  • Like 1
×
×
  • Créer...