Requête httpGet() Arduino vers jeedom distant. La ressource n'arrive pas

Bonjour,
Mon application arduino expédie une trame http GET vers un script situé dans un jeedom distant.
Lorsque l’application tourne sur le même réseau local que jeedom, ça fonctionne.

Si la requête envoyée en http concerne un script jeedom on/off de type Action elle est exécutée mais un script de type info ou Action devant retourner des données ne les retourne pas.

Les ports sur la freebox où se trouve l’application Arduino est le suivant:
IP destination: 192.168.0.140 (un esp8266 sur réseau local box Orange)
IP source: Toutes
Protocole: TCP
Port de début:49200 (on peut pas mettre moins)
Port de fin: 49200
Port de destination: 80

Précision: j’accède sans problème à mon serveur jeedom depuis un réseau distant.
Si je mets la même URL complète que l’application dans la barre d’adresse d’un navigateur distant, la réponse est FORBIDEN You don’t have permission to access this resource.

HELP!!

Bonjour,

C’est un peu confu. Un schéma peut-être ?

Sinon c’est une url de l’api jeedom que vous appelez? (Un get sur une commande jeedom?)

Vous avez mis la bonne clé api? Elle est active pour les acces externe?

Bref il manque des infos: page sante jeedom, schéma, format des urls etc

1 « J'aime »

Merci pour la réponse.

Sinon c’est une url de l’api jeedom que vous appelez? (Un get sur une commande jeedom?)
Réponse: Oui.

J’ai regardé dans les logs de jeedom:

INFO : Exécution de la commande [Aucun][script_001][BANG] avec les paramètres {« apikey »:« rrJYD7EXxxxxxFPpyvO3yXcO2O4M1Cc7x7 »,« type »:« cmd »,« id »:« 276 »}

Donc le script BANG est exécuté. Ce script est un script HTML qui envoi des data à l’adresse indiquée dedans: http://xxxx.ddns.net/datas?IN=#COUCOU#

Je ne savais pas qu’il fallait activer la clé API pour accès externe. Comment fait-on cela?

Hello, si tu va dans Réglages / Système / Configuration tu as un onglet API et la tu pourras vérifier si les clefs API sont authorisé juste en local/désactivé/…
Référence : https://doc.jeedom.com/fr_FR/core/4.1/administration

Cordialement,

Mathieu

Salut Mathieu,
J’ai regardé. Il n’y a que une seule clé API et elle est activée. Mais il n’est rien de spécifié pour les accès externes.
Merci quand même.
Jean.

Dans ce cas je rejoint le comentaire de MIPS, il nous faut plus d’information.

Mathieu

Bon. Voila le source Arduino qui tourne sur un esp8266:

#include <ESP8266WebServer.h>
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//#include <WiFiClientSecure.h>

const char *ssid = "freebox_XXXX";
const char *password = "YYYYY";
const char *host = "xxxx.ddns.net";
const int   port     = 80;
const char* apiKey   = "rrJYD7EXxxxxPpyvO3yXcO2O4M1Cc7x7"; // API id jeedom
const int   watchdog = 60000; //interval envoi requette HTTP vers jeedom
String token;

ESP8266WebServer server ( 80 );
HTTPClient http;
WiFiClient client; 

void setup() {
  Serial.begin(115200);
  delay(200);
  WiFi.begin(ssid, password);// Connexion au réseau local en wifi

  Serial.print("Connecting");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  server.on("/datas", update1);  
  server.begin();
  server.handleClient();
  initPendule();
}

//======================================
// Formation et demande d'envoi de la requête au serveur jeedom
//======================================
void initPendule()
{
  String baseurl = "/core/api/jeeApi.php?apikey=";
  baseurl += apiKey;
  baseurl += "&type=cmd&id=1117"; // Id de la cmd 
  String url = baseurl;  
  //Serial.print("Base url:");Serial.println (baseurl);   
  sendToJeedom(url);     
}

void loop() 
{

}


//===========================================
// Envoi de la requête http au serveur jeedom pour récupérer les données
//===========================================
WiFiClient client; 

bool sendToJeedom(String url)
{ 
  Serial.println(url);
  http.begin(client,"xxxx.ddns.net",80,url); // Réponse -1 (erreur)
  int httpCode= http.GET();
  Serial.printf("\nRéponse:%d\n",httpCode);
  http.end();
  return true;
}


/******************************************************************************************
 * RECEPTION TRAME PAR LE SERVEUR
 ******************************************************************************************/
void update1()
{  
  char *s1, *unit;
  const char *s2;
  server.handleClient();
  Serial.print("Data=");Serial.println(server.argName(1));
  Serial.printf("Arrivée:%s données\n",server.args());
  
  //****************************************
  //Vérifie si le serveur est autorisé 
  //****************************************
  if ( token != "123abCde" ) 
  {
      Serial.println("Not authentified ");
      return;
  }
  else
  {
      //Serial.println("authentified ");
      server.send(200, "application/json","success:1");
  }
  server.send(200, "application/json","success:1");
  delay(10);
}

