Aller au contenu
971jmd

Récupérer valeur dans un API

Recommended Posts

@Fredmas

Effectivement je me suis fais le raisonnement , je pense qu'on ne peut pas avoir de résultat à cet endroit. 

 

Mais j'essai toujours de trouver des valeurs non numérique, je m'explique.

 

Quand je fais la synthax suivante: 

local ApiIntensite = api.get("/devices/"..WalliDimmer).properties.value
	self:debug("Intensite:" ..ApiIntensite) 
On obtien la valeur de "value": 0 (extrait du JSON) 

Par contre si je met: 
local ApiIntensite = api.get("/devices/"..WalliDimmer).properties.state
	self:debug("State:" ..APIState) 
Je devrais obtenir un true ou un false cependant j obtiens dans la console: 
[ERROR] [QUICKAPP530]: main.lua:22: attempt to concatenate a boolean value (local 'APIState')

Je me doute qu'il s'agit d'une erreur de synthaxe, j'ai essayer avec plusieurs manière de l'écrire. Mais je sèche. 

Modifié par triossrf

Partager ce message


Lien à poster
Partager sur d’autres sites

Normal tu définies ta variable local ApiIntensite = ... puis tu utilises APIState qui n'existe pas (en fait si, elle semble exister et est de type boolean comme l'indique ton message d'erreur, car tu dois probablement utiliser cette variable plus haut dans ton code LUA)

Partager ce message


Lien à poster
Partager sur d’autres sites

Autant pour moi @Lazer, il s'agit juste une erreur de copier/collé. 

sur mon code j'ai bien utiliser la borne synthax soit: 

    local APIProfil= api.get("/profiles").activeProfile
    local APIState = api.get("/devices/"..WalliDimmer).properties.state
    self:debug("Intensite:" ..ApiIntensite) 
    self:debug("State:" ..APIState) 

 

Je n'ai pas utilisé cette variable plus haut et le message d'erreur est bien là. 

 

Alors je m'était dis que de base quand on va chercher un api, il s'attend à une valeur numérique et non pas Boolean ou string. 

Je pense cependant que je l'ai bien localisé mais il est peut-être tout simplement pas possible de retourner une valeur autre que des numériques? 

 

Si cela peut éclairer voici une partie du JSON. (j'ai supprimer un petit peu pour que cela soit plus lisible) 

{
  "id": 522,
  "name": "Lumiere",
  "roomID": 230,
  "view": [
  ...
  ],
  "properties": {
    "parameters": [
    ...
    ],
    ],
    "configured": true,
    "dead": false,
    "deadReason": "",
    "deviceControlType": 23,
    "deviceIcon": 15,
    "endPointId": 0,
    "energy": 0.03,
    "firmwareUpdate": {
      "info": "",
      "progress": 0,
      "status": "UpToDate",
      "updateVersion": "5.1"
    },
    "isLight": true,
    "localProtectionState": 0,
    "localProtectionSupport": 5,
    "log": "",
    "logTemp": "",
    "manufacturer": "",
    "markAsDead": true,
    "model": "",
    "nodeId": 48,
    "parametersTemplate": "836",
    "power": 0,
    "productInfo": "1,15,28,1,16,0,5,1",
    "protectionExclusiveControl": 0,
    "protectionExclusiveControlSupport": false,
    "protectionState": 0,
    "protectionTimeout": 0,
    "protectionTimeoutSupport": false,
    "saveLogs": true,
    "saveToEnergyPanel": true,
    "serialNumber": "h'000000000000d04d",
    "showEnergy": true,
    "state": false,  <---- IL EST LA L AFFREUX !!!! 
    "updateVersion": "",
    "useTemplate": true,
    "userDescription": "",
    "value": 0
  },

 

 

Modifié par triossrf

Partager ce message


Lien à poster
Partager sur d’autres sites

OK donc le message d'erreur est logique, il te dit que tu ne peux pas concaténer une chaine avec un booléen. Tout simplement.

Donc tu as 2 choix pour afficher ta valeur :

self:debug("State:" .. tostring(APIState))
self:debug("State:", APIState)

 

  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 31 minutes, Lazer a dit :

OK donc le message d'erreur est logique, il te dit que tu ne peux pas concaténer une chaine avec un booléen. Tout simplement.

Donc tu as 2 choix pour afficher ta valeur :


self:debug("State:" .. tostring(APIState))
self:debug("State:", APIState)

 

Mon dieu... Maintenant que tu le dis tout parait si logique. 

Je m'obstinais à croire que c était

api.get("/devices/"..WalliDimmer).properties.state

qui n'était pas bon alors que c'était le debug... 

J'était donc bon sur la recherche du l'api mais pas sur le débug... Je pouvais toujours chercher... 

 

Merci à toi, comme d'habitude très efficace. 

 

:60:

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 22/11/2021 à 04:35, 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 ^^ 

 

salut

 

j'ai tester avec ça et toujours erreur :  main.lua:28: unexpected symbol near ')'

 

