Aller au contenu

Messages recommandés

Posté(e)

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

 

 

  • Upvote 1
Posté(e)

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

 

Posté(e) (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é par 971jmd
Posté(e)

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. 

Posté(e)

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

 

 

 

Posté(e) (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é par 971jmd
Posté(e)

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)

 

Posté(e) (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

 

  

protec.JPG.e30ed5cb590f3a740274cc94a8ca00a2.JPG

 

mai j'ai toujours le meme probleme, pour valider il f aut cliquer sur la DISQUETTE 

cap2.JPG.1431512023c02db02387bca198e1145c.JPG

 

 

 

 

Modifié par 971jmd
Posté(e) (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)

protec.JPG.f2bcd0367acd375b33988441f1cc5c7d.JPG

 

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é par 971jmd
Posté(e) (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é par pepite
Posté(e) (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

 

captu.thumb.JPG.b53916c6c4999770c8b6355027e4f99b.JPG

Modifié par 971jmd
Posté(e)

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

Posté(e) (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é par 971jmd
Posté(e)

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

 

Posté(e)

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é ?

Posté(e)

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

 

×
×
  • Créer...