jjacques68 Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 (modifié) bonjour à tous, question de programmation pure et dure Je suis confronté à un problème plutôt bloquant me concernant. Dans une scène (gestion de 12 mi-flora avec VD, consignes d'humidité, alertes mail, ... bref), je souhaite créer des variables globales dynamiquement. j'utilise pour cela ce bout de code (simplifié), qui marche très bien, placé dans une fonction : function TestGlobal(id) local http = net.HTTPClient() if fibaro:getGlobal(id) == nil then --si pas de VG --nouvelle variable newVar = {} newVar.name = id newVar.value = "0" http:request("http://127.0.0.1:11111/api/globalVariables", { options = {method = 'POST', data = json.encode(newVar)}, success = function(response) print("Création de la variable "..id) end, error = function(response) print("Error: " ..response) end, }) end end MAIS cette fonction est appelée en premier, pour ensuite exécuter d'autres fonctions utilisant justement les VG créées. Et bien ça marche pô ! Si j'analyse bien mon script complet, les VG ne sont même pas créées !!!! J'ai pas le print du success !!!! ni celui du error... pourquoi ???? Et le plus dingue, c'est que si je n'exécute pas les fonctions qui suivent, celle de la création de VG fonctionne très bien, les VG sont alors crées !!! d'après mes recherches et essais cela viendrait du mode asynchrone de l'execution du net.HTTPClient. Mais alors comment le contourner ??? J'ai déjà été confronté à ce genre de soucis, que j'ai pu contourner en imbriquant les net.HTTPClient , mais le code devient très illisible et compliqué. (exemple pour des scènes qui gère la patrouille de caméras, 7 positions PTZ déterminées = 7 net.HTTPClient qui s'imbriquent ) Mais la clairement dans ma scène actuelle, je ne peux pas faire ce genre d'emboitement. Merci pour votre aide !! Modifié le 16 août 2017 par jjacques68
pepite Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 (modifié) Salut @jjacques68 On n'oublie pas, je ne suis pas dev ;-) mais je propose ;-). Et si tu essayais avec les api.get et api.post, les fonctions existantes de fibaro ;-) Elles utilisent Net.FHttp et non pas net.HTTPClient, mais je ne sais pas si net.FHttp est asynchrone ;-) . Je vais jeter un oeil. function TestGlobal(id) local vg = api.get("/globalVariables/"..id) if vg == nil or "" then --nouvelle variable newVar = {} newVar.name = id newVar.value = "0" api.post("/globalVariables", newVar) end end Les fonctions api de la HC2 ;-) -- api class implementation api = {} api.get = function(uri) uri = "/api" .. uri local http = Net.FHttp("127.0.0.1", 11111) local result, status, errorCode = http:GET(uri) if result ~= "" then return json.decode(result) else return "" end end api.put = function(uri, data) uri = "/api" .. uri local http = Net.FHttp("127.0.0.1", 11111) local jsonData = json.encode(data) local result, status, errorCode = http:PUT(uri, jsonData) if result ~= "" then return json.decode(result) else return "" end end api.post = function(uri, data) uri = "/api" .. uri local http = Net.FHttp("127.0.0.1", 11111) local jsonData = json.encode(data) local result, status, errorCode = http:POST(uri, jsonData) if result ~= "" then return json.decode(result) else return "" end end Modifié le 16 août 2017 par pepite
Sakkhho Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 HS, pas mal ces capteurs, tu peux partager qq screenshots de ton VD pour voir ? elles sont utilisables en exterieur ? merci
jjacques68 Posté(e) le 16 août 2017 Auteur Signaler Posté(e) le 16 août 2017 @pepite faut que je teste, mais on est d'accord je suis dans une scène avec mon code là ! @Sakkhho je te mettrai un screenshot pas de soucis, et oui j'en ai un à l'extérieur, tant que tu es à porté du Bluetooth... Mais la tout de suite faut que je tire 2 câbles Ethernet de la cave aux combles merci !!
Sakkhho Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 ok, je suis intéressé de savoir comment tu integres tout ceci quand tu as le temps :-)
Nico Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 Mais j'avais regardé, ils ne sont plus en vente si ?
pepite Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 heuu..@Nico qu'est-ce qui n'est plus en vente ;-)
jjacques68 Posté(e) le 16 août 2017 Auteur Signaler Posté(e) le 16 août 2017 YES @pepite !!!! nickel !!! function TestGlobal(id) local vg = api.get("/globalVariables/"..id) if vg == nil or "" then --nouvelle variable newVar = {} newVar.name = id newVar.value = "0" api.post("/globalVariables", newVar) end end merciiiiiii !!!! @Nico, si tu parles des mi flora, ils sont toujours en vente... Je vais faire un petit tuto pour mon installation avec les mi flora... 1
pepite Posté(e) le 16 août 2017 Signaler Posté(e) le 16 août 2017 Un miracle, c'est à cause de moi le mauvais temps ;-) ahh, @Nico c'est mi-plant sur gearbest on ne trouve plus mi-flora (en tout cas pour moi sur gearbest)
jjacques68 Posté(e) le 16 août 2017 Auteur Signaler Posté(e) le 16 août 2017 @Sakkhho voilà un petit tuto sur mon installation. Gestion Complète des plantes avec Mi-FLora
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 (modifié) Dites je reviens sur ce post car mes soucis avec le routeur et les modem ADSL/4G (pour ceux qui ont pas suivi), m'ont donnés une idée dans les requêtes http (pas l'api de la HC2, rien a voir ce coup si...) local http = net.HTTPClient() http:request("blablabla...", { success = function(response) print("Création de la variable "..id) end, error = function(response) print("Error: " ..response) end, }) existe-il une option Timeout qui permettrait en cas de pas de réponse d'exécuter une action ? Modifié le 18 août 2017 par jjacques68
pepite Posté(e) le 18 août 2017 Signaler Posté(e) le 18 août 2017 Salut, Oui oui : local httpClient = net.HTTPClient({ timeout = 2000 }) Ensuite pour moi la gestion du timeout si tu veux faire une autre action se gere dans la fonction error non ?
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 ben non le timeout est pas traiter par la fonction error
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 il me plante la scène...
pepite Posté(e) le 18 août 2017 Signaler Posté(e) le 18 août 2017 donc après le timeout, ca ferme le httpclient ? alors la, attendons le passage des experts, je n'en sais pas plus, je ne sais donc pas quel effet à le timeout sur le net.HTTPClient
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 (modifié) j'ai essayé ça mais sans résultat (fallait que j'essaye ) local http = net.HTTPClient({ timeout = 2000 }) http:request("blablabla...", { success = function(response) print("success") end, error = function(response) print("Error: " ..response) end, timeout = function(response) print("Timeout") end, }) Modifié le 18 août 2017 par jjacques68
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 je vais peut être créé un nouveau post non ?
pepite Posté(e) le 18 août 2017 Signaler Posté(e) le 18 août 2017 oui bonne idee le nouveau post mais tu n'as pas mis le timeout au bon endroit ;-) mets le dans la declaration de la variable http pour voir
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 oups désolé, ça vient du copier/coller... dans la scène il est au bon endroit... merci !
jjacques68 Posté(e) le 18 août 2017 Auteur Signaler Posté(e) le 18 août 2017 voilà nouveau post sur ce sujet : https://www.domotique-fibaro.fr/topic/10900-comportement-du-timeout-dans-les-nethttpclient/#comment-167783
Messages recommandés