Aller au contenu

Messages recommandés

Posté(e)

Bonjour

 

Je viens vers vous car j'ai un petit problème d'utilisation des requetes POST... 

 

J'utilisais avant Exosite (un site qui permet d'afficher sous forme de graphique les données que vous lui envoyez : portals.exosite.com

 

C'est un bon site, et comme il n'y a pas possibilité d'utiliser encore les virtual sensor, je souhaite continuer à  l'utiliser pour m'afficher ces données (qui marchaient avant grâce à  un script google)

 

Exosite.png

 

Ce site me permettait de visualiser les données de la netatmo, ma consommation réelle horaire / journalière en fonction de la température extérieure, et même estimer la capacité de ma cuve d'eau de pluie grâce au pluviomètre netatmo.

 

bref...

 

Maintenant que j'ai la HC2, je souhaite me passer complètement de google script, tant qu'à  faire ! Sauf que je n'arrive plus à  utiliser l'API d'Exosite avec l'HC2... Il ne doit pas me manquer grand chose... j'espère que quelqu'un pourra m'aider ici  :)

 

Voici ce que dit l'API d'Exosite :

 

Write one or more dataports of alias <alias> with given <value>. The client (e.g. device, portal) is identified by<CIK>. Data is written with the server timestamp as of the time the data was received by the server. Data cannot be written faster than a rate of once per second, doing so results in undefined behavior. If multiple aliases are specified, they are written at the same timestamp.

request

POST /onep:v1/stack/alias HTTP/1.1
Host: m2.exosite.com
X-Exosite-CIK: <CIK>
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: <length>
<blank line>
<alias 1>=<value 1>&<alias 2...>=<value 2...>&<alias n>=<value n>

 

 

Avant dans le script google, j'envoyais les données comme ça (ça marchait très bien) :

function addExosite()
{
      
    // Variables :
    var options;
    var reponse;
    var headers;
        
    // Construit la requête de type post
    headers = {"X-Exosite-CIK":"efe553632247a********857a2b3c"};
           
    options =
    {
      "method" : "post",
      "headers" : headers,
      "payload" : "Cuve=" + value;
    };
    
    // Envoie la requête de type POST     
    reponse = UrlFetchApp.fetch("http://m2.exosite.com/api:v1/stack/alias", options);
    reponse = reponse.getContentText("UTF-8");    
}

Et là , j'essaie d'envoyer avec l'HC2 (dans un virtual device) :

 

fibaro:setGlobal("Payload_Exosite", "Cuve=2900")


local payload = fibaro:getGlobalValue("Payload_Exosite")
Exosite = Net.FHttp("http://m2.exosite.com") 
Exosite:POST("/api:v1/stack/alias", '{"X-Exosite-CIK":"efe553632247a************ab946857a2b3c", "payload":{'..payload..'}')

Et ça ne marche pas... en débug, je n'ai pas d'erreur, mais je n'ai pas de retour, il doit me manquer un truc...

 