function QuickApp:modif()
api.put ("/devices/"..Walli).properties.parameters[36], {value='33'}
end

 

{
        "id": 158,
        "lastReportedValue": 16,
        "lastSetValue": 16,
        "size": 2,
        "value": 16
      },

 

 

 

bon ça fonctionne toujours bien pour afficher la valeur qui est 16

ID = api.get("/devices/"..Walli).properties.parameters[36].value

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai tester comme ça :

 

function QuickApp:modif()
api.put ("/devices/"..Walli).properties.parameters[36], value='99'
end

 

 

[13.12.2021] [21:07:05] [TRACE] [QUICKAPP470]: UIEvent: {"values":[null],"deviceId":470,"elementName":"modif","eventType":"onReleased"}
[13.12.2021] [21:07:05] [DEBUG] [QUICKAPP470]: ./include/main.lua:25: attempt to index a nil value (field 'properties')
[13.12.2021] [21:07:05] [ERROR] [QUICKAPP470]: QuickApp crashed
[13.12.2021] [21:07:05] [ERROR] [QUICKAPP470]: Unknown error occurred: handleJsonRpc

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Allé un truc comme ça par exemple, histoire de te laisser comprendre la structure du code pour trouver ton paramètre puis le modifier (attention je n'ai pas réellement essayé de mon coté) :

function QuickApp:modif()
  local toto = api.get("/devices/"..Walli)
  toto.properties.parameters[36].value = 99 --ou 33
  api.put("/devices/"..Walli, toto)
end

 

Modifié par Fredmas
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

merci :74:, entre-temps j'ai fini par trouver un code de lazer

 

 

Je vais tester tout ça ce soir

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

Ça a l’air d’être dans le même esprit, au détail près de la description de la structure de la table dans le code. 

Partager ce message


Lien à poster
Partager sur d’autres sites

j'ai tester le code de Lazer il y a quand même un problème, je m'explique.

 

Si par exemple je souhaite changer le paramètre 12 d'une walli ( paramètre 12 =changer la couleur de l'anneau quand OFF )

ça fonctionne, mai quand on se rend dans l' API du module concerné, on se rend compte que tous les autres paramètres ont disparu sauf le paramètre 12.

 

J'ai remarqué qu'il est pas possible ne modifier un autre paramètre car il y en existe qu'un seul. le 12 pour exemple

 

Visiblement pour faire apparaître tous les paramètres il faut rafraîchir et pour l'instant le code visiblement ne le fais pas

 

{
        "id": 12,
        "lastReportedValue": 7,
        "lastSetValue": 7,
        "size": 1,
        "value": 7
      }

 

Partager ce message


Lien à poster
Partager sur d’autres sites
Il y a 6 heures, Fredmas a dit :

Allé un truc comme ça par exemple, histoire de te laisser comprendre la structure du code pour trouver ton paramètre puis le modifier (attention je n'ai pas réellement essayé de mon coté) :


function QuickApp:modif()
  local toto = api.get("/devices/"..Walli)
  toto.properties.parameters[36].value = 99 --ou 33
  api.put("/devices/"..Walli, toto)
end

 

 

Je viens de tester avec ton code et lui par compte aucun problème

 

Il modifie bien le paramètre en position 36 et visiblement tous les autres paramètres sont toujours là

Partager ce message


Lien à poster
Partager sur d’autres sites

Tant mieux si cela fait ce que tu voulais alors :P

Après je n'ai absolument aucun mérite. Comme j'aime à le répéter afin de rendre à César ce qui lui appartient, la majorité de ce que je sais, je l'ai appris à gauche et à droite sur notre forum ;)

Tu sauras le partager à ton tour lorsque quelqu'un posera à nouveau la même question que toi :D

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est dingue quand même avec Fibaro comment il est possible de faire mille et une choses mais toujours pas arrivé au même point:)

 

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

