zed30290 Posté(e) le 31 octobre 2017 Signaler Posté(e) le 31 octobre 2017 Bonjour, Suite au sujet erreur json api et grâce a l'aide du membre Geoffrey, j'ai pu réussir à obtenir les résultat attendus sur la plupart des infos que je cherchais à afficher. Cependant sur une api en particulier j'ai une erreur qui me pose soucis, Voici l'api https://api.nicehash.com/api?method=stats.provider.ex&addr=13vD4m3N2XyZFyQFJeXytmrPMEjTUYhEYL un petit bout du retour json qui m'intéresse "result": { "current": Array[8][ { "profitability": "0.00000039", "data": Array[2][ { }, "0.00014655" ], "name": "Keccak", "suffix": "MH", "algo": 5 }, { "profitability": "0.00000752", "data": Array[2][ { "a": "125.27" }, "0.00431344" ], "name": "Lyra2REv2", "suffix": "MH", "algo": 14 }, { La scène --[[ %% properties %% events %% globals --]] local id = 183 local wallet = "13vD4m3N2XyZFyQFJeXytmrPMEjTUYhEYL" local label_hashrate = "Labelhashrate" local url_hashrate = "https://api.nicehash.com/api?method=stats.provider.ex&addr="..wallet local function nicehashhashrate(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local total = 0 fibaro:debug(p.data) for i = 1, #json_table["result"]["current"] do profi = json_table["result"]["current"][i]["profitability"] fibaro:debug(profi) end for w = 1, #json_table["result"]["current"] do hash = json_table["result"]["current"][w]["data"]["a"] fibaro:debug(hash) end fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", profi.."BTC") end, error = function(err) fibaro:debug(err) end }) end nicehashhashrate(url_hashrate, id, label_hashrate) Dans cette scène, j'essaye de récupérer la valeur des pattern "a" (dans l'exemple au dessus "125.27") quand elles existent, mais le résultat est toujours nul, je précise que pour le pattern "profitability" j'ai un bon retour J'ai aussi essayé avec la syntaxe suivante : for w = 1, #json_table["result"]["current"]["data"] do hash = json_table["result"]["current"]["data"][w]["a"] le but final est de multiplier la valeur de "profitability" par celle de "a" quand "a" existe et ne pas prendre en compte la valeur de "profitability" si "a" n'existe pas dans sa table. Précision, le json est très long et seule la partie "current" m'intéresse. Aussi, parfois j'ai une erreur "std::size_t" qui s'affiche Merci d'avance
pepite Posté(e) le 31 octobre 2017 Signaler Posté(e) le 31 octobre 2017 Bonjour, Et ceci plutot non ? json_table.result.current.i.data.w.a ou json_table.result.current.i.data.a J'ai mis le json dans http://jsonviewer.stack.hu/ On voit bien ;-)
Lazer Posté(e) le 31 octobre 2017 Signaler Posté(e) le 31 octobre 2017 Il n'est pas possible "d'attraper" directement la valeur data.a car data[] est un tableau (Array) Quelque chose comme ça ira mieux : data[1].a A mettre en forme dans le code LUA...
pepite Posté(e) le 31 octobre 2017 Signaler Posté(e) le 31 octobre 2017 ah oui je l'ai zappe tiens ;-)
zed30290 Posté(e) le 31 octobre 2017 Auteur Signaler Posté(e) le 31 octobre 2017 Je vous remercie pour vos réponses qui m'ont bien aidé j'ai utilisé la syntaxe suivante pour avoir le résultat attendu for w = 1, #json_table["result"]["current"] do hash = json_table["result"]["current"][w]["data"][1]["a"] par simple curiosité, il est possible de remplacer les "[" par des "." dans une déclaration de variable? Je commence à apprendre le lua et ses subtilités
Lazer Posté(e) le 31 octobre 2017 Signaler Posté(e) le 31 octobre 2017 Oui tout à fait, tu devrais pouvoir écrire cela : for w = 1, #json_table["result"]["current"] do hash = json_table["result"]["current"][w]["data"][1]["a"] de la façon suivante : for w = 1, #json_table.result.current do hash = json_table.result.current[w].data[1].a et ça devrait revenir au même (pas testé, donc j'espère ne pas avoir fait d'erreur de syntaxe) Tu noteras que "w" et "1" restent entre crochets, car ce sont des indices, respectivement des arrays "current" et "data". D'ailleurs, vu que data est un array, tu peux le parcourir, ce qui donne : for w = 1, #json_table.result.current do for x = 1, #json_table.result.current[w].data do fibaro:debug(json_table.result.current[w].data[x].a or "<nil>") Remarque l'ajout de " or "<nil>"" pour éviter un plantage, au cas où la valeur n'existe pas et retournerait nil (équivalent de null ou NULL dans d'autres langage) Enfin, pour optimiser tout cela, il veut mieux éviter de compter le nombre d'élément d'un array à chaque passage dans la boucle (question de performance). Donc on fait cela : local nb_w = #json_table.result.current for w = 1, nb_w do local nb_x = #json_table.result.current[w].data for x = 1, nb_x do fibaro:debug(json_table.result.current[w].data[x].a or "<nil>") end end Pas testé non plus, mais l'idée est là. 2
zed30290 Posté(e) le 1 novembre 2017 Auteur Signaler Posté(e) le 1 novembre 2017 (modifié) Une nouvelle fois merci pour vos éclaircissements, j'ai enfin réussi à faire tout ce que je voulais avec ce projet. Cela m'a aussi permis de découvrir le LUA (et la programmation en générale) de façon plus pertinente, j'ai pu apprendre au cours de cette semaine les différentes manières de déclarer une variable, les boucle "for..do", la concaténation, les caractères magiques et les classes de caractère (regex), les tables, les chaînes de caractères, les indices, la recherche dans une chaîne avec string.match et string.gmatch, les fonctions mathématique et enfin le fonctionnement d'un json, le moyen de le parcourir et de l'interroger depuis la fonction net.Httpclient Voici la scène complète, créée par le membre Geoffrey mais que j'ai modifié pour l'api de Nicehash --[[ %% properties %% events %% globals --]] --------------------------------------------------------------- --------------------------------------------------------------- local id = 183 local wallet = "13vD4m3N2XyZFyQFJeXytmrPMEjTUYhEYL" local label_cours = "Labelcours" local label_hashrate = "Labelhashrate" local label_balance = "Labelbalancebtc" local label_paiement = "Labelpaiementbtc" --------------------------------------------------------------- --------------------------------------------------------------- local url_cours = "https://blockchain.info/fr/ticker" local url_hashrate = "https://api.nicehash.com/api?method=stats.provider.ex&addr="..wallet local url_balance ="https://api.nicehash.com/api?method=stats.provider&addr="..wallet local url_paiement = "https://api.nicehash.com/api?method=stats.provider&addr="..wallet local eur = "last" local cours = 0 local function nicehashprice(url, id_vd, label_vd, value) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) cours = json_table["EUR"][value] fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", json_table["EUR"][value].."€") fibaro:debug(cours) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end local function nicehashhashrate(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local nb_w = #json_table["result"]["current"] local hash = 0 --fibaro:debug(p.data) for i = 1, nb_w do profi = json_table["result"]["current"][i]["profitability"] --fibaro:debug("profi"..i..":"..profi) if(i == 1) then keccakp = profi elseif(i == 2) then lyra2Rev2p = profi elseif(i == 3) then daggerHashimotop = profi elseif(i == 4) then decredp = profi elseif(i == 5) then cryptoNightp = profi elseif(i == 6) then lbryp = profi elseif(i == 7) then equihashp = profi elseif(i == 8) then blake2sp = profi end end for w = 1, nb_w do hash = json_table["result"]["current"][w]["data"][1]["a"] if(hash == nil ) then hash = 0 end if(w == 1) then keccakh = hash elseif(w == 2) then lyra2Rev2h = hash elseif(w == 3) then daggerHashimotoh = hash elseif(w == 4) then decredh = hash elseif(w == 5) then cryptoNighth = hash elseif(w == 6) then lbryh = hash elseif(w == 7) then equihashh = hash elseif(w == 8) then blake2sh = hash end --fibaro:debug("hash"..w..":"..hash) end --fibaro:debug("keccap Profit ="..keccakp.." hash ="..keccakh) --fibaro:debug("lyra2Rev2 Profit ="..lyra2Rev2p.." hash ="..lyra2Rev2h) --fibaro:debug ("daggerHashimoto Profit =".. daggerHashimotop.." hash =".. daggerHashimotoh) --fibaro:debug ("decred Profit ="..decredp.." hash ="..decredh) --fibaro:debug ("cryptoNight Profit ="..cryptoNightp.." hash ="..cryptoNighth) --fibaro:debug ("lbry Profit ="..lbryp.." hash ="..lbryh) --fibaro:debug ("equihash Profit ="..equihashp.." hash ="..equihashh) --fibaro:debug ("blake2s Profit ="..blake2sp.." hash ="..blake2sh) total = tonumber((keccakp*keccakh)+(lyra2Rev2p*lyra2Rev2h)+(daggerHashimotop*daggerHashimotoh)+(decredp*decredh)+(cryptoNightp*cryptoNighth)+(lbryp*lbryh)+(equihashp*equihashh)+(blake2sp*blake2sh)) totaleur = tonumber(total*cours) fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value",round(totaleur, 2).."EUR") fibaro:debug(totaleur) end, error = function(err) fibaro:debug(err) end }) end local function nicehashbalance(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local total = 0 --fibaro:debug(p.data) for i = 1, #json_table["result"]["stats"] do total = total + tonumber(json_table["result"]["stats"][i]["balance"]) end fibaro:debug(total) fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", total.."BTC") end, error = function(err) fibaro:debug(err) end }) end local function nicehashpaiment(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local totalp = 0 --fibaro:debug(p.data) for i = 1, #json_table["result"]["payments"] do totalp = totalp + tonumber(json_table["result"]["payments"][i]["amount"]) fibaro:debug("paiement :"..totalp) end fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", totalp.."BTC") --fibaro:debug(p.status) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end function round(num, dec) local num = tonumber(num) local mult = 10^(dec or 0) return math.floor(num * mult + 0.5) / mult end nicehashprice(url_cours, id, label_cours, eur) nicehashhashrate(url_hashrate, id, label_hashrate) nicehashbalance(url_balance, id, label_balance) nicehashpaiment(url_paiement, id, label_paiement) et la scène original pour nanopool crée par Geoffrey --[[ %% properties %% events %% globals --]] --------------------------------------------------------------- --------------------------------------------------------------- local id = 176 local wallet = "0xfA67E6aDa212CD2eF44cC21Dd69562Faf2582aFC" local label_cours = "Labelcours" local label_hashrate = "Labelhashrate" local label_balance = "Labelbalanceeth" local label_paiement = "Labelpaiementeth" --------------------------------------------------------------- --------------------------------------------------------------- local url_cours = "https://api.nanopool.org/v1/eth/prices" local url_hashrate = "https://api.nanopool.org/v1/eth/reportedhashrate/"..wallet local url_balance ="https://api.nanopool.org/v1/eth/balance/"..wallet local url_paiement = "https://api.nanopool.org/v1/eth/payments/"..wallet local eur = "price_eur" local function nanopoolprice(url, id_vd, label_vd, value) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", json_table["data"][value].."€") local jcvd = json_table["data"]["price_eur"] fibaro:setGlobal("coursbtc", jcvd) fibaro:debug(jcvd) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end local function nanopoolhashrate(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", round(json_table["data"], 2).."Mh/s") --fibaro:debug(p.status) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end local function nanopoolbalance(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local baleth = round(json_table["data"], 8) fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", round(json_table["data"], 8).."ETH") fibaro:setGlobal("Baleth", baleth) fibaro:debug(baleth) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end local function nanopoolpaiment(url, id_vd, label_vd) local http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, success = function(p) local json_table = {} local json_table = json.decode(p.data) local total = 0 --fibaro:debug(p.data) for i = 1, #json_table["data"] do total = total + tonumber(json_table["data"][i]["amount"]) fibaro:debug(i) end fibaro:call(id_vd, "setProperty", "ui."..label_vd..".value", round(total, 8).."ETH") --fibaro:debug(p.status) --fibaro:debug(p.data) end, error = function(err) fibaro:debug(err) end }) end function round(num, dec) local num = tonumber(num) local mult = 10^(dec or 0) return math.floor(num * mult + 0.5) / mult end nanopoolprice(url_cours, id, label_cours, eur) nanopoolhashrate(url_hashrate, id, label_hashrate) nanopoolbalance(url_balance, id, label_balance) nanopoolpaiment(url_paiement, id, label_paiement) Encore un grand merci à vous tous pour votre aide Modifié le 1 novembre 2017 par zed30290 1
Messages recommandés