Aller au contenu

Velux ... intégration avec HC2, un peu de teasing :-)


Messages recommandés

@pepite  effectivement si je rajoute le fibaro:debug(json.encode(response)) voila ce que j'obtiens

 

image.png.d232bbdbf1e3427b664ff8c581681317.png

 

et on retrouve bien la suite de caractères juste après "data"....  reste plus qu'à trouver comment passer outre...

je suppose que c'est à ca que servent les deux commandes tail -n +2 et  jq -r dans l'exemple du shell, puisque tail - n +2 va prendre ce qui suit la deuxième ligne, donc ce qui suit le "\n"

 

mais bon, c'est quoi l'équivalent en lua ??

Lien vers le commentaire
Partager sur d’autres sites

Salut @Cardane,

 

Ben voila, c'est mieux ;-)

 

PS : En fait on voit bien dans le headers le "Connection"

 

Donc le

fibaro:debug(json.encode(response.data)) est correct, la reponse est bien la fermeture des caracteres.

 

Ton fibaro:debug(jsonTable.token) renvoie bien la ligne avec le token.

 

C'est bizarre, mais je tenterais bien jsonTable.token.token pour le recuperer.

 

L'erreur fatale lua parle du caractere @ ..

 

Pour voir le formatage du json, as tu essaye de joindre l'api depuis un navigateur ?

 

Modifié par pepite
Lien vers le commentaire
Partager sur d’autres sites

Salut @pepite  je viens d'essayer ta solution, ca ne marche pas.

 

En fait je reste persuadé que c'est le retour à la ligne qui pose problème. Si je regarde l'exemple en shell ci-dessus, il utilise bien le "tail -n +2" pour prendre la deuxième ligne (donc après le \n)

Il n'y a pas une fonction quelque part qui pourrait me transformer tout ca en string ....  ensuite je me débrouille pour manipuler la string...  

Lien vers le commentaire
Partager sur d’autres sites

Re @Cardane. Dommage cela aurait été trop facile

 

Alors pour les string et les patterns, c'est ma bete noire ;-) , string....

https://www.lua.org/manual/5.3/manual.html#6.4

 

MAis tu as raison, un petit tostring sur un response.xxxxx

puis un string.find ou match, puis un gsub (ou pas)..et hop

 

Pour ca, je fais appel à DES amis, pas le choix, pourtant j'adore les strings...(je devais la faire..) mais je galere...rajoute au pattern...

@Lazer, @Steven, @MAM78, @OJC, @jojo J'en oublie c'est sur ;-)

Lien vers le commentaire
Partager sur d’autres sites

De manière très simpliste. Si on prend un retour en json :

 

local response = json.encode({token="ABCDEFG", result=true, deviceStatus="IDLE", data={}})

Et qu'on veux chercher simplement la valeur (un string) d'un élément, il suffit de faire ainsi :

local key = "token"
print(response:match("\""..key.."\":.(%w+)."))

 

Il ne faut pas d'espace dans la valeur mais pour un token, il n'y en a jamais :-)

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

il y a 7 minutes, Steven a dit :

il suffit de faire ainsi

hihi oui oui mais c'est bien sûr ;-)

 

 bon j'ai presque compris :

\ pour echapper les " et les garder

%w : tout ce qui est alphanumerique

+ : pour la repetition

les parentheses autour de %w+ : pour la capture

 

Si déjà j'ai "bon" sur ce que je viens de dire suis heureux lol

MAIS je ne comprends pas les . devant et après (%w+)

HELP ;-))

 

@Cardane : voila voila ;-) reste plus qu'a trouvert l'origine de cette erreur lua dans ta copie d'ecran ;-)

Lien vers le commentaire
Partager sur d’autres sites

@pepite dans l'exemple de @Steven, la valeur de response est :

 

{"token":"ABCDEFG","result":"true","deviceStatus":"IDLE","data":{}}

 