Et la requête contenue dans le script jeedom sensé retourner une valeur à l’arduino. C’est un script HTTP de type action dont le nom est BING:

http://xxxx.ddns.net/datas?IN=#[Ma maison][SRT 323][Température]#&token=123abCde

SRT 323 est un thermostat zwave.

Désolé, je ne pourrais t’aider plus, je ne vois pas exactement ce que tu essai de faire. Cela fait un moment que je n’ai plus touché aux arduino, mais j’ai retrouvé les fonctions que j’utilisais à l’époque si cela peux t’aider. Par contre j’accédait directement aux équipements je ne passait pas en plus par un autre script.

// ***************************************************************************************//
// - Network

String JeedomGet(String serveur, String api, String id) {
  HTTPClient http;
  TerminalAdd('d',"[HTTP] begin...");
  // configure traged server and url
  http.begin("http://" + serveur + "/core/api/jeeApi.php?apikey=" + api + "&type=cmd&id=" + String(id)); //HTTP get
  TerminalAdd('d',"[HTTP] GET...");
  TerminalAdd('d',"http://" + serveur + "/core/api/jeeApi.php?apikey=" + api + "&type=cmd&id=" + String(id));
  // start connection and send HTTP header
  int httpCode = http.GET();
  // httpCode will be negative on error
  if (httpCode > 0) {
    // HTTP header has been send and Server response header has been handled
    TerminalAdd('d',"[HTTP] GET... code: "+String(httpCode));
  } else {
    TerminalAdd('d',"[HTTP] GET... failed, error: "+String(http.errorToString(httpCode).c_str()));
  }
  String payload = http.getString();
  TerminalAdd('d',payload);
  http.end();
  return payload;
}

String JeedomSet(String serveur, String api, String id, String value) {
  HTTPClient http;
  TerminalAdd('d',"[HTTP] begin...");
  // configure traged server and url
  http.begin("http://" + serveur + "/core/api/jeeApi.php?type=virtual&apikey=" + api + "&id=" + id + "&value=" + value); //HTTP set
  TerminalAdd('d',"[HTTP] SET...");
  TerminalAdd('d',"http://" + serveur + "/core/api/jeeApi.php?type=virtual&apikey=" + api + "&id=" + id + "&value=" + value);
  // start connection and send HTTP header
  int httpCode = http.GET();
  // httpCode will be negative on error
  if (httpCode > 0) {
    // HTTP header has been send and Server response header has been handled
    TerminalAdd('d',"[HTTP] SET... code: "+String(httpCode));
  } else {
    TerminalAdd('d',"[HTTP] SET... failed, error: "+String(http.errorToString(httpCode).c_str()));
  }
  http.end();
  return "";
}

Pour la fonction TerminalAdd, c’était pour un afficheur que j’utilisais, pas la peine de les prendre en compte.

Mathieu

Oui, ton source ressemble furieusement au mien. Mais est-ce que son LAN était distant de celui de jeedom?

Les 2, j’utilisait des WIO (Get Started with Wio Terminal - Seeed Wiki) pour me connecter sur plusieurs Jeedom, mais je suis passé sur des reTerminal (Getting Started with reTerminal - Seeed Wiki) maintenant et je suis passé sur python.

Mathieu

Je viens de sortir mes WIO du débaras et je viens de me rendre compte que mon sketch ne fonctionnait plus.
Après lecture de différents message dans community, cela est du au modification de sécurité venu avec la 4.2 (Introduction Jeedom 4.2 : la sécurité – Jeedom – Le Blog), donc voici une version modifié de la partie qui ne fonctionnait plus,

String JeedomSet(String serveur, String api, String id, String value) {
  HTTPClient http;
  TerminalAdd('d',"[HTTP] begin...");
  // configure traged server and url
  http.begin(serveur + "/core/api/jeeApi.php?plugin=virtual&type=event&apikey=" + api + "&id=" + id + "&value=" + value); //HTTP set
  TerminalAdd('d',"[HTTP] SET...");
  TerminalAdd('d',serveur + "/core/api/jeeApi.php?plugin=virtual&type=event&apikey=" + api + "&id=" + id + "&value=" + value);
  // start connection and send HTTP header
  int httpCode = http.GET();
  // httpCode will be negative on error
  if (httpCode > 0) {
    // HTTP header has been send and Server response header has been handled
    TerminalAdd('d',"[HTTP] SET... code: "+String(httpCode));
  } else {
    TerminalAdd('d',"[HTTP] SET... failed, error: "+String(http.errorToString(httpCode).c_str()));
  }
  http.end();
  return "";
}

Le lien à changer et il faut également utiliser la clef API du plugin, dans mon cas c’était le plugin virtual.
Pour ce qui est de l’accès interne ou externe, j’ai également un soucis actuellement, qui je pense est lié au HTTPS, par contre comme je n’utilise plus les Arduino, et que cela fonctionne pour mes script python, je n’ai pas cherché plus loin.

J’espère que cela va te mettre sur la bonne voie,

Bonne soirée,

Mathieu