"poster" des acquisitions sur google sheets

Bonjour,
matériel : ESP8266.
Le but : envoyer des mesures de température, de pression ou autre sur une feuille google sheet (pour ensuite faire des graphiques).
Je n'ai pas de shield pour une SD et je voudrais que les valeurs soient disponibles délocalisées.


/*
* L'ESP32 ou ESP8266 envoie des données vers Google Sheets
* 
* Pour plus de détails:
* https://electroniqueamateur.blogspot.com/2020/05/envoi-de-donnees-de-lesp32esp8266-vers.html
  * 
  */
 
 #if defined ARDUINO_ARCH_ESP8266  // s'il s'agit d'un ESP8266
 #include <ESP8266WiFi.h>
 #elif defined ARDUINO_ARCH_ESP32  // s'il s'agit d'un ESP32
 #include "WiFi.h"
 #endif
 
 #include <WiFiClientSecure.h>
 
 const char *ssid = "*****"; // à remplacer par le nom de votre réseau WiFi
 const char *password = "*****"; // à remplacer par le mot de passe WiFi
 const char* host = "script.google.com";
 //const char* host = "google.com";
 String url;
 
 //à remplacer par le fingerprint SHA1 de votre App Script
 // utile pour l'ESP8266 mais pas pour l'ESP32
 const char fingerprint[] PROGMEM = "alors là je ne suis pas sur";
 
 int compteur = 0;
 
 void setup()
 {
   Serial.begin(115200);
   delay(100);
   Serial.println();
   Serial.println();
   Serial.print("Connexion a ");
   Serial.println(ssid);
 
   WiFi.begin(ssid, password);
   while (WiFi.status() != WL_CONNECTED)
   {
     delay(500);
     Serial.print(".");
   }
 
   Serial.println("");
   Serial.println("WiFi connecte");
   
 }
 void loop()
 {
   Serial.print("Connexion a ");
   Serial.println(host);
 //WiFiSSLClient client;
 WiFiClient client;//Secure
 
   // ligne commenté WiFiClientSecure client;
 
   const int httpPort = 80;//443;
 
   #if defined ARDUINO_ARCH_ESP8266  // s'il s'agit d'un ESP8266
 //    client.setFingerprint(fingerprint);
   #endif
 
   if (!client.connect(host, httpPort))
   {
     Serial.println("Echec de la connexion");
     delay(10000);
     return;
   }
 
   float mesure = 5.0 * sin(compteur / 20.0) * sin(compteur / 50.0); // calcul d'une valeur à envoyer
   compteur++;
 
   // à remplacer par l'url de votre web app:
   //url = " /macros/s/******/exec?func=addData&val1=" + String(mesure) + "&val2=" + String(compteur);
   url ="https://script.google.com/macros/s/A****/exec?func=addData&amp;val1=5&amp;val2=5";//" + String(mesure) + "&val2=" + String(compteur);
   Serial.print("URL: ");
   Serial.println(url);
 
   client.print(String("GET ") + url + " HTTP/1.1\r\n" +
                "Host: " + host + "\r\n" +
                "Connection: close\r\n\r\n");
   delay(500);
   String section = "header";
   while (client.available())
   {
     String line = client.readStringUntil('\r');
     Serial.print(line);
   }
   Serial.println("Fermeture de la connexion.");
   delay(10000); // on envoie les prochaines données dans 10 secondes
}

Voilà le code que j'utilise. J'ai remplacé les informations sensibles par ** ou ??. ?? c'est parce que je ne suis pas sur.

Sur une page web, en navigation privée, si je copie la ligne 76 j'ajoute une ligne à mon fichier Google.