Donc, les points, c'est pour dégager les guillemets autour de ABCDEFG. Dans un pattern, ça désigne n'importe quel caractère.

 

C'est la même chose que :

local key = "token"
print(response:match("\""..key.."\":\"(%w+)\""))

 

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

En effet.

 

C'est vraiment un pattern des plus basique juste pour répondre à la question qui est de récupéré le token ... mais comme je viens de voir qu'il y a des "==" dans le token, cela ne fonctionne pas :angry:

 

Voici donc une autre proposition : 

print(response:match("\""..key.."\":\"([A-Za-z0-9|=%.%+%s]+)\""))

Soit tout les caractères entre A et Z (A-Z), entre a et z (a-z), entre 0 et 9 (0-9), le pipe (|), le égale (=) , le point (.), le (+) et l'espace (%s)

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

Sinon pour exploiter sous format de variable table, essaie de faire une boucle pour voir ce qui sort :

 

        success = function(response)
      				print ("Je suis dans response")
  					local jsonTable = json.decode(response.data)
					for i, j in pairs(jsonTable) do
						fibaro:debug(tostring(i) .. " - " .. tostring(j))
  					end
                end,

 

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

@pepite @Steven @OJC

 

bon, soit j'ai encore loupé un truc mais j'essaie avec le code de @Steven et ca ne marche pas...

voilà le code

 

klf:request(url , {
        success = function(response)
      				print ("Je suis dans response")
      				fibaro:debug(json.encode(response))
      				local temp = json.encode(response) 
      				fibaro:debug(temp)
      				local key = "token"
					print(temp:match("\""..key.."\":.(%w+)."))
                end,

 

et voilà le debug

 

 

5a0ec0f7d9adb_Greenshot2017-11-1711_58_30.thumb.png.988cbde92457ffa7dbe36cd93113f608.png

Lien vers le commentaire
Partager sur d’autres sites

@Cardane oui, bien possible. Essaie comme ça du coup :

 

        success = function(response)
      				print ("Je suis dans response")
  					response.data = string.gsub(response.data, ")]},\n", "")
  					local jsonTable = json.decode(response.data)
					for i, j in pairs(jsonTable) do
						fibaro:debug(tostring(i) .. " - " .. tostring(j))
  					end
                end,

 

Lien vers le commentaire
Partager sur d’autres sites

local response = "\"status\":200\n{\"token\":\"ABCD|E FG==\",\"result\"=true, data={}}"

local key = "token"
local token = response:match("\""..key.."\":\"(([A-Za-z0-9|=%.%+%s]+))\"")
print(token)

EDIT : Oublie il y a aussi des / dans ton token

Lien vers le commentaire
Partager sur d’autres sites

Et ben ce n'est pas moi qui allait trouver cela ;-) ou alors après 32 demandes et dans 6 mois lol

Franchement, les pattern ne m'aiment pas..j'ai beau lire relire, quand ca veut pas ;-)

 

Donc révision pattern : le . pour degager ? ;-)

Modifié par pepite
Lien vers le commentaire
Partager sur d’autres sites

@OJC@Steven

toujours le même résultat "nil"

 

en fait le token change à chaque fois, donc il n'y a pas toujours les caractères d'échappement

 

voici le dernier test

local url = 'http://'.. ip .. '/api/v1/auth'
local datas = '{"action":"login","params":{"password":"velux123"}}'

local klf = net.HTTPClient()
klf:request(url , {
        success = function(response)
      				fibaro:debug(json.encode(response))
      				local temp = json.encode(response) 
      				fibaro:debug(temp)
      				local key = "token"
      				print(temp:match("\""..key.."\":\"(.+)\","))
					
                end,

 et le résultat...5a0ed53de0ade_Greenshot2017-11-1713_25_02.thumb.png.52dee9b563ca7e164aed425bd78da537.png

 

 

Lien vers le commentaire
Partager sur d’autres sites

×
×
  • Créer...