Ben pas sûr que ce soit Fibaro.

Nous avons décidé de faire mieux que de simples scènes bloc en codant nous-mêmes… ben du coup la moindre variante sémantique compte et doit être comprise. Et comme souvent tout dépend de nous-mêmes du coup :D 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Pour qu'on comprenne mieux la chose

 

le code suivant 20 c'est positionné sur la 36e tables et non le paramètre 36 OK

 

function QuickApp:modif()
  local toto = api.get("/devices/"..Walli)
  toto.properties.parameters[36].value = 99 --ou 33
  api.put("/devices/"..Walli, toto)
end

 

 

ET et c'est dernier ci-dessous se positionne directement sur le paramètre 158.

Après LAZER me disait qu'il est préférable de faire une boucle,   Pourquoi exactement ?

 

 

function QuickApp:lum99()

local deviceID = 429
local mycolor = 0
local data = {
	id = tonumber(deviceID),
	properties = {
		parameters = {
			{
				id = 158,
				size = 2,
				value = 11
			}
		}
	}
}
local response, status = api.put("/devices/"..deviceID, data)
print("status : " .. status)
print("response : " .. response)


end

 

 

Modifié par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites
il y a 7 minutes, 971jmd a dit :

Après LAZER me disait qu'il est préférable de faire une boucle,   Pourquoi exactement ?


Page précédente :

 

Modifié par Fredmas
  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Salut! 

 

Pour ma part quand je souhaites modifier quelque chose par exemple: 

        WalliIntensite.properties.parameters[151].value = 30  --ou 33  
        api.put("/devices/"..WalliDimmer, WalliIntensite) 

 

Je me retrouve avec l'erreur: 

 

[ERROR] [QUICKAPP530]: main.lua:47: attempt to index a nil value (field '?')

 

Alors que je trouve bien le parametre 151 avec la boucle de recherche. 

 

Une idée? 

 

Merci d'avance ;) 

Partager ce message


Lien à poster
Partager sur d’autres sites

Attention à ne pas confondre le paramètre n°151 du module Z-Wave, avec l'index n°153 de la table qui contient les paramètres.

On en a discuté précédemment, et on a donné la boucle LUA à écrire pour retrouver l'index de la table qui correspond au bon numéro de paramètre.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 21/12/2021 à 16:52, Lazer a dit :

Attention à ne pas confondre le paramètre n°151 du module Z-Wave, avec l'index n°153 de la table qui contient les paramètres.

On en a discuté précédemment, et on a donné la boucle LUA à écrire pour retrouver l'index de la table qui correspond au bon numéro de paramètre.

@Lazer

 

J'avais procédé de la manière suivante:

-Recherche avec la boucle du paramètre 151 de mon module qui correspond à: Maximum Brigthness level. 

-Après vérification dans le Swagger, il se trouve que le Parametre 151 est égale à l'Index (ID??) 151 également. (Une erreur???)  

-Dans ma console il me transmet bien le bon résultat. 

 

Cependant je voulais le modifier en écrivant: 

        WalliIntensite.properties.parameters[151].value = 30  --ou 33  
        api.put("/devices/"..WalliDimmer, WalliIntensite) 

Et donc l'erreur est celle que j'ai précité. 

Tu pense que je me suis tromper dans la manière d'utiliser la boucle? 

Partager ce message


Lien à poster
Partager sur d’autres sites

Oui c'est fort possible, tout porte à croire qu'il n'y a pas d'index 151 dans la table.

Partager ce message


Lien à poster
Partager sur d’autres sites

Je pense comme @Lazer

Ce que tu écris va chercher le 151ème paramètre dans la liste, pas le paramètre qui possède l'ID 151.

Partager ce message


Lien à poster
Partager sur d’autres sites

Alors il y' a quelque chose que je ne saisi pas. 

Dans la boucle et dans le fonctionnement. 

 

Voici donc mon parametre 151:

Image Parametre

 

Voici mon swager avec mon id 151: 

Je veux donc modifier l'ID 151 (ID = Index exact?) 

 

6vcj.jpg

 

 

 

 

Modifié par triossrf

Partager ce message


Lien à poster
Partager sur d’autres sites

×