Si je lance le script sur mon ESP j'ai
0:04:38.133 -> .............
10:04:45.395 -> WiFi connecte
10:04:45.395 -> Connexion a script.google.com
10:04:45.442 -> URL: https://script.google.com/macros/s/****/exec?func=addData&amp;val1=5&amp;val2=5
10:04:45.949 -> HTTP/1.1 400 Bad Request
10:04:45.949 -> Content-Type: text/html; charset=UTF-8
10:04:45.949 -> Referrer-Policy: no-referrer
10:04:45.949 -> Content-Length: 1555
10:04:45.949 -> Date: Sat, 18 Dec 2021 09:04:42 GMT
10:04:45.949 -> Connection: close
10:04:50.966 ->
10:04:50.966 ->
10:04:50.966 ->
10:04:50.966 ->
10:04:50.966 ->
10:04:50.966 -> Error 400 (Bad Request)!!1
10:04:50.966 ->
10:04:50.966 -> {margin:0;padding:0}html,code{font:15px/22px arial,sans-serif}html{background:#fff;color:#222;padding:15px}body{margin:7% auto 0;max-width:390px;min-height:180px;padding:30px 0 15px} > body{background:url(//www.google.com/images/errors/robot.png) 100% 5px no-repeat;padding-right:205px}p{margin:11px 0 22px;overflow:hidden}ins{color:#777;text-decoration:none}a img{border:0}@media screen and (max-width:772px){body{background:none;margin-top:0;max-width:none;padding-right:0}}#logo{background:url(//www.google.com/images/branding/googlelogo/1x/googlelogo_color_150x54dp.png) no-repeat;margin-left:-5px}@media only screen and (min-resolution:192dpi){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat 0% 0%/100% 100%;-moz-border-image:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}}@media only screen and (-webkit-min-device-pixel-ratio:2){#logo{background:url(//www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) no-repeat;-webkit-background-size:100% 100%}}#logo{display:inline-block;height:54px;width:150px}
10:04:51.060 ->
10:04:51.060 ->
10:04:51.060 ->

400. That’s an error.
10:04:51.060 ->

Your client has issued a malformed or illegal request. That’s all we know.
10:04:51.107 -> Fermeture de la connexion.

Mes maigres compétences sont déjà dépassées, est ce que quelqu'un peut m'aider?

J'espère que explications sont suffisamment claires, n'hésitez pas à me demander plus de détail sinon.

Moderateur : je suis désolé mais je ne comprend pas comment formater mon texte correctement.

pourquoi est-ce que cela a été changé / commenté ?

si votre requête est en https il faut un WiFiClientSecure et votre URL n'a pas besoin de https://script.google.com puisque c'est déjà l'host sur lequel vous vous êtes connecté

Merci pour la réponse :slight_smile:
Si je remplace ligne 54 WiFiClient par WiFiClientSecure j'ai dans la console

11:39:44.907 -> .............
11:39:52.160 -> WiFi connecte
11:39:52.160 -> Connexion a script.google.com
11:39:52.253 -> Echec de la connexion
En fait c'est pour ça que j'avais changé WiFiClient par WiFiClientSecure, j'avais l'impression d'aller plus loin!

je n'utilise pas les services google docs. avez vous la bonne identification ?

il me semble, je crois que c'est le fingerprint.
Sans le wifisecure la connexion à script.google.com semble se faire non?

Dans le fingerprint il faut trouver le bon certificat

Pour ce faire, de ce que j'ai compris, je vais sur ma page sécurisée et il y a un cadenas sur la barre d'adresse.
Je clic dessus et je choisi "la connexion est sécurisée", afficher le certificat.
Délivré à:*.google.com blablabla.
Je choisi l'onglet détail et là?
Je copie les informations de "Empreinte numérique"? : 59*****104792644b89c1a8de312

j'ai toujours échec de connexion. Ca m'agace...
Le but c'est de garder les acquisions que je fait, si il y a plus simple ça m'irait aussi mais je me dit que les garder dans un classeur Google c'est une solution à moindre frais

les certificats sont en hiérarchie jusqu'à un certificat racine. Il faut trouver le bon

J'ai trouvé une solution (les mesures ne sont pas critiques) :

WiFiClientSecure client;
client.setInsecure();
client.connect(host, httpsport);

Il y a mieux, voir la page ci dessous.
HTTPS requests to any URL using the ESP8266 - Maakbaas

oui avec client.setInsecure() vous acceptez d'envoyer les données à un serveur non identifié. Si elles ne sont pas critiques, ça se fait :slight_smile:

avec nos ESP on se résoud souvent à faire comme-ça faute d'arriver à faire mieux !

Si j'avais su j'aurais gagné du temps

Dans mon cas je suis tombé dessus en parcourant les exemples fournis avec l'extension ESP32 pour IDE Arduino :

exemple WiFIClientInsecure.ino dans le groupe d'exemples WiFIClientSecure

le 'skip verification' ouvrait une perspective intéressante !

Serial.println("\nStarting connection to server...");
  client.setInsecure();//skip verification
  if (!client.connect(server, 443))