Aller au contenu

Un peu d'aide sur le remplacement de PUT du Net.FHttp de HC2


Messages recommandés

Posté(e)

Bonjour à tous,

 

Je ne trouve pas comment faire le PUT dans une HC3 (que je viens de recevoir, en remplacement de ma HC2).

Il se trouve que j'ai ce code là :

local deviceID = fibaro:getGlobal("IdWallPlug"); --ID de Wallplug
local IpHC2 = fibaro:get(fibaro:getSelfId(), "IPAddress"); -- IP HC2
local LoginHC2 = fibaro:getGlobal("LoginHC2"); -- login
local MdpHC2 = fibaro:getGlobal("MdpHC2"); -- mot de passe
local mycolor = '0'; -- choix de la couleur

local text_remplace = '{"id":62,"size":1,"value":'..mycolor..'}';
local text_json = '{"id":'..deviceID..',"properties":{"parameters":['..text_remplace..']}}';

local HC2 = Net.FHttp(IpHC2, 80);
HC2:setBasicAuthentication(LoginHC2, MdpHC2);
local response ,status, errorCode = HC2:PUT("/api/devices/"..deviceID, text_json);
fibaro:debug("Status: "..status);
fibaro:debug("Error Code: "..errorCode);

Et j'aimerai l'adapter dans la HC3, dans un QuickApp si j'ai bien compris.

 

Or je n'y arrive pas, malgré les exemples fournis par Laser pour du code des scènes HC2 qui semble être identique pour la HC3.

J'ai aussi cherché à utiliser api.put(), mais sans succès à cause de l'authentification... :(

 

Pouvez-vous me donner un exemple de traduction du code ci-dessus pour un QuickApp HC3 ?

 

Je vous remercie par avance.

 

Posté(e)

j'ai fais ça y a quelques jours pour couper le wifi de la HC3...

 

Tu peux peut-être t'en inspirer ...

 

http = net.HTTPClient({ timeout = 2000 })
http:request("http://localhost/api/settings/network/radio",{
        options = {
            headers = {
                ["Authorization"] = "Basic user:password (en base64)",
            }, 
            data = json.encode({wlan={enabled=false}}),
            method = "PUT",                      
        },        
        success = function(res) if json.decode(res.data).code == 200 then self:debug("HC3 Wifi desabled") else self:debug(res.data) end end,
        error = function(err) self:error(err) end
})

 

Posté(e)

C'est très bien, mais je pense que ce que veut faire @Kana-chan tient en une seule ligne avec api.put(), car il n'a pas besoin de passer par la méthode compliquée avec l'authentification pour juste modifier les propriétés d'un device

 

Pas testé, mais un truc dans le genre doit faire l'affaire :

local deviceID = fibaro.getGlobalVariable("IdWallPlug")
local mycolor = 0
local data = {
	id = tonumber(deviceID),
	properties = {
		parameters = {
			{
				id = 62,
				size = 1,
				value = mycolor
			}
		}
	}
}
local response, status = api.put("/devices/"..deviceID, data)
print("status : " .. status)
print("response : " .. response)

 

Posté(e)

@Lazer,

Ton code fonctionne, mais le print sur response ne fonctionne pas.

Il semble que response soit une table. Sais-tu comment faire pour connaitre les détails de cette table ?

 

Je te remercie par avance.

Posté(e)

Oui en effet, response contient le JSON complet du device modifié, donc c'est une grosse table

Il est inutile d'afficher son contenu, il faut juste tester la valeur de status qui doit être égale à 200 ou 202 (à vérifier) pour s'assurer que la commande a abouti

 

Juste pour la curiosité :

print("response : " .. json.encode(response))

 

  • 9 mois après...
Posté(e)
Le 01/03/2021 à 14:12, Lazer a dit :

C'est très bien, mais je pense que ce que veut faire @Kana-chan tient en une seule ligne avec api.put(), car il n'a pas besoin de passer par la méthode compliquée avec l'authentification pour juste modifier les propriétés d'un device

 

Pas testé, mais un truc dans le genre doit faire l'affaire :


local deviceID = fibaro.getGlobalVariable("IdWallPlug")
local mycolor = 0
local data = {
	id = tonumber(deviceID),
	properties = {
		parameters = {
			{
				id = 62,
				size = 1,
				value = mycolor
			}
		}
	}
}
local response, status = api.put("/devices/"..deviceID, data)
print("status : " .. status)
print("response : " .. response)

 

salut @Lazer

 

J'ai testé ton code et j'ai remarqué un bug si on peut appeler ça comme ça, quand on modifie un paramètre on ne peut pas modifier un autre.

 

Dans ton exemple on modifie le paramètre 12 mets une fois exécuté impossible de modifier un paramètre car quand je vérifie dans l'API du module en question tous les paramètres  sont inexistant disparu.

 

Il manque une chose au code c'est de trouver un moyen d'actualiser une fois le changement effectué

 

 

 

 

 

 

 

 

 

Posté(e)

Heureusement que j'avais précisé que ce code étant non testé ;)

C'est une piste pour écrire ton code, ce n'est pas un code près à l'emploi tel quel.

 

La bonne solution pour modifier un paramètre d'un module Z-Wave a déjà été donnée sur le forum... tu peux chercher....

Je n'ai pas le temps de te faire le code, mais dans les grandes lignes :

- il faut récupérer le JSON complet du module via api.get()

- parcourir la table parameters avec une boucle for jusqu'à trouver le numéro du paramètre qui nous intéresse

- modifier le paramètre

- réenvoyer le JSON complet du module via api.put()

 

Vu que GEA sait le faire, si tu es faignant, tu cherches dans le code de GEA quelque chose comme "Parameter" et tu devrais trouver en dessous les quelques lignes de LUA qui permettent de modifier proprement un paramètre d'un module Z-Wave.

Logiquement (de mémoire), ça doit faire ce que j'ai décris juste au dessus.

 

Bon courage :)

 

  • Like 1
