Envoi d'une requete json vers jeedom via internet

J'ai une application tournant sur un esp8266 qui envoie une requete http vers un serveur jeedom qui me répond avec les données attendues. Ca marche très bien lorsque le serveur est sur le réseau local.

Mais je voudrais que cela fonctionne aussi lorsque je suis ailleurs ssur un autre réseau local. Par le net donc.

J'accède sans difficulté à mon serveur jeedom à distance grâce à un dyndns.

Je me suis dit qu'il suffisait de remplacer l'adresse ip locale par l'adresse ip renvoyée par le 'adresse dyndns mais la requete http.GET() retourne -1 et pas de réponse de jeedom.

Si quelqu'un sait comment faire?

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

const char *ssid = "freebox_xxxx";
const char *password = "xxxx";
//const char *host = "192.168.0.34"; // Remplacé par "82.124.5.xxx" adresse de la box chez moi
const char *host = "82.124.5.242";
const int   port     = 80;

const char* apiKey   = "rrJYD7EXmepFPpyvO3yXcO2O4M1Cc7x7"; // API id jeedom
const int   watchdog = 60000; //interval envoi requette HTTP vers jeedom

ESP8266WebServer server ( 80 );
HTTPClient http;

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

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

  Serial.println("\nWiFi connected");
  Serial.print("Local IP address: ");  Serial.println(WiFi.localIP());

  server.on("/datas", update);  
  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=1105"; // 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)
{ 
  http.begin(client,host,port,url);
  int httpCode= http.GET();
  Serial.printf("\nRéponse:%d\n",httpCode);
  http.end();
  return true;
}


/******************************************************************************************
 * RECEPTION TRAME PAR LE SERVEUR
 ******************************************************************************************/
void update()
{  
  char *s1, *unit;
  const char *s2;
  Serial.printf("Arrivée:%s données\n",server.args());
  delay(10);
}

Tu doit pouvoir utiliser directement le nom dyndns, la classe HTTPClient devrait faire la résolution de nom toutes seuls.
Après si tu es en IP fixe, cela devrait fonctionner, si tu y accède de ton PC.

En mettant le nom dns dans la barre d'adresse d'un navigateur depuis n'importe où, je tombe sur le serveur jeedom. Mais depuis mon application arduino, nada, que ce soit avec le nom dyndns ou bien son équivalent ip, ma requete me retourne -1 et jeedom ne répond pas.
Donc, soit ce n'est pas possible, soit il y a une erreur dans mon source quelque part. Je penche pour la deuxième hypothèse.
Mon application fonctionne bien en local mais pas si le serveur jeedom et l'application arduino sont sur des réseaux différends.

Tu peux essayer d'activer le diagnostique pour que cela t'affiche la passerelle(gateway).

Merci pour l'info.
J'ai supprimé le include <WiFiClientSecure•h> et on dirait que je reçois qqchose. A vérifier demain. Là je suis dans mon lit.
A+

Je reviens vers toi terwal pour te dire que ça marche avec un équipement jeedom protocole X10 et une commande jeedom de type ON/OFF.
Par contre les commandes qui retournent une trame ne retournent rien et une erreur -11 est retournée par httpGet()alors que avec une cmd de type ON/OFF httpGet() retourne 200 ce qui est le code en cas de succès.

J'en conclus que lorsque jeedom essaie d'envoyer une trame de rdatas en réponse, il se produit une erreur. Pourquoi? mystère..

C'est bizarre d'avoir d'un coté un code d'erreur HTTP et de l'autre propriétaire.
je ne vois pas de GET dans ton code, j'ai loupé un truc?

Salut terwal,

Lignes 77 & 78:
http.begin(client,"XXXX.ddns.net",80,url);
int httpCode= http.GET();

Avec url=/core/api/jeeApi.php?apikey=rrJYD7EXmXXXXpyvO3yXcO2O4M1Cc7x7&type=cmd&id=1117

ID 1117 correspond à un script jeedom HTTP de type Action. La requête qu'il contient est la suivante:
http://reizet.ddns.net/datas?IN=#[Ma maison][SRT 323][Température]#&Consigne=#[Ma maison][SRT 323][Consigne]#&Brûleur=#[Ma maison][SRT 323][ConsigneEtat]#&OUT=#[Ma maison][Oregon TempHygro_2D42][T°]#&Pression=#[Ma maison][meteo][Pression]#&Humidité=#[Ma maison][Oregon TempHygro_2D42][HUM ]#&Piles thermostat=#[Ma maison][SRT 323][Batterie]#&Piles sonde ext=#[Ma maison][Oregon TempHygro_2D42][BAT ]#&Fête=#[Ma maison][script_saints][sdj]#&BL=#[Ma maison][X10_09004d][Statut 16]#&heure=#[Ma maison][heureminute][heure]#&minute=#[Ma maison][heureminute][minute]#&token=123abCde

D'après les sources de la librairie le code -11 correspond à HTTPC_ERROR_READ_TIMEOUT
Cela voudrait dire que ton serveur ne répond pas ou pas dans le temps impartie.

Oui. C'est ce que je penses aussi.
L'arduino est sur le réseau local d'une freebox.

Le serveur jeedom/raspberry est sur le réseau local d'une box orange.Donc, la requête GET est expédiée depuis la freebox vers la box orange et je sais qu'elle arrive bien au raspberry.