Une idée ?  :(

 

 

 

 

 

Posté(e)

Bonsoir, 

 

A vue d'oeil, tu ouvres 2 accolades, mais n'en refermes qu'une seule dans le POST.

 

Sinon, ce que je peux te conseiller est de surveiller le traffic HTTP sortant de la fibaro avec tcpdump ou wireshark.

vu que tu est en http, c'est assez simple, et efficace.

 

cdlt,

Posté(e)

Ah oui ! Mais bon finalement je suis parti sur une autre solution dans une scène (je croyais que ce n'était pas possible de faire appel à  des requêtes dans une scène... mais si !)

 

au moins je peux construire "proprement" la partie "option", et en plus j'ai la réponse ! 

 

au début j'avais réponse 401 : unauthorized

 

maintenant, je suis autantifié, mais j'ai l'erreur 406 : not acceptable

 

ce qui me laisse penser que c'est simplement une mise en forme des données... j'ai essayé avec payload et data, mais rien y fait.

 

--[[
%% autostart
%% properties
%% globals
--]]


local httpClient = net.HTTPClient();


httpClient:request("http://m2.exosite.com/api:v1/stack/alias", {
      success = function(resp)
        fibaro:debug('Ok '..resp.data)
      end,
      error = function(err)
        fibaro:debug('Ok '..err)
      end,
      options = {method = 'POST', headers = {['X-Exosite-CIK'] = 'efe553632247a************4e46ab946857a2b3c'}, data = 'Cuve=2900' }
    });


    

du coup j'ai essayé aussi comme ça et comme ça... mais ça marche pas... une idée ??

options = {method = 'POST', headers = {['X-Exosite-CIK'] = 'efe553632247**********ab946857a2b3c'}, ['Cuve'] = '2900' }

options = {method = 'POST', headers = {['X-Exosite-CIK'] = 'efe553632247************46ab946857a2b3c'}, Cuve = '2900' }
Posté(e)

J'y arrive pas j'y arrive pas j'y arrive pas  :angry:

 

Quelqu'un peut me dire comment faire une requête sous cette forme SVP ? 

request_packet = ''
request_packet += 'POST /api:v1/stack/alias HTTP/1.1\r\n'
request_packet += 'Host: m2.exosite.com\r\n'
request_packet += 'X-Exosite-CIK: '+cik+'\r\n'
request_packet += 'Connection: Close \r\n'
request_packet += 'Content-Type: application/x-www-form-urlencoded; charset=utf-8\r\n'
request_packet += 'Content-Length: '+ str(len(content)) +'\r\n'
request_packet += '\r\n' # Must have blank line here
request_packet += content # Must be same size as Content-Length specified


print '--REQUEST:-----------------------'
print str(request_packet)
print '---------------------------------'


# OPEN SOCKET
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect(('m2.exosite.com', 80))
# SEND REQUEST
s.send(request_packet)
# RECEIVE RESPONSE
data = s.recv(2048)
# CLOSE SOCKET
s.close()

Peut-être est-ce possible de le faire avec la fonction net.HTTPClient, mais ça ne veut pas :(

Posté(e)

Peut être une piste, mais je suppose que tu accèdes à  ta page avec un login et un mot de passe. Et là , attention, probablement encodé. Dans ton navigateur, une truc genre "htttp://Login@Mdp/Url encode tes identifiants si nécessaire, mais quand tu écris du code, c'est à  toi de prévoir le truc. Ce n'est peut être pas ça, juste une idée

 

Il te faudrait un truc  genre :

httpClient:setBasicAuthentication(Utilisateur, MotDePasse);
Posté(e)

non non, c'est avec le "CIK", c'est un clé qui permet authentifier directement mon compte

 

dans le script google, je mettais mon CIK dans le headers, et mes données dans le payload, c'est tout, ça marchait super bien, mais là  impossible de construire la requête correctement :(

Posté(e)

Parfois, je me trouve aussi face àdes trucs incompréhensibles, pas forcément très propre, mais question de facilité, je contourne avec un script php et récupère le résultat sur la HC2

Posté(e)

Je pense que si tant de gens se bouffe les cheveux avec des netatmo, des philips-hue ou autre, c'est que la HC2 ne respecte pas tous les protocoles. D'ailleurs, le LUA, c'est un peu un LUA à  leur sauce, peut être le problème vient de là . Enfin c'est ce que je me dis, quand tout semble correct, que ça marche JAVA, en VB, en PHP, en LUA sur ma vieille Vera et que ça ne marche pas sur la HC2. Peut être il y a un truc, mais j'ai pris le plie du PHP, pour interroger les trucs distants, je récupère du brut dans mon code LUA sur la HC2, au moins, ça fonctionne et je n'ai plus besoin d'investir dans des solutions capillaires... 

×
×
  • Créer...