Posté(e)

oui je vais déjà testé avec GEA 

GEA.add(true, 0, "", {{"Parameter", 473, 158, 67}}) 

Je sais pas pourquoi ça n'a jamais fonctionné

Posté(e)

Bonjour,

 

Alors je ne rencontre pas le problème posé ci-dessus.

Le code suivant fonctionne chez moi :

-- From HC2 VD

function QuickApp:onInit()
  --self:debug("QuickApp:onInit")
  self:updateProperty("deviceIcon", 1008);
  self.deviceID = self:getVariable("IdWallPlug"); --ID de Wallplug
  self.isOld = { 118, 31, 33, 43 };
  self.isNew = { 92, 94 };
  self.wpIdOn = { FGWP101 = 61, FGWP102 = 41 };
  self.wpIdOff = { FGWP101 = 62, FGWP102 = 42 };
  self.wpColorOnOn = { FGWP101 = 1, FGWP102 = 1 };
  self.wpColorOnOff = { FGWP101 = 9, FGWP102 = 0 };
  self.wpColorOffOn = { FGWP101 = 0, FGWP102 = 1 };
  self.wpColorOffOff = { FGWP101 = 8, FGWP102 = 0 };
end

function QuickApp:setIdWallPlug(idWallPlug)
  self.deviceID = "" .. idWallPlug;
  self:setVariable("IdWallPlug", self.deviceID);
end

function QuickApp:isInArray(value, myArray)
  for key, val in pairs(myArray) do
    self:debug("Value = "..val.." !");
    if val == value then
      return true;
    end
  end
  return false;
end

function QuickApp:setTypeToUse()
  local return_value = "";
  if self:isInArray(tonumber(self:getVariable("IdWallPlug")), self.isOld) then
    return_value = "FGWP101";
    self:debug("Old version detected [" .. return_value .. "].");
  else
    return_value = "FGWP102";
    self:debug("New version detected [" .. return_value .. "].");
  end
  return return_value;
end

function QuickApp:offOn()
  local theType = self:setTypeToUse();
  local myColor = self.wpColorOffOn[theType]; -- choix de la couleur
  local myIdToUse = self.wpIdOn[theType];
  self:debug("The Type [" .. theType .. "], myColor [" .. myColor .. "], myIdToUse [" .. myIdToUse .. "]");
  local data = {
    id = tonumber(self.deviceID),
    properties = {
      parameters = {
        {
          id = myIdToUse,
          size = 1,
          value = myColor
        }
      }
    }
  };
  local response, status = api.put("/devices/" .. self.deviceID, data);
  self:debug("Status : "..status);
  --self:debug("Response : "..json.encode(response));
