Aller au contenu
Lazer

Utilisation de net.HTTPClient() asynchrone dans une scène

Recommended Posts

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...

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Maintenant que tu le dis... Je viens de tilter :D

 

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 :60:

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

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

Partager ce message


Lien à poster
Partager sur d’autres sites

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

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

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'
	}
})

 

Partager ce message


Lien à poster
Partager sur d’autres sites
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

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

salut 

 

Je suis à deux doigts d'abandonner, j'ai déjà tellement essayé droite à gauche des trucs des guillemets des pas des guillemets :huh:

 

 

Partager ce message


Lien à poster
Partager sur d’autres sites

maintenant j'ai Erreur : Connection refused

il y à du progret :D

 

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é par 971jmd

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites
Le 06/03/2021 à 16:37, Lazer a dit :

Maintenant que tu le dis... Je viens de tilter :D

 

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 :60:

 

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 :P

Partager ce message


Lien à poster
Partager sur d’autres sites
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(...)

 

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par Lazer

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

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é par flacon030

Partager ce message


Lien à poster
Partager sur d’autres sites

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.

Partager ce message


Lien à poster
Partager sur d’autres sites

×