jjacques68 Posté(e) le 6 mars 2021 Signaler Posté(e) le 6 mars 2021 Il y a 2 heures, Lazer a dit : Alors que quand on passe une table, c'est une référence... ben ça fallait le savoir !! dans ce cas précis, vaudrait peut-être mieux utiliser une variable QA (self.xxxx) du coup... du moins si y a un risque que le contenu de la table soit modifier par une autre fonction...
Lazer Posté(e) le 6 mars 2021 Auteur Signaler Posté(e) le 6 mars 2021 Oui et non... ça dépend... Si seulement 2 fonctions ont besoin de se partager la table, autant la passer en paramètres Si par contre toutes les fonctions d'un même QuickApp sont susceptibles d'utiliser cette même table, alors autant l'attribuer au QuickApp (self.xxx) Je ne saurais dire quelle méthode est meilleure que l'autre, mais c'est plus du bon sens et de l'organisation logique du code. 1
henri-allauch Posté(e) le 6 mars 2021 Signaler Posté(e) le 6 mars 2021 Une confirmation supplémentaire Cela viens de résoudre un problème qui m'avait amené il y a quelques jours à m'interroger sur le setTimeout = 0 en effet j'avais une fonction cité au debut de ce post ( avec le net.HTTPClient dans la fonction ) Cette fonction envoi une commande sur une boite 8 relais Teracom qui en fait m'allume 8 voyants différents Dans ce QA j'ai un bouton TEST qui envoi à la suite 8 appel à la fonction avec un N° de relai different ( TEST des voyants ) J'ai galéré au début car seulement les 4 à 5 premiers voyants s'allumaient . Après N tentatives j'ai ajouté des setTimeOut à 0 au début puis en incrémenté le timeout entre chaque appel Suite à cette conversation, je viens de mettre le net.HTTPClient dans le init() J'ai enlevé les timeout en tout s'allume 1
Lazer Posté(e) le 6 mars 2021 Auteur Signaler Posté(e) le 6 mars 2021 Maintenant que tu le dis... Je viens de tilter En janvier j'ai eu une panne d'Internet (fibre coupée pendant quelques jours) Donc Network Monitor ne pouvais plus joindre Google, et faisait plusieurs tentatives, avant de me notifier. Ce que je ne comprenais pas, c'était pourquoi de temps en temps, aléatoirement pendant toute cette période, Network Monitor me signalait également des machines sur mon LAN en erreur (alors que tout fonctionnait parfaitement en local). Donc maintenant c'est clair, il faut avoir un seul self.http = net.HTTPClient() dans tout le QuickApp, il gère parfaitement la situation lorsque de nombreuses requêtes sont exécutées pseudo-simultanément. Ce qui n'est pas le cas lorsqu'on a plusieurs instances de HTTPClient dans des variables différentes. Voilà, là on a appris un super truc 1
henri-allauch Posté(e) le 7 mars 2021 Signaler Posté(e) le 7 mars 2021 Pour Info dans NETATMO net.HTTPClient est dans la fonction function QuickApp:getNetatmoResponseData(url, body, func) --self:debug('QuickApp:getNetatmoResponseData("'..url..'", "'..body..'", ...)') local http = net.HTTPClient()
Lazer Posté(e) le 7 mars 2021 Auteur Signaler Posté(e) le 7 mars 2021 Netatmo, le script n'est pas de moi, j'ai juste ajouté quelques bricoles supplémentaires (les niveaux de batteries), mais bon, ça n'a jamais posé problème, et il fait un appel http toutes les 10 minutes, donc rien de méchant, ça ne posera jamais de problème. Pour Network Monitor, il faudra en effet que je fasse une nouvelle version... plus tard
971jmd Posté(e) le 11 juin 2021 Signaler Posté(e) le 11 juin 2021 (modifié) salut a tous J'ai ce bout de code qui fonctionnait parfaitement bien sur ma HC2 et qui permettait de renvoyer les valeurs d'un module vers une base SQL Mais voilà maintenant je suis sur HC3 Je sais pas s'il faudrait utiliser une scène où QA ? Pour info mon fichier SQL fonctionne très bien et attend le value de la HC3 merci de votre aide local deviceID = 120 local powerfib = fibaro:getValue(deviceID, "power") local payload = "fibaro/sql.php?value="..powerfib.."" HC2 = Net.FHttp(ip_module,port) response ,status, errorCode = HC2:GET(payload) fibaro:debug("response = " .. response) fibaro:debug("status = " .. status) if response ~= nill and tonumber(status)==200 then fibaro:debug("Succes: SMS envoyé") else fibaro:debug("Error: Failed to SEND SMS") end HC2 = Net.FHttp(ip_module,port) response ,status, errorCode = HC2:GET(payload) fibaro:debug("response = " .. response) fibaro:debug("status = " .. status) if response ~= nill and tonumber(status)==200 then fibaro:debug("Succes: SMS envoyé") else fibaro:debug("Error: Failed to SEND SMS") end Modifié le 11 juin 2021 par 971jmd
971jmd Posté(e) le 12 juin 2021 Signaler Posté(e) le 12 juin 2021 je sèche le code suivant permet d'ajouter une ligne dans ma base SQL mais aucune donnée et du coté fibaro j'ai comme erreur [12.06.2021] [15:16:45] [ERROR] [SCENE172]: J'ai même essayé : http:request("http://192.XX.XX:XXXX/jmd/fibaro/sql.php?value="coucou" ", { et reint local var1 = 1234567 local http = net.HTTPClient() http:request("http://192.XX.XX:XXXX/jmd/fibaro/sql.php?value="..var1.." ", { success = function(response) if response.status == 200 then fibaro:debug('OK, réponse : '.. response.data) else fibaro:debug("Erreur : status=" .. tostring(response.status)) end end, error = function(err) fibaro:debug("Erreur : " .. err) end, options = { method = 'GET' } })
couillerot Posté(e) le 12 juin 2021 Signaler Posté(e) le 12 juin 2021 local var1 = 1234567 local http = net.HTTPClient() http:request("http://192.XX.XX:XXXX/jmd/fibaro/sql.php?value="..var1, { je débute en QA mais si tu fais cette petite modif ? Stef
971jmd Posté(e) le 13 juin 2021 Signaler Posté(e) le 13 juin 2021 (modifié) salut et merci de votre aide j'ai tester dans une scene et toujours le meme probleme, il n'y a pas d'erreur la base de incrément bien, comme quoi l'enregistreraient est bien monté mai aucun valeur comme dans l'exemple 1234567 Modifié le 13 juin 2021 par 971jmd
971jmd Posté(e) le 13 juin 2021 Signaler Posté(e) le 13 juin 2021 (modifié) mai dans Quick app ça fonctionne, mai je suis pas encore alaise avec Quick app pour exemple de récupérer la valeur d'un module dans une variable. Je suis à la recherche de tuto en français sur quick app Modifié le 13 juin 2021 par 971jmd
Lazer Posté(e) le 13 juin 2021 Auteur Signaler Posté(e) le 13 juin 2021 Pense à utiliser pcall() quand tu utilises http:request() comme je l'ai expliqué dans le tuto. D'une part, ça t'aidera à comprendre l'erreur, et d'autre part ça rendra ton code plus stable, particulièrement dans les scènes qui semblent assez instable par nature... cf discussion récente sur un autre topic.
971jmd Posté(e) le 14 juin 2021 Signaler Posté(e) le 14 juin 2021 salut Je suis à deux doigts d'abandonner, j'ai déjà tellement essayé droite à gauche des trucs des guillemets des pas des guillemets
971jmd Posté(e) le 14 juin 2021 Signaler Posté(e) le 14 juin 2021 (modifié) maintenant j'ai : Erreur : Connection refused il y à du progret local var1 = 1234567 local http = net.HTTPClient() http:request("http://192.168.XX.XX/XXXXX/fibaro/sql.php?value="..var1, { success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } }) Modifié le 14 juin 2021 par 971jmd
jucom Posté(e) le 30 juin 2021 Signaler Posté(e) le 30 juin 2021 je pense qu'il faut simplement que tu remplaces tes caractères spéciaux par un code hexa dans ta requête http http://192.168.XX.XX/XXXXX/fibaro/sql.php?value= le ? et le = sont à remplacer. correspondances ici https://www.nicolas-hoffmann.net/utilitaires/codes-hexas-ascii-unicode-utf8-caracteres-usuels.php J'ai eu le même problème. Ma requête passait très bien ds un navigateur et sur mon ancienne box. J'ai cherché pendant 3 semaines.
Fredmas Posté(e) le 16 septembre 2021 Signaler Posté(e) le 16 septembre 2021 Le 06/03/2021 à 16:37, Lazer a dit : Maintenant que tu le dis... Je viens de tilter En janvier j'ai eu une panne d'Internet (fibre coupée pendant quelques jours) Donc Network Monitor ne pouvais plus joindre Google, et faisait plusieurs tentatives, avant de me notifier. Ce que je ne comprenais pas, c'était pourquoi de temps en temps, aléatoirement pendant toute cette période, Network Monitor me signalait également des machines sur mon LAN en erreur (alors que tout fonctionnait parfaitement en local). Donc maintenant c'est clair, il faut avoir un seul self.http = net.HTTPClient() dans tout le QuickApp, il gère parfaitement la situation lorsque de nombreuses requêtes sont exécutées pseudo-simultanément. Ce qui n'est pas le cas lorsqu'on a plusieurs instances de HTTPClient dans des variables différentes. Voilà, là on a appris un super truc Donc si j'ai bien compris cette réponse et toutes nos discussions précédentes : #1. Soit on l'affecte à l'objet QuickApp, et dans ce cas net.HTTPClient() est accessible partout dans le QA (et donc publiée et accessible depuis l'extérieur du QA) function QuickApp:onInit() self:debug("onInit") self.http = net.HTTPClient() end function myFunction(self) self.http:request(...) end #2. Soit on l'affecte à une variable locale, et dans ce cas net.HTTPClient() est accessible uniquement dans le fichier en cours local http = net.HTTPClient() function QuickApp:onInit() self:debug("onInit") end function myFunction(self) http:request(...) end #3. Soit on l'affecte à une variable globale, et dans ce cas net.HTTPClient() est accessible dans tous les fichiers du QA function QuickApp:onInit() self:debug("onInit") http = net.HTTPClient() end function myFunction(self) http:request(...) end Solution #1 intéressante pour disposer de la variable http dans tout le QA Solution #2 intéressante pour limiter au minimum la portée de la variable http Solution #3 par facilité mais avec une portée globale Pour l'instant j'utilise la version #1 comme tu l'as proposé d'ailleurs
Lazer Posté(e) le 16 septembre 2021 Auteur Signaler Posté(e) le 16 septembre 2021 Il y a 1 heure, Fredmas a dit : Soit on l'affecte à l'objet QuickApp, et dans ce cas net.HTTPClient() est accessible partout dans le QA (et donc publiée et accessible depuis l'extérieur du QA) Non.... !!! Parce que même si net.HTTPClient() est une fonction, ce qu'elle retourne n'est pas une fonction (mais une table), donc elle n'est pas publiée et aucun risque qu'elle soit exécutée depuis l'extérieur du QA. Donc ta variable self.http reste interne au QA. Elle est de type "table", et quand tu veux l'utiliser tu exécutes l'un de ses éléments appelé "request", qui est de type "function" => self.http:request(...)
Fredmas Posté(e) le 16 septembre 2021 Signaler Posté(e) le 16 septembre 2021 OK du coup quelle différence entre #1 et #3 ?
Lazer Posté(e) le 16 septembre 2021 Auteur Signaler Posté(e) le 16 septembre 2021 (modifié) En pratique aucune. Si ce n'est que dans #3, ta variable http est globale. Perso j'ai tendance à utiliser la solution #1 avec self. Modifié le 16 septembre 2021 par Lazer
flacon030 Posté(e) le 28 novembre 2021 Signaler Posté(e) le 28 novembre 2021 (modifié) Bonjour a tous Je cherche a faire cette commande sur HC3, peut être a partir d'un QA, un bouton qui envoie la commande ci dessous cette fonction etait sous HC2 sur un virtual device Comment faire? Désolé je ne comprend pas comment transcrire la commande ci dessous sous HC3 Qui pourrait me dire comment faire Merci GET /googlehome? annoucement=someone%20at%20the%20door HTTP/1.1 Host: 192.168.2.160:1880 C'est pour essayer de faire parler notre HC3 sur un google home Modifié le 28 novembre 2021 par flacon030
Lazer Posté(e) le 28 novembre 2021 Auteur Signaler Posté(e) le 28 novembre 2021 Tu prends le code LUA de la 1ère page, 1er message, 1er extrait de code, tu changes juste l'URL, et ça va marcher.
flacon030 Posté(e) le 28 novembre 2021 Signaler Posté(e) le 28 novembre 2021 (modifié) Merci Et comment l'associer a un bouton dans un QA " onReleased " Le code pourrait être cela, mai comment et ou placer le résultat " onReleased " pour l'associer au bouton local http = net.HTTPClient() http:request(" GET /googlehome? annoucement=someone%20at%20the%20door HTTP/1.1 Host: 192.168.2.160:1880 ", { success = function(response) if response.status == 200 then print('OK, réponse : '.. response.data) else print("Erreur : status=" .. tostring(response.status)) end end, error = function(err) print("Erreur : " .. err) end, options = { method = 'GET' } }) Modifié le 28 novembre 2021 par flacon030
Lazer Posté(e) le 28 novembre 2021 Auteur Signaler Posté(e) le 28 novembre 2021 Attention, dans http:request(), c'est juste l'URL qu'il faut mettre, pas tout ton bazar compliqué que tu as collé, ça ne fonctionnera pas. Le code d'un bouton ? Mais tu n'as pas du tout commencé ton QuickApp ? Ici ce n'est pas trop le topic pour apprendre à créer un bouton, cela a déjà été évoqué plusieurs fois sur le forum, essaye de cherche 5 minutes STP, si je te donne la solution tu n'apprendras rien Indice : c'est très facile, il suffit d'une fonction.
Messages recommandés