end

function QuickApp:offOff()
  local theType = self:setTypeToUse();
  local myColor = self.wpColorOffOff[theType]; -- choix de la couleur
  local myIdToUse = self.wpIdOn[theType];
  self:debug("The Type [" .. theType .. "], myColor [" .. myColor .. "], myIdToUse [" .. myIdToUse .. "]");
  local data = {
    id = tonumber(self.deviceID),
    properties = {
      parameters = {
        {
          id = myIdToUse,
          size = 1,
          value = myColor
        }
      }
    }
  };
  local response, status = api.put("/devices/" .. self.deviceID, data);
  self:debug("Status : "..status);
  --self:debug("Response : "..json.encode(response));
end

function QuickApp:onOn()
  local theType = self:setTypeToUse();
  local myColor = self.wpColorOnOn[theType]; -- choix de la couleur
  local myIdToUse = self.wpIdOn[theType];
  self:debug("The Type [" .. theType .. "], myColor [" .. myColor .. "], myIdToUse [" .. myIdToUse .. "]");
  local data = {
    id = tonumber(self.deviceID),
    properties = {
      parameters = {
        {
          id = myIdToUse,
          size = 1,
          value = myColor
        }
      }
    }
  };
  local response, status = api.put("/devices/"..self.deviceID, data);
  self:debug("Status : "..status);
  --self:debug("Response : "..json.encode(response));
end

function QuickApp:onOff()
  local theType = self:setTypeToUse();
  local myColor = self.wpColorOnOff[theType]; -- choix de la couleur
  local myIdToUse = self.wpIdOn[theType];
  self:debug("The Type [" .. theType .. "], myColor [" .. myColor .. "], myIdToUse [" .. myIdToUse .. "]");
  local data = {
    id = tonumber(self.deviceID),
    properties = {
      parameters = {
        {
          id = myIdToUse,
          size = 1,
          value = myColor
        }
      }
    }
  };
  local response, status = api.put("/devices/" .. self.deviceID, data);
  self:debug("Status : "..status);
  --self:debug("Response : "..json.encode(response));
end

Il me permet de changé la couleur en cliquant sur les boutons suivants :

image.png.ef50f5a9de0b47966f47477661469edb.png

 

Et en renseignant l'id du module à changer ici :

image.thumb.png.e7a20aa551e6ceec6b8a815b2a2b2d7e.png

 

Mais j'ai créée aussi un module pour tous les wallPlugs dont voici le code :

function QuickApp:onInit()
  self:debug("QuickApp:onInit");
  
  self.myIds = {
    COLOR_WP = 89,
    WP01_COLORS = 118,
    WP02_COLORS = 31,
    WP03_COLORS = 33,
    WP04_COLORS = 43,
    WP05_COLORS = 92,
    WP06_COLORS = 94
  }
  self:updateProperty("deviceIcon", 1008);
end

function QuickApp:allOff()
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP01_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP02_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP03_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP04_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP05_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP06_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOff");
end

function QuickApp:allOn()
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP01_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP02_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP03_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP04_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP05_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
  fibaro.call(self.myIds["COLOR_WP"], "setIdWallPlug", self.myIds["WP06_COLORS"]);
  fibaro.call(self.myIds["COLOR_WP"], "onOn");
end

Avec les boutons suivants :

image.png.29939242e159d8489f543020bc0a637f.png

 

De plus, j'ai créé une règle dans GEA pour l'exécution de ceci à des heures précises :

  -------------ECLAIRAGE PRISES-------------
  --ON--
  GEA.add({
      {"Time", "07:30", "07:31"}
    }, 30, "", {
      {"QuickApp", id["COLOR_ALL_WP"], "allOn"}
    }
  )

  --OFF--
  GEA.add({
      {"Time", "21:30", "21:31"}
    }, 30, "", {
      {"QuickApp", id["COLOR_ALL_WP"], "allOff"}
    }
  )

Et l'id "COLOR_ALL_WP" est l'id de l'application pour tous les wallPlugs (ma femme n'aime pas la lumière donc extinction la nuit).

Cela fait le travail.

Cela me suffit.

 

  • Like 1
×
×
  • Créer...