yoim Posté(e) le 23 janvier 2020 Signaler Posté(e) le 23 janvier 2020 J'ai un bout de code ou je dois recuperer l'etat de mon module : --[[ %% properties %% events %% globals --]] local url = 'http://192.168.42.4:9595/cm?cmnd=Power',80 fibaro:debug("oki") http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, --headers = { authentication = 'Basic '..password }, success = function(p) fibaro:debug(p.status) --fibaro:debug(p.data) jsonString = json.encode(p.data) jsonTable = json.decode(jsonString) fibaro:debug(jsonTable) if(jsonTable.POWER == ON) then fibaro:debug('null value successfully decoded') end end, error = function(err) fibaro:debug(err) end }) --fibaro:setGlobal("variable", json.encode(p.data)) --jsonTable = { value1 = 512, value2 = json.null } --jsonString = json.encode(jsonTable) -- after encoding jsonString variable contains '{ "value2": null, "value1": 512 }' string Mon retour Json est comme ca : {"POWER":"ON"} Je veux que quand mon etat est sur On ou sur Off il l'envoie dans une Global Variable. Je pense que j'ai mal ecris ca : if(jsonTable.POWER == ON) Ou alors est ce qu'il faut que je joue avec gsub ? Merci pour vos lumieres.
pepite Posté(e) le 24 janvier 2020 Signaler Posté(e) le 24 janvier 2020 Bonjour, Essaie cela dans ton code fibaro:debug(jsonTable) fibaro:debug("POWER : " .. jsonTable.POWER) fibaro:debug("Type : " .. type(jsonTable.POWER)) if (jsonTable.POWER == "ON") then fibaro:debug('null value successfully decoded') end 1
yoim Posté(e) le 24 janvier 2020 Auteur Signaler Posté(e) le 24 janvier 2020 Merci @pepite Tu es toujours là pour mes problemes Json. J'ai un retour comme qui il recupere rien dans POWER. [DEBUG] 09:27:47: oki [DEBUG] 09:27:47: 200 [DEBUG] 09:27:47: {"POWER":"ON"} [DEBUG] 09:27:47: 2020-01-24 09:27:47.904707 [ fatal] LUA error: /opt/fibaro/scenes/318.lua:27: attempt to concatenate field 'POWER' (a nil value)
yoim Posté(e) le 24 janvier 2020 Auteur Signaler Posté(e) le 24 janvier 2020 J'ai souvent ce probleme quand je veux recuperer des valeurs en Json. Je suis toujours obligé d'utiliser Gsub. Mon JSON est mal formaté ?
pepite Posté(e) le 24 janvier 2020 Signaler Posté(e) le 24 janvier 2020 tu GSUB quoi ? Viens voir ton p.data ? ou ton jsontable
yoim Posté(e) le 24 janvier 2020 Auteur Signaler Posté(e) le 24 janvier 2020 (modifié) normalement dans un tableau j'ai juste a sortir mes valeurs. Dans mon tableau J'ai un champ POWER avec une valeur ON ou OFF C'est bien un tableau ca : {"POWER":"ON"} Je n'arrive jamais a les sortir simplement ces valeurs. Je suis toujours obligé de lui donner des indications, enlever les "" ou les . C'est le deuxieme mot .... avec gsub Est ce que c'est a cause du Lua ou de la facon dont je veux recuperer les valeurs. Modifié le 24 janvier 2020 par yoim
yoim Posté(e) le 24 janvier 2020 Auteur Signaler Posté(e) le 24 janvier 2020 (modifié) Merci @pepite J'ai trouvé sur du code où tu avais aidé qq un sur ce forum. Je ne me suis peut être pas fait bien comprendre. Je voulais retrouver mon état d'un module grace a sa sortie en Json. Dans certains language et comme tu me l'avais indiqué en faisant jsonTable.POWER Je devrais tout de suite avoir ma valeur soit ON ou OFF. En lua il faut toujours retouché a ta string pour obtenir le bon résultat ... et du coup gsub et les patterns sont très interessants. Je te mets mon code qui fonctionne. J'ai flashé un module SonOff et je voulais avoir son retour d'etat. C'est chose faite. --[[ %% autostart %% properties %% events %% globals --]] local Source = fibaro:getSourceTrigger() function Run() local delay = 60 --en secondes local url = 'http://192.168.42.4:9595/cm?cmnd=Power',80 fibaro:debug("oki") fibaro:debug("Prog Launch") http = net.HTTPClient() http:request(url, { options = { method = 'GET' }, --headers = { authentication = 'Basic '..password }, success = function(p) fibaro:debug(p.status) --fibaro:debug(p.data) jsonString = json.encode(p.data) jsonTable = json.decode(jsonString) fibaro:debug(jsonTable) fibaro:debug(jsonTable.POWER) if(jsonTable.POWER == OFF) then fibaro:debug('null value successfully decoded') end fibaro:debug("Prog Launch") local power = jsonTable fibaro:debug(power) local sep = ":" local position_sep = power:find(sep) local longueur_chaine_test = power:len() local longueur_chaine_sep = sep:len() local sub_avant_sep =power:sub(position_sep+longueur_chaine_sep,longueur_chaine_test) print(longueur_chaine_test) print(position_sep) print(longueur_chaine_sep) print(position_sep+longueur_chaine_sep) print(sub_avant_sep) function removeLastChar (string) -- fonction dernier charachter return string:sub(1, -2) end local ok = removeLastChar(sub_avant_sep) --remove dernier character print (ok) local final = ok:gsub('"','') -- on del les "" print (final) fibaro:setGlobal("SonOff", final) -- on stock dans Global Variable end }) setTimeout(Run,delay*1000) end if Source["type"] == "autostart" or Source ["type"] == "other" then Run() end Merci pour tes lumieres. Modifié le 24 janvier 2020 par yoim
pepite Posté(e) le 25 janvier 2020 Signaler Posté(e) le 25 janvier 2020 Bonjour. J'ai rien allumé soit ce coup là :-) Heu si tu fais ca, ca doit pas etre un json :-) sauf si je dis une betise :-) ca doit plutot etre en mode string Envoyé de mon BND-L21 en utilisant Tapatalk
Barelle Posté(e) le 25 janvier 2020 Signaler Posté(e) le 25 janvier 2020 Je te suggère d'essayer le code suivant : --[[ %% autostart --]] local Source = fibaro:getSourceTrigger() function Run() local delay = 60 --en secondes local url = 'http://192.168.42.4:9595/cm?cmnd=Power' fibaro:debug("oki") fibaro:debug("Prog Launch") http = net.HTTPClient() http:request(url, {options = { method = 'GET' }, success = function(p) fibaro:debug(p.status) jsonTable = json.decode(p.data) fibaro:debug('jsonTable.POWER=' .. jsonTable.POWER) fibaro:setGlobal("SonOff", jsonTable.POWER) -- on stocke dans Global Variable end, error = function(err) fibaro:debug('http:request call error, error =' .. err); end }) setTimeout(Run, delay*1000) end if Source["type"] == "autostart" or Source ["type"] == "other" then Run() end 1
yoim Posté(e) le 25 janvier 2020 Auteur Signaler Posté(e) le 25 janvier 2020 En effet @Barelle ca fonctionne impec et c'est 10x plus simple. Mon erreur etait là : jsonString = json.encode(p.data) jsonTable = json.decode(jsonString) J'ai encode p.data alors qu'il fallait le decode :p Merci beaucoup C'est bien du Json 1
Messages recommandés