Chercher des infos avec ESPAsyncWebserver

Bonsoir !

Ces derniers jours j'ai réussi à bidouiller (avec l'aide de quelques cadors de ce forum) un embryon de station météo avec un ESP32 dans la maison qui REÇOIT périodiquement des infos d'un ESP32 à l'extérieur de la maison qui mesure température et humidité. Cet ESP extérieur envoie pour cela une requête HTTP_GET avec une url à laquelle sont attachées les infos à ESPAsyncWebServer qui est installé sur l'ESP dans la maison. (la flèche verte sur le dessin)
Avec une redirection de port, ESPAsyncWebserver me permet aussi accessoirement d'accéder par internet à une page web simple qui synthétise les données récoltées. (la flèche rouge), et peut-être à l'avenir à d'autres pages avec des boutons qui me permettrons d'actionner à distance des appareils.

J'ai aussi un Shelly EM, petit module à intégrer dans le tableau électrique qui peut mesurer 2 courants grâce à des tores. Ce module a le WiFi et on peut l'interroger avec des url bien précises pour récolter certaines données.
C'est ce que je fait avec HTTPClient que j'ai installé aussi sur l'ESP dans la maison (la flèche bleue) et qui va CHERCHER à intervalles réguliers les infos dans le Shelly EM, qui m'envoie alors une chaîne au format json dont j'extrais les données qui m'intéressent.

Tout ça fonctionne parfaitement, mais je me demande si je ne pourrais pas CHERCHER les infos dans le Shelly EM avec AsyncWebserver (flèche mauve) ce qui m'éviterai de devoir installer HTTPClient juste pour ça.

Malheureusement, ma maîtrise d'ESPWebServer est assez basique, et même en regardant des exemples ou en allant chercher l'info sur la page Github d'ESPWebServer je n'arrive pas à comprendre si oui ou non (et comment) c'est faisable.

