Zorgonaute84 Posté(e) le 15 septembre 2015 Signaler Posté(e) le 15 septembre 2015 Bonjour à tous, J'ai acquis récemment un Spark Photon. Pour ceux qui ne connaissent pas je vous conseille de vous renseigner, c'est absolument merveilleux cette petite bête. Toutefois j'essaie de faire quelques tests pour le moment (avant de faire quelque chose de plus sérieux) mais je galère avec la connection entre la HC2 et le cloud de Spark. En effet, toutes les connections ne se font qu'exclusivement via https. Il me semble avoir lu quelque part que la commande NetFhttp ne gérait pas les connexions sécurisés. Est-ce toujours d'actualité avec cette v4, et si oui, avez-vous une solution magique pour contourner le soucis ? Bon si vraiment il n'y a aucune solution propre, il semble que ce soit possible de passer par IFTT. Le Spark arrive a communiquer avec IFTT et la HC2 aussi. C'est juste con d'ajouter un intermédiaire dans le processus. Merci pour votre aide.
Lazer Posté(e) le 15 septembre 2015 Signaler Posté(e) le 15 septembre 2015 En V4, pour faire du https, il faut utiliser la fonction net.HTTPClient() dans une scène. Krikroff donne un exemple d'utilisation de cette fonction ici : http://www.domotique-fibaro.fr/index.php/topic/1373-fixer-la-valeur-dun-dimmer/?p=52407 1
jojo Posté(e) le 16 septembre 2015 Signaler Posté(e) le 16 septembre 2015 Lazer, si j'ai bien lu, le net.HTTPClient() et le pendant du net.HTTP pour les VD mais pour les Scènes. Il ne permet pas de faire du https
Zorgonaute84 Posté(e) le 16 septembre 2015 Auteur Signaler Posté(e) le 16 septembre 2015 Alors si si, je viens de tester et ca fonctionne ! le HTTPClient gère bien le httpS !!! 1
Lazer Posté(e) le 16 septembre 2015 Signaler Posté(e) le 16 septembre 2015 Oui d'ailleurs un autre exemple de Steven ici : http://www.domotique-fibaro.fr/index.php/topic/4626-pluviom%C3%A9trie-avec-netatmo/ 1
Zorgonaute84 Posté(e) le 16 septembre 2015 Auteur Signaler Posté(e) le 16 septembre 2015 Super merci pour les exemples, cela m'as permis d'avancer car je galerais avec la requete GET pour récuperer les informations d'une variable. Alors pour le moment, pour faire un POST et appeler une fonction sur mon Spark j'ai ceci (qui fonctionne impeccablement) : ------------------ FONCTION SPARK ------------------ function SparkFunction(Name,Argument) local Path = 'https://api.particle.io/v1/devices/'..Device..'/'..Name..'?access_token='..Token local Spark = net.HTTPClient(); Spark:request(Path, { success = function(response) if tonumber(response.status) == 200 then print('Function "'..Name..'" ('..Argument..') sent with success'); else print('Function "'..Name..'" ('..Argument..') Error Status : '..response.status); end end , error = function(err) print('Connection error = ' .. err) end , options = { method = 'POST', headers = {["content-type"] = 'application/x-www-form-urlencoded;'}, data = '{"arg"='..Argument..'}' } }); end ------------------ FIN DE FONCTION SPARK ------------------ Et pour lire une variable via une reqette GET, j'ai ceci (qui fonctionne aussi, mais qui ne me renvoi pas la valeur): --------------------- VARIABLE SPARK ---------------------- function SparkVariable(Name) local Path = 'https://api.particle.io/v1/devices/'..Device..'/'..Name..'?access_token='..Token local Spark = net.HTTPClient(); Spark:request(Path, { success = function(response) if tonumber(response.status) == 200 then print('Variable "'..Name..'" requested with success'); SparkTable = json.decode(response.data) return SparkTable.result else print('Variable "'..Name..'" request Error Status : '..response.status); end end , error = function(err) print('Connection error = ' .. err) end , options = { method = 'GET', headers = {["content-type"] = 'application/x-www-form-urlencoded;'}, } }); end ------------------ FIN DE VARIABLE SPARK ------------------ Sauf que j'ai quelques soucis pour renvoyer la valeur du résultat. A la ligne 11 je décode correctement ma table Json. Car si je fais un print(SparkTable.result) j'ai bien le résultat correct qui s'affiche dans la fenetre du débugeur. Mais impossible de faire un return sur cette valeur. J'ai testé pleins de solution mais rien a faire. Le return me renvoi systématiquement un "nil". Je veux bien un petit coup de pouce ;-) Je précise que les deux variables Device et Token sont déclarés en amont des fonctions.
pepite Posté(e) le 16 septembre 2015 Signaler Posté(e) le 16 septembre 2015 et un fibaro:debug(SparkTable.result) te donne un nil aussi ? ton print te donne quoi comme valeur ? et en mettant le resultat dans une variable globale ? attention suis pas du tout un expert de la ligne de code ..
Zorgonaute84 Posté(e) le 16 septembre 2015 Auteur Signaler Posté(e) le 16 septembre 2015 Alors fibaro:debug(SparkTable.result) me donne un nil si il est a la fin de la fonction et la bonne valeur si il se trouve a la ligne 12. Impossible de l'executer en dehors de la fonction. Le print idem, a la ligne 12 aucun soucis. Passer une variable globale serait la solution mais c'est quand même moche.
Zorgonaute84 Posté(e) le 17 septembre 2015 Auteur Signaler Posté(e) le 17 septembre 2015 Bon après plusieurs essais, je me suis rendu compte que ma variable ne passait avec la syntaxe de Krikroff, en revanche, impeccable avec le code Stephen ! Donc l'appel de fonction passe bien, par contre je galère toujours pour récupérer proprement la valeur de ma variable. Aujourd'hui mon code d'appel de variable ressemble a ca : function SparkVariable(Name) local Path = 'https://api.particle.io/v1/devices/'..Device..'/'..Name..'?access_token='..Token local Spark = net.HTTPClient(); local Result Spark:request(Path, { options = { method = 'GET', headers = {["Content-Type"] = "application/x-www-form-urlencoded;charset=UTF-8"} , } , success = function(response) if tonumber(response.status) == 200 then print('Variable "'..Name..'" requested with success'); SparkTable = json.decode(response.data) Result = SparkTable.result print("Resultat au milieu de la fonction : "..Result) else print('Function "'..Name..' Error Status : '..response.status); end end , error = function(err) print('Connection error = ' .. err) end }); print("Résultat en fin de fonction") print(Result) end Et voila a quoi ressemble le debogeur : [DEBUG] 16:42:31: Résultat en fin de fonction [DEBUG] 16:42:31: nil [DEBUG] 16:42:32: Variable "MaVariable" requested with success [DEBUG] 16:42:32: Resultat au milieu de la fonction : 5 En gros, contrairement a l'ordre des instructions, les deux print en fin de fonction sont exécuté avant ceux en milieu de la fonction. Mon objectif final est de remplacer les deux print en fin de fonction par un return Result. Alors avant que quelqu'un me propose de faire un fibaro:sleep(5000) j'ai déjà essayé sans succes. En effet, le fibaro:sleep mets en pause tout le code, donc j'ai mes retours plus tard, mais toujours dans le mauvaise ordre. Je n'ai pas trouvé de syntaxe de type fibaro:pause ou fibaro:wait afin de juste retarder les instructions suivantes sans pour autant bloquer les autres actions. Merci pour votre aide !
pepite Posté(e) le 17 septembre 2015 Signaler Posté(e) le 17 septembre 2015 Salut zorgonaute, Regarde settimeout
Lazer Posté(e) le 17 septembre 2015 Signaler Posté(e) le 17 septembre 2015 C'est normal, cette fonction HTTPClient est asynchrone, et ton code se termine avant l'appel du code situés en retour de fonction. Il faut que tu places la suite du code qui a besoin du Result dans le bloc de la fonction success = function(response)
Messages recommandés