Aller au contenu

Messages recommandés

Posté(e)

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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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

Posté(e)

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.

Posté(e)

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 !

Posté(e)

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)

×
×
  • Créer...