pepite Posté(e) le 22 avril 2017 Signaler Posté(e) le 22 avril 2017 Salut @971jmd Oui, il n'y a pas de if ni de json.encode ni decode, car tout est dans la fonction api.get C'est plus simple et plus rapide à écrire ;-) Regarde ca 1
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 merci beaucoup vous deux j'ai autre chose, j'ai ce code: local id = 5 -- ID du FGRM à modifier function Update() local httpClient = net.HTTPClient(); httpClient:request('http://127.0.0.1:11111/api/devices/' .. id, { success = function(response) if tonumber(response.status) == 200 or tonumber(response.status) == 202 then print("Updated at " .. os.date()); else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'PUT', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = "{\"id\":" .. id .. ",\"properties\":{\"protectionLocal\":0, \"protectionRF\":0}}" } }); end Update() si je souhaite le modifier avec la fonction api.get local protec = api.get("/api/devices/16") protec.properties.protectionLocal = 0 api.put("/api/devices/16", protec) ou je me trompe
pepite Posté(e) le 22 avril 2017 Signaler Posté(e) le 22 avril 2017 Pour moi ça devrait le faire. Mais attention tu as 2 ils différents : 5 et 16
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 j'ai comme erreur [DEBUG] 14:39:05: line 11: attempt to index local 'protec' (a nil value)
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 (modifié) pour faire simple et comprendre local idevice = 16 local toto = api.get("/devices/" ..idevice) toto.name = coucou api.put("/devices/16", toto) je cherche a modifier le nom d'un device, mai cela ne fonctionne pas Modifié le 22 avril 2017 par 971jmd
pepite Posté(e) le 22 avril 2017 Signaler Posté(e) le 22 avril 2017 Attention, tu ne peux pas TOUT modifier depuis l'API. La plupart du temps que les properties. A l'inverse, tu peux tout LIRE, amis je t'avoue que je n'ai jamais testé de tout lire.
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 J'arrive a modifier en mode PUT depuis l'API don je pense qu'il a un probleme concernant le format avec le code je modifier tous qui est en format NUMÉRIQUE mai le format TEXTE non
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 (modifié) j'essaye avec ça le code doit modifier userDescription d'un module id16 local idpanel = 16 local toto = api.get("/devices/" ..idpanel) print(">>>> " ..json.encode(toto.properties.userDescription)) local texte = bonjour function urlencode(str) if (str) then str = string.gsub (str, "\n", "\r\n") str = string.gsub (str, "([^%w ])", function (c) return string.format ("%%%02X", string.byte(c)) end) str = string.gsub (str, " ", "+") end return str end toto.properties.userDescription = "..urlencode(tostring(texte or "empty"))" api.put("/devices/16", toto) mai j'ai des erreur Modifié le 22 avril 2017 par 971jmd
pepite Posté(e) le 22 avril 2017 Signaler Posté(e) le 22 avril 2017 Ceci fonctionne pour moi local idModule = 25 local json = api.get("/devices/"..idModule) print ("Nom avant: " ..json.properties.userDescription) json.properties.userDescription = "toto" print ("Nom après : " ..json.properties.userDescription) api.put("/devices/"..idModule, json)
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 j'ai oublier les "" "toto"
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 (modifié) Il y a 2 heures, 971jmd a dit : merci beaucoup vous deux j'ai autre chose, j'ai ce code: local id = 5 -- ID du FGRM à modifier function Update() local httpClient = net.HTTPClient(); httpClient:request('http://127.0.0.1:11111/api/devices/' .. id, { success = function(response) if tonumber(response.status) == 200 or tonumber(response.status) == 202 then print("Updated at " .. os.date()); else print("Error " .. response.status) end end, error = function(err) print('error = ' .. err) end, options = { method = 'PUT', headers = { ["content-type"] = 'application/x-www-form-urlencoded;' }, data = "{\"id\":" .. id .. ",\"properties\":{\"protectionLocal\":0, \"protectionRF\":0}}" } }); end Update() si je souhaite le modifier avec la fonction api.get local protec = api.get("/api/devices/16") protec.properties.localProtectionState = 2 api.put("/api/devices/16", protec) ou je me trompe local protec = api.get("/api/devices/16") protec.properties.localProtectionState = 2 api.put("/api/devices/16", protec) ------------------- local protec = api.get("/api/devices/16") protec.properties.RFProtectionState = 1 api.put("/api/devices/16", protec) je revient sur ce code la, le code modifie bien localProtectionState": "2" et RFProtectionState": "1" et quand je regard dans le paramètre je vois bien que la protection est active mai j'ai toujours le meme probleme, pour valider il f aut cliquer sur la DISQUETTE Modifié le 22 avril 2017 par 971jmd
971jmd Posté(e) le 22 avril 2017 Auteur Signaler Posté(e) le 22 avril 2017 (modifié) voici les codes local idModule = 16 local json = api.get("/devices/"..idModule) print ("Nom avant: " ..json.properties.localProtectionState) json.properties.localProtectionState = 2 print ("Nom après : " ..json.properties.localProtectionState) api.put("/devices/"..idModule, json) --------------------------------------- local idModule = 16 local json = api.get("/devices/"..idModule) print ("Nom avant: " ..json.properties.RFProtectionState) json.properties.RFProtectionState = 1 print ("Nom après : " ..json.properties.RFProtectionState) api.put("/devices/"..idModule, json) mai le volet fonctionne toujours avec le bouton et l'application sur mon tel il, manque un code pour enregistrée ou metre a jour ...... Modifié le 22 avril 2017 par 971jmd
971jmd Posté(e) le 23 avril 2017 Auteur Signaler Posté(e) le 23 avril 2017 salut j'ai ce Module Virtuel que me propose le forum FIBARO https://forum.fibaro.com/index.php?/topic/25187-localprotectionstate-json/&do=findComment&comment=117888 mai je comprend pas trop comment le faire fonctionner
pepite Posté(e) le 24 avril 2017 Signaler Posté(e) le 24 avril 2017 (modifié) Bonjour, Tu peux le faire en 1 fois ;-) pour le api.get et api.put local idModule = 16 local json = api.get("/devices/"..idModule) print ("Nom avant: " ..json.properties.localProtectionState) json.properties.localProtectionState = 2 print ("Nom après : " ..json.properties.localProtectionState) print ("Nom avant: " ..json.properties.RFProtectionState) json.properties.RFProtectionState = 1 print ("Nom après : " ..json.properties.RFProtectionState) api.put("/devices/"..idModule, json) sinon pour ce que te propose le forum officiel, je n'ai pas de login, je ne vois donc rien. Tu peux partager le code du VD ? Modifié le 24 avril 2017 par pepite
971jmd Posté(e) le 24 avril 2017 Auteur Signaler Posté(e) le 24 avril 2017 salut @pepite prtoectionlocal.vfib et pour le code API Je vais essayé en une seul foi pour voir
971jmd Posté(e) le 24 avril 2017 Auteur Signaler Posté(e) le 24 avril 2017 (modifié) non toujour pareille j'ai comparé les deux API avec un plugin de notpad+++ et il y rien d'autre que sans protection : RFProtectionState": "0", et localProtectionState": "0", avec protection: RFProtectionState": "1", et localProtectionState": "2", Pour valider il faut cliquer sur la disquette Modifié le 24 avril 2017 par 971jmd
pepite Posté(e) le 24 avril 2017 Signaler Posté(e) le 24 avril 2017 en 1 seule fois c'eait juste pour gagneren nombre de lignes et c'est plus propre ;-) ..ce n'etait pas pour faire le save. Je ne peux pas lire le vfib pour l'instant, si tu veux tu peux mettre le code ;-)
971jmd Posté(e) le 24 avril 2017 Auteur Signaler Posté(e) le 24 avril 2017 (modifié) -------------------- --- mHome --------------- --Phamj An Nhan ------------- ------------------------------------------------------ USER = "Kythuat@kimsontien.com" --User HC2 PASSWORD = "xxxxxxx" --Password HC2 --------------------------------------------- id_device=226 --@############################### --######################## Unprotected=0 No_remoteControl=1 No_operation_possible=2 --################################# --################################# function encode(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end function change(login, pass, id,status1,status2) if tonumber(status1)~=0 and tonumber(status1)~=2 then fibaro:debug("Status1 error: ".. status1) return 100 elseif tonumber(status2)~=0 and tonumber(status2)~=1 then fibaro:debug("Status2 error: ".. status2) return 100 else tcp = Net.FTcpSocket("localhost", 80); if (not tcp) then fibaro:debug("TCP CONNECTING WITH HC2 ERROR!"); return nil; end boundary = "WebKitFormBoundaryZaeBOOn6SiGG9oyo"; enter = "\r\n"; content = "{\"args\":[".. status1 .."," .. status2 .."]}" fibaro:debug(content) tcp:write("POST /api/devices/" .. id .. "/action/setProtection HTTP/1.1" .. enter); tcp:write("Host: localhost" .. enter); tcp:write("Content-Length: " .. string.len(content) .. enter); tcp:write("Authorization: Basic " .. encode(USER..":"..PASSWORD) .. enter); tcp:write("Content-Type: application/x-www-form-urlencoded; charset=UTF-8" .. boundary .. enter .. enter); s = 0; for i = 1, #content do b, e = tcp:write(string.char(string.byte(content, i))); s = s + b; end status, err = tcp:read(); fibaro:debug("Sended " .. s .. " content bytes with result [" .. err .. "]."); if (tonumber(err)>0) then return nil; end return 0; end end --@############################### --######################## change(USER, PASSWORD, id_device,Unprotected,Unprotected); il y peut être quel chose dans le code qui vas nous permettre de valider notre code API Modifié le 24 avril 2017 par 971jmd
pepite Posté(e) le 24 avril 2017 Signaler Posté(e) le 24 avril 2017 Re, Ah oui, il fait du tcp ;-) ..pas de mon niveau ce genre de code ;-) Mais voila ce que j'ai compris, à tester avec tout le VD --@############################### --######################## USER = "Kythuat@kimsontien.com" --User HC2 PASSWORD = "xxxxxxx" --Password HC2 id_device = 16 Unprotected=0 ----enlever la protection No_remoteControl=1 -- RFProtectionState": "1" No_operation_possible=2 --localProtectionState": "2" --################################# --################################# function encode(data) local b='ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/'; return ((data:gsub('.', function(x) local r,b='',x:byte() for i=8,1,-1 do r=r..(b%2^i-b%2^(i-1)>0 and '1' or '0') end return r; end)..'0000'):gsub('%d%d%d?%d?%d?%d?', function(x) if (#x < 6) then return '' end local c=0 for i=1,6 do c=c+(x:sub(i,i)=='1' and 2^(6-i) or 0) end return b:sub(c+1,c+1) end)..({ '', '==', '=' })[#data%3+1]) end function change(login, pass, id,status1,status2) if tonumber(status1)~=0 and tonumber(status1)~=2 then fibaro:debug("Status1 error: ".. status1) return 100 elseif tonumber(status2)~=0 and tonumber(status2)~=1 then fibaro:debug("Status2 error: ".. status2) return 100 else tcp = Net.FTcpSocket("localhost", 80); if (not tcp) then fibaro:debug("TCP CONNECTING WITH HC2 ERROR!"); return nil; end boundary = "WebKitFormBoundaryZaeBOOn6SiGG9oyo"; enter = "\r\n"; content = "{\"args\":[".. status1 .."," .. status2 .."]}" fibaro:debug(content) tcp:write("POST /api/devices/" .. id .. "/action/setProtection HTTP/1.1" .. enter); tcp:write("Host: localhost" .. enter); tcp:write("Content-Length: " .. string.len(content) .. enter); tcp:write("Authorization: Basic " .. encode(USER..":"..PASSWORD) .. enter); tcp:write("Content-Type: application/x-www-form-urlencoded; charset=UTF-8" .. boundary .. enter .. enter); s = 0; for i = 1, #content do b, e = tcp:write(string.char(string.byte(content, i))); s = s + b; end status, err = tcp:read(); fibaro:debug("Sended " .. s .. " content bytes with result [" .. err .. "]."); if (tonumber(err)>0) then return nil; end return 0; end end --@############################### --######################## --- Mettre la protection change(USER, PASSWORD, id_device,No_remoteControl,No_operation_possible) -- Enlever la protection, tout remettre à 0 --change(USER, PASSWORD, id_device,Unprotected,Unprotected
971jmd Posté(e) le 24 avril 2017 Auteur Signaler Posté(e) le 24 avril 2017 et non, le volet fonctionne toujours
pepite Posté(e) le 24 avril 2017 Signaler Posté(e) le 24 avril 2017 T as rien dans le debug :-)?Envoyé de mon Nexus 5X en utilisant Tapatalk
971jmd Posté(e) le 25 avril 2017 Auteur Signaler Posté(e) le 25 avril 2017 salut [DEBUG] 23:45:37: {"args":[0,0]} [DEBUG] 23:45:37: Sended 14 content bytes with result [0].
pepite Posté(e) le 25 avril 2017 Signaler Posté(e) le 25 avril 2017 Bonjour, D'après ton debug, tu as envoyé 0 et 0 donc normal que cela fonctionne encore. Tu n'as pris ce que je t'ai proposé ?
971jmd Posté(e) le 25 avril 2017 Auteur Signaler Posté(e) le 25 avril 2017 salut quel que soi la combinaison c'est toujours la même chose, sauf quand je mes : Unprotected=1 EBUG] 05:53:17: Status2 error: 2
Messages recommandés