Aller au contenu
J3R3M

[Résolu] Executer net.HTTPClient() en début de scène

Recommended Posts

Bonjour à tous,

 

J'utilise la fonction net.HTTPClient() dans mes scènes de pièces afin de m'envoyer des SMS via une passerelle.

Cependant, depuis quelques jours, j'ai remarqué que cette requête, bien que placée en début de script, n'est pas exécutée avant la fin du script de ma scène.

 

En effet, j'ai remarqué que si je mettais un fibaro:sleep(10000) bien après cette commande net.HTTPClient(), je recevais le SMS 10 secondes plus tard.

 

Le problème étant que, dans mes scènes de pièce, je suis amené à les annuler en cours si elle ne sont plus nécessaires avec fibaro:abort().

Ce qui fait que je ne reçois jamais les SMS...

 

Dans ces conditions, comment forcer l'exécution de cette commande en début de scène ?

Pour moi, le LUA était un langage qui s’éxécutait au fur et à mesure.

 

Merci d'avance de vos réponses ! :)

Modifié par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

Peux-tu nous mettre un exemple de code qui ne fonctionne pas comme tu v(par exple avec le sleep et le abort)?

Partager ce message


Lien à poster
Partager sur d’autres sites

C'est un sujet qui revient souvent sur le forum

 

net.HTTPClient() est asynchrone, le code dans les fonctions appelées en callback s'exécute toujours après la fin de l'exécution du thread principal.

 

Quand on commence à programmer en asynchrone, il ne faut plus jamais utiliser de fonctions synchrones comme sleep(), sous peine de comportement surprenant comme tu l'as constaté.

Préférer à la place l'emploi de la fonction settimout() qui est elle-même asynchrone (chercher les exemples sur le forum)

 

La bonne pratique quand on programme en asynchrone est la suivante :

Après un appel à net.HTTPClient(), le code devrait se terminer le plus rapidement possible afin de laisser la main à la fonction success() appelée en callback de net.HTTPClient().

La suite du code se déroule donc dans la fonction success().

Celle-ci, à sont tour, peut faire d'autres appels à net.HTTPClient() ou settimeout() pour déclencher de nouveaux appels de fonctions en callback asynchrone.

Etc...

 

C'est la technique que j'ai employé dans mes scènes Watchdog et Yamaha MusicCast, que tu peux étudier par exemple.

 

C'est une certaine gymnastique qui n'est pas évidente au début, et oblige à revoir toute la structure de son code LUA.

Malheureusement Fibaro ne nous laisse pas le choix dans les scènes, dès que l'on veut faire des appels HTTP, on est obligé d'utiliser la fonction asynchronse net.HTTPClient().

La fonction Net.FHTTP() synchrone utilisée dans les VD n'est pas disponible dans les scènes.

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

@Lazer,

GENIAL cette explication très didactique.

Le problème, c'est que on la lu maintenant, mais on ne retrouvera plus jamais cette info.

 

Alors un petit tuto avec pour titre : net.HTTPClient() asynchrone dans scènes

et le corps du texte, un ctrl+C/V de ton explication

?

 

  • Like 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Voilà :

 

Par contre c'est fait à la va-vite, je n'ai pas testé le code LUA, j'espère qu'il n'y a pas d'erreur de syntaxe. N'hésitez par à me corriger.

 

 

Sinon pour @J3R3M, comme tu peux le voir, cela intrigue beaucoup de monde, exemples :

https://www.domotique-fibaro.fr/topic/9055-incomprã©hension-dans-les-nethttpclient/

https://www.domotique-fibaro.fr/topic/10888-nethttpclient-contourner-lasynchrone-cest-possible/

https://www.domotique-fibaro.fr/topic/10900-comportement-du-timeout-dans-les-nethttpclient/

https://www.domotique-fibaro.fr/topic/11558-récupérer-les-données-retournées-par-nethttpclient/

 

  • Like 1
  • Thanks 1

Partager ce message


Lien à poster
Partager sur d’autres sites

Merci beaucoup de cette réponse bien précise !

J’avais rapidement recherché sur Google et n’avais rien trouvé de concluant, mais je plaide coupable, je n’ai pas pris le temps de rechercher ici :(

Merci pour ces explications précieuses ainsi que le tuto né de celles-ci :)

 

Une question me vient tout de même à l’esprit : les fonctions sucess() et error() sont-elles uniquement liées à net.HTTPClient() ?

Modifié par J3R3M

Partager ce message


Lien à poster
Partager sur d’autres sites

J'utilise Google pour chercher sur le forum !

 

Je pense que oui pour success et error

Partager ce message


Lien à poster
Partager sur d’autres sites

×