Tout conseil avisé serait le bienvenu !
(ou la confirmation que ce n'est pas possible avec ESPAsyncWebserver)

Roland

il faudrait mettre aussi votre shelly dans la DMZ et il serait visible depuis le monde extérieur

si vous passez par l'ESP, il faudra que ce soit lui qui fasse la requête, ce n'est pas transparent vous pourriez essayer un redirect

request->redirect("http://adresseip_du_shelly/requete");
1 Like

Bonsoir !

C'est bien mon problème, faire une requête avec AsyncWebServer...

Le routeur de ma freebox permet juste de mettre une machine (adresse IP) dans la DMZ, je ne sais pas si ce serait une bonne idée de mettre l'adresse IP du Shelly.

Le Shelly et l'ESP avec le serveur web sont visibles par le "monde extérieur" avec des redirections de port.

Je vais essayer la piste du request->redirect, merci !

Roland

vous déclarez que votre serveur supporte une nouvelle requête de type GET pour /shelly qui sera donc appelable depuis l'extérieur et une fois reçue vous la routez sur votre réseau interne

    server.on("/shelly", HTTP_GET, [] (AsyncWebServerRequest *request) {
      request->redirect("http://adresseip_du_shelly/requete_qui_va_bien_du_shelly");
    });

Jusque là je comprends bien le principe du redirect associé à une requête "server.on", mais ce que je recherche c'est qu'au lieu d'être appelable de l'extérieur (je pourrais l’appeler du 2ème ESP, mais celui ci, fonctionne 3 secondes pour 3 minutes de deep sleep, donc pas possible) la requête se déclenche toute seule toutes les xx secondes sur l'ESP qui héberge AsyncWebserver.
C'est là que je sèche un peu !

Roland

ah dans ce cas pas de magie, l'ESP doit envoyer la requête et donc il vous faut soit la bibliothèque HTTPClient soit faire ça vous même "à la main" (une ouverture de socket vers le shelly et requête sur le port 80 qui respectera le protocole HTTP puis analyse de la réponse)

Oui, actuellement c'est ce que je fais, la requête avec HTTPClient.
Bon tant pis, on va rester comme ça vu que ça fonctionne bien.

Merci à vous pour le temps passé et bonne nuit !

Roland

Salut,

je me bricole aussi une station météo sur base d'ESP. En ce moment, je bosse surtout pour optimiser l'autonomie, mais c'est un autre sujet.
J'ai cherché qques temps l'environnement parfait (simple, facile, complexe, accessible, gratuit, simple et accessible, et complexe) pour faire remonter les infos, notamment parceque l'arduino IOT Cloud n'était pas parfaitement satisfaisant dans sa version gratuite.

En bref, j'ai fini par utiliser tout bêtement google sheet avec un petit script minuscule qui fait l'échange entre ma carte ESP (connectée à mon réseau wi-fi) et la page google sheet.
Je récupère mes infos comme un grand dans un joli tableau, et j'aurais tout le loisir d'organiser mes données pour faire des jolis présentations.

Pour le moment, mon script ne fonctionne qu'en lecture: la carte envoie ses données, sans vérifier leur réception et google prend les données qu'il reçoit pour les mettre dans le tableau sans poser de questions.
Il est possible de coder un script qui fera une réception et une confirmation de lecture, en bref, te créer ton protocole sur mesure pour lire les données de la carte, et au besoin envoyer des commandes en retour.

Donc ma config: une carte ESP qui sert de station météo, le router de la maison pour avoir du wifi, et un pc avec une connexion internet pour accéder à son compte gmail.

Fais moi signe si ça t'intéresse, c'est sans doute pas la solution miracle à ton problème, mais ça peut ouvrir des perspectives et (en acceptant de s'en remettre à google) éliminer pas mal de logiciels intermédiaires.

Bonjour !

Même si ce n'est pas la solution à mon "problème" avec AsyncWebserver, en tant que débutant je suis toujours curieux d'apprendre et ta solution d'envoyer des données vers Google sheets m'intéresse bien, je suis preneur du bout de code "qui va bien"!

Roland

Cool!

alors sur le principe je me suis servi de ce genre de tuto Électronique en amateur: Envoi de données de l'ESP32 / ESP8266 vers Google Sheets
(histoire de comprendre que c'était possible et comment ça se passe).
Je vais pas mettre des tartines mais il te faut :

  • ta google sheet dédiée (par exemple sur ton compte Gmail ou autre) avec un onglet que tu réserveras aux données. Tu remplis la 1ère ligne avec les en-têtes qui vont bien, les lignes suivantes seront remplies automatiquement par le script.
  • tu génères un script à partir de la google sheet, et tu en récupères le lien (il servira d'adresse URL à cibler par l'ESP)
    Voici le code que j'utilise dans le script. Il commence par entrer la date puis l'heure (et comme c'est internet qui le fait dans le script, mon ESP a pas besoin de connaitre ou maintenir l'heure!) et laisse la place pour 5 valeurs différentes, de mon choix:
function doGet(e){

var sheet = SpreadsheetApp.openByUrl('https://docs.google.com/spreadsheets/d/URL_SECRETE_DE_LA_GOOGLE_SHEET_QUE_JE_DOIT_ETRE_LE_SEUL_A_CONNAITRE/edit#gid=0');

 var CurrentDate = new Date();
  var Date_ = Utilities.formatDate(CurrentDate, "France/Paris", "dd/MM/YYYY");
  var Time_ = Utilities.formatDate(CurrentDate, "France/Paris", "HH:mm:ss");
 // var Date_Heure = Utilities.formatDate(CurrentDate, "France/Paris","dd/MM/YYYY HH:mm:ss")
  sheet.appendRow([Date_, Time_, e.parameter.val1, e.parameter.val2, e.parameter.val3, e.parameter.val4, e.parameter.val5]);
}

note qu'une fois que le script est fait, c'est le bon moment pour le tester. De n'importe quelle barre d'adresse d'un navigateur internet, tu entres la commande suivante:
https:script.google.com/macros/s/URL_DU_SCRIPT_QUE_JE_DOIS_ETRE_LE_SEUL_A_CONNAITRE/exec?val1=12&val3=999

note bien la fin de l'URL (et désolé si je défonce des portes ouvertes, moi je suis en pleine phase de découverte!) la formule est déclenchée par le "?", ensuite je peux envoyer mes 5 valeurs (parceque le script est rédigé comme ça).
Avec l'exemple donné, mon tableau se remplit comme ça:

note que le script s'est pas laissé impressionner par l'absence de valeur pour val2, val4 et val5. Je trouve ça très aimable de sa part, et ça arrange bien mes affaires.

  • l'ESP avec un bout de code qui va bien:
String GOOGLE_SCRIPT_ID = "PARTIE_DE_L_URL_DU_SCRIPT_A_RENSEIGNER";  // change Gscript ID 

void ENVOI_DONNEE_GOOGLE_SHEET() {

  // compose l'URL à envoyer (à paramétrer en fonction du script google)
  String urlFinal = "https://script.google.com/macros/s/" + GOOGLE_SCRIPT_ID + "/exec?"
                    + "val1=" + String(batterie)
                    + "&val2=" + String(luminosite)
                    + "&val3=" + String(VAL3)
                    + "&val4=" + String(VAL4)
                    + "&val5=" + String(VAL5);

  HTTPClient http;
  http.begin(urlFinal.c_str());
  http.GET();
  http.end();

  WiFi.disconnect();
}

Voilà, j'espère qu'avec le lien du tuto et mes explications ça ressemble à quelque chose.
Bon courage!

Merci, simple et efficace, et pas mal du tout pour quelqu'un qui se dit débutant !

Effectivement le ?truc1=xxxx&bidule=yyyy&chose=zzzz à la fin d'une url est une façon tout à fait classique de transmettre des données dans une requête HTTP_GET, et les serveurs comme AsyncWebserver savent très bien extraire ces valeurs délimitées par ? pour la première et & pour les suivantes.

P.S. pas trouvé de lien vers le tuto !

Roland

1 Like

je suis ravi que ça te plaise, je trouve que ça a été assez rapide à mettre en place, ça en garde sous le coude (écrire un script plus évolué c'est pas encore dans mes cordes mais ça promet!).
Après attention, je lis à droite à gauche que cette méthode par GET ne protège pas les données: elles sont en clair dans l'adresse internet.
Je suis pas très effrayé que des puissances étrangères espionnent la température sur mon balcon, mais c'est toujours mieux de le savoir.

PS: j'édite mon post précédant pour y ajouter un tuto, c'est surtout pratique grâce aux nombreuses captures d'écran pour configurer le script, par contre le code du script en lui même je l'ai adapté à mes besoins.

A GrandPete :
Un petit retour sur le deepsleep et la durée de la batterie.
Mon XIAO est maintenant en route depuis 5 jours, avec des cycles de 3 secondes environ de marche suivis de 3 mn de sommeil.
Il est alimenté par un vieil élément LiPO de 2450 mAh, là ça fait 5 jours qu'il est allumé non-stop, et la tension de la batterie est passée de 4,16 V à 4,08 V. Ça me semble pas mal, avant le deep sleep la batterie se vidait en 1 jour !

Sinon, voici à quoi ressemble ma micro-station domotique (c'est un bien grand mot !) avec laquelle je me fais la main :

L'espace en haut à droite sera occupé par l'affichage de la température intérieure quand j'aurai reçu mon capteur DS18B20.

Roland

1 Like

Cela a franchement de la gueule, donc ce n'est pas un grand mot à mon avis.
Si en plus tu peux tenir une dizaine de jours avec ta batterie, c'est plutôt pas mal je trouve

yeah! merci pour le retour!

écoute, histoire de lancer le concours de taille de b.... , dès que mon prototype est fonctionnel, je fais mes tests et je publierai mes résultats.

La décharge, au début, est assez rapide, ensuite elle va stagner à 3.7V pendant un long moment. En aucun cas elle ne doit descendre en dessous de 3V. A surveiller, donc. Une mesure périodique est préférable.

Bonsoir Hbachetti, j'ai le retour de la tension de la batterie en temps réel sur l'afficheur (en plus sous 3,5V l'affichage passe en rouge, il faut tenir les 3,3 V pour l'ESP32 !)
Pour les batteries Lipo je les connais bien vu que je fais de l'aéromodélisme !
En pratique J'essaie de ne jamais passer sous les 3,3 V.

Roland

C'est tout bon !
EDIT : La carte ESP32 est la pièce principale. Sa consommation en deep-sleep dépend de son implémentation, régulateur en particulier.
La meilleure : Firebeetle.
A moins que tu n'utilises un module ESP32 nu, auquel cas, pas de soucis.

Bonsoir Terwal.
Là comme c'est parti la batterie devrait tenir au minimum 1 mois je pense.
Pour l'instant j'expérimente, le montage est encore "volant" sur un breadboard, à terme il y aura une batterie plus petite avec un petit panneau solaire et l'électronique de régulation qui va bien !

Roland

je lis attentivement tes recommandations. je fais mon montage sur une Xiao en ESP32-C3, elle possède 2 entrées dédiées pour y connecter directement un batterie "type" Lithium. Je dis type parceque je n'ai pas vu d'éléments qui interdisaient d'y brancher une Li-Ion genre 18560 en 4,2V.
En tout cas la batterie est connecté à un régulateur interne dédié, et brancher la carte sur le PC permet également de recharger la batterie branchée dessus.

Si je m'arrête là, on dirait le rêve incarné cette carte.

J'attends de voir sur du plus long terme le comportement de la batterie, notamment sur les bas voltages.