Kana-chan Posté(e) le 28 février 2021 Signaler Partager Posté(e) le 28 février 2021 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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
jjacques68 Posté(e) le 1 mars 2021 Signaler Partager Posté(e) le 1 mars 2021 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 }) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 1 mars 2021 Signaler Partager Posté(e) le 1 mars 2021 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) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kana-chan Posté(e) le 2 mars 2021 Auteur Signaler Partager Posté(e) le 2 mars 2021 Bonjour à vous. Merci beaucoup pour vos aides. Je vais regarder tout cela ce soir. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kana-chan Posté(e) le 2 mars 2021 Auteur Signaler Partager Posté(e) le 2 mars 2021 @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. Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 2 mars 2021 Signaler Partager Posté(e) le 2 mars 2021 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)) Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kana-chan Posté(e) le 2 mars 2021 Auteur Signaler Partager Posté(e) le 2 mars 2021 Alors oui, en effet, la variable status retourne bien 200 quand cela fonctionne. Merci pour tout ! Lien vers le commentaire Partager sur d’autres sites More sharing options...
971jmd Posté(e) le 14 décembre 2021 Signaler Partager Posté(e) le 14 décembre 2021 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é Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 14 décembre 2021 Signaler Partager Posté(e) le 14 décembre 2021 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 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
971jmd Posté(e) le 14 décembre 2021 Signaler Partager Posté(e) le 14 décembre 2021 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é Lien vers le commentaire Partager sur d’autres sites More sharing options...
Kana-chan Posté(e) le 14 décembre 2021 Auteur Signaler Partager Posté(e) le 14 décembre 2021 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 : Et en renseignant l'id du module à changer ici : 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 : 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. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
971jmd Posté(e) le 15 décembre 2021 Signaler Partager Posté(e) le 15 décembre 2021 bon je comprend pas tout, mais c'est l'occasion te creuser et apprendre ... Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés