Aller au contenu

retour "nil" dans fonction parse data


Messages recommandés

Posté(e)

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

 59f7d9ba2bec3_InkedScreenshot(02h59m20s)_LI.thumb.jpg.75d6302ea4ac2004fb73bd0eff6b8af8.jpg

 

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

 

Posté(e)

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

Posté(e)

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

Posté(e)

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

  • Upvote 2
Posté(e) (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 :60:

 

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

Modifié par zed30290
  • Upvote 1
×
×
  • Créer...