J3R3M Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 (modifié) 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é le 7 août 2018 par J3R3M Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 Peux-tu nous mettre un exemple de code qui ne fonctionne pas comme tu v(par exple avec le sleep et le abort)? Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 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. 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
jojo Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 @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 ? 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 Oui maitre Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 21 juin 2018 Signaler Partager Posté(e) le 21 juin 2018 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/ 1 1 Lien vers le commentaire Partager sur d’autres sites More sharing options...
J3R3M Posté(e) le 23 juin 2018 Auteur Signaler Partager Posté(e) le 23 juin 2018 (modifié) 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é le 23 juin 2018 par J3R3M Lien vers le commentaire Partager sur d’autres sites More sharing options...
Lazer Posté(e) le 23 juin 2018 Signaler Partager Posté(e) le 23 juin 2018 J'utilise Google pour chercher sur le forum ! Je pense que oui pour success et error Lien vers le commentaire Partager sur d’autres sites More sharing options...
Messages recommandés