Le serveur jeedom répond à la requête GET avec le script qui contient lui-même la requête http adéquate. Cette requête est de la forme:
http://datas?IN=#la reponse#

Mais la réponse ne traverse pas la freebox.

Donc, je me demande s'il n'y a pas un problème de port côté freebox

Et là, j'ai du mal à comprendre l'interface de gestion des ports de la freebox. Voici ce que j'y ai mis:

IP Destination: 192.168.0.140 (adresse locale de l'arduino)
Redirection: Active
IP Source: Toutes
Port de début: 49200
Port de fin: 49200
Port de destination: 80

A noter que on ne peut pas mettre de port début et fin inférieurs à 49200 avec l'interface de free.
Alors que penser de ces 49200? Serais-ce cela qui empêcherait la réponse à la requête GET d'arriver?

A noter que lorsque le raspberry et l'esp8266 sont sur le même réseau local, tout fonctionne parfaitement.

Tes explications sont un peu confus.
C'est quoi cette URL http://data?
Ton rasberry fait une requête sur un autre serveur et envois la réponse à ton esp8266 dans la réponse du get de celui-ci ?
Dans se cas là c'est ton routeurs qui connait l'IP local et le port du demandeur qui a ouvert une connexion à ton rasberry et doit normalement pourvoir faire le chemin inverse.

Si ce n'est pas ça, il faut que tu détailles un peu plus.

Ce que tu décris c'est déjà redirection de port, sur une machine local.

Je vais demander demain à free qu'ils me permettent d'ouvrir le port 80. C'est le port 49200 qui est ouvert sur ma freebox (côté arduino). Ce port n'est pas ouvert sur la box Orange. Donc le serveur sur le raspberry qui utilise le port 80 ne peut pas recevoir la trame http qui lui est envoyée en réponse à sa requête GET.
Donc je vais attendre d'avooir un port 80 ouvert avant d'aller plus loin.

Encore merci pour ton aide terwal. Je te tiendrai au courant.

On est demain.
Free ne veut pas mettre à jour ma box afin que je puisse ouvrir le port 80. C'est incroyable car il a quelques années on pouvait ouvrir ce port sans problème. Il paraît que c'est à cause de l'encombrement de l'ipv4.
Donc j'abandonne. Si je veux faire fonctionner cette application entre ma maison de campagne et mon domicile il faut que je change de fournisseur d'accès ou bien je dois laisser tomber le port 80 utilisé par jeedom et ouvrir un port compatible avec ceux autorisés par free.

Pour moi c'est toujours aussi confus.
Ton Arduino utilise un port dynamique ex 49500, et contacte le serveur HTPP sur le port d'écoute en général 80, mais tu dois pouvoir le changer.
Le serveur répond au client sur le port utilisé par ton routeur pour contacté le serveur, le routeur transférant alors la réponse à ton Arduino.
Normalement tu n'a pas besoin d'ouvrir de port pour la réponse.

Si tu as besoin d'ouvrir un port vers ton Arduino, cela veut dire, que celui-ci est en écoute sur un port particulier, mais c'est toi qui choisis le port d'écoute dans ton programme.

Je t'explique le contexte.
Je suis actuellement du côté de La Rochelle avec une freebox. Le serveur jeedom se trouve à mon domicile en région Parisienne avec une box Orange.

Le serveur jeedom est un serveur domotique. Il centralise différents capteurs dans la maison.

Un afficheur TFT à base de ardino esp8266 embarque un firmware basé sur celui que je t'ai communiqué. Cet afficheur envoi une requête GET toutes les minutes pour récupérer les données de tous les capteurs de la maison.

Le serveur domotique jeedom reçoit la requête et y répond par une trame http contenant la valeur de mesure des capteurs.

J'accède au serveur kjeedom en local avec son adresse ip locale et à) distance avec l'adresse wan de la box Orange.

Cet ensemble fonctionne très bien depuis longtemps.

Le but était d'installer un afficheur identique à celui qui est à mon domicile ici pour afficher les mêmes données.

Sans entrer dans les détails, je voulais utiliser le même firmware que celui de l'afficheur à mon domicile.

Pour avoir le coeur net, j'ai installé jeedom sur un autre raspberry ici sur le réseau local de la freebox. Je me retrouve donc avec l'afficheur et jeedom sur le même réseau local ici. Et là, j'ai enfin pu trouver mon problème.

Le soucis venait du serveur jeedom installé sur le raspberry que j'ai ici. Dans le formulaire du script où se trouve la requête de réponse, je me suis rendu compte qu'il y avait dans un coin l'id et le mot de pass par défaut. L'effet était modifiée (je ne sais pas comment) et n'arrivait pas au serveur arduino distant.

Normalement, ces deux champs sont vides mais après chaque enregistrement du formulaire ces deux champs se rechargeaient avec les deux valeurs précitées.

Il m'a suffit d'effacer les deux valeurs en question avant chaque sauvegarde pour que miracle, tout refonctionne.

Voilà. J'ai été un peu long mais je te devais bien ces explications.

J'ai maintenant entre-autre la température intérieure et exterieure qu'il fait chez moi et tout va bien.

Je te souhaite une bonne soirée et de bonnes fêtes de Noël.

Jean.

OK, c'est un peu plus claire et en plus ça fonctionne, donc c'est plutôt cool :slight_smile: