Script shell en langage arduino

Bonjour à tous,

J’ai trouvé un petit script shell qui affiche la couleur des jours de l'abonnement Tempo dans le terminal Debian ( Linux ).

Existe une possibilité de le transformer en code Arduino ?

Possible, poste-le et on verra si ça nous donne des idées.

Tempo.zip (726 Octets)

Salut

RESULT="`wget -qO- $adresse`"
RESULT_JOURS_RESTANTS="`wget -qO- $adresseJoursRestants`"

Tout dépend de ce que l'on appelle code ARDUINO.
wget est un client WEB.
Il te faut au minimum un ARDUINO + carte Ethernet, ou un ESP8266, ou ESP32.

J'ai un ESP32S3.

Je peux pas recuperer l'adresse par la box?

Je me demande un peu comment on peut faire exécuter un script sans avoir un shell ...
à moins qu'il existe un shell pour Arduino ??

Il te faut donc utiliser un client WEB pour remplacer wget :
Un exemple :

C'est un ESP32, pas un ESP8266 :wink:

Le même exemple existe pour ESP32 :

Tu sous entends que c'est un script Bash, parce-que pour exécuter un script, il suffit d'un moteur de script :smiley::face_with_hand_over_mouth:

Ok merci pour le lien.

Mais cette partie de code dans le script sh, je fais quoi avec? :

adresse="https://${adresse}${DATEJOUR}"

RESULT="`wget -qO- $adresse`"
RESULT_JOURS_RESTANTS="`wget -qO- $adresseJoursRestants`"

Tu t'en inspire pour faire une requête HTTPS avec la même URL sur ton ESP32

DATEJOUR=$(date +%Y-%m-%d)
DATEJOUR_FR=$(date '+%A %d-%m-%Y')
DATEDEMAIN_FR=$(date --date='next day' '+%A %d-%m-%Y')

adresse="particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant="
adresseJoursRestants="particulier.edf.fr/services/rest/referentiel/getNbTempoDays?TypeAlerte=TEMPO"

Tu veux dire que tu ne comprends pas le bash ?
Essaie les commandes dans un terminal :

date +%Y-%m-%d

DATEJOUR reçoit la valeur affichée de cette commande :

DATEJOUR=$(date +%Y-%m-%d)

J'y planche depuis hier.

Avec cette ligne:

http.begin("https://particulier.edf.fr/services/rest/referentiel/getNbTempoDays?TypeAlerte=TEMPO");

J'ai ce message dans le moniteur série:

10:36:44.107 -> [HTTP] GET... code: date +Y-m-200{"PARAM_NB_J_BLANC":11,"PARAM_NB_J_ROUGE":0,"PARAM_NB_J_BLEU":153}

Je fais quoi avec ces variables?

Avec cette ligne:

http.begin("particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant="); 

J'ai ce message d'erreur dans le moniteur série:

10:46:27.231 -> [HTTP] begin...
10:46:27.231 -> [152122][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
10:46:27.231 -> [152123][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
10:46:27.231 -> [HTTP] GET...
10:46:27.231 -> [152125][W][HTTPClient.cpp:1469] returnError(): error(-1): connection refused
10:46:27.231 -> [HTTP] GET... failed, error: connection refused

Le code:

#include <Arduino.h>

#include <WiFi.h>
#include <WiFiMulti.h>
#include <TFT_eSPI.h>

#include <HTTPClient.h>
#include "perso.h"

#define USE_SERIAL Serial

WiFiMulti wifiMulti;

TFT_eSPI lcd = TFT_eSPI();
TFT_eSprite sprite = TFT_eSprite(&lcd);

void setup() {
 USE_SERIAL.begin(115200);

    USE_SERIAL.println();
    USE_SERIAL.println();
    USE_SERIAL.println();

    for(uint8_t t = 4; t > 0; t--) {
        USE_SERIAL.printf("[SETUP] WAIT %d...\n", t);
        USE_SERIAL.flush();
        delay(1000);
    }

    wifiMulti.addAP(ssid, password);

    }

void loop() {
  if((wifiMulti.run() == WL_CONNECTED)) {

        HTTPClient http;

        USE_SERIAL.print("[HTTP] begin...\n");
        
       http.begin("https://particulier.edf.fr/services/rest/referentiel/getNbTempoDays?TypeAlerte=TEMPO");
       http.begin("particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant="); //HTTP

        USE_SERIAL.print("[HTTP] GET...\n");
        // 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
            USE_SERIAL.printf("[HTTP] GET... code: date +%Y-%m-%d", httpCode);

            // file found at server
            if(httpCode == HTTP_CODE_OK) {
                String payload = http.getString();
                USE_SERIAL.println(payload);
            }
        } else {
            USE_SERIAL.printf("[HTTP] GET... failed, error: %s\n", http.errorToString(httpCode).c_str());
        }

        http.end();
    }

    delay(5000);

Avec du https, il te faut un certificat.
Mais on peut passer outre :

    client->setInsecure();

Avec du https, il te faut un certificat.

Je ne pense pas que ça vienne de là.

En fait l'url attend la date à la fin ( https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2023-03-20) )

http.begin("particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=an-mois-jour");

Mais je ne sais pas comment les inclure à partir de ce code:

struct tm timeinfo;
  if (!getLocalTime(&timeinfo)) {
    Serial.println("Failed to obtain time");
    return;
  }
  
  char timeDay[3];
  strftime(timeDay, 3, "%d", &timeinfo);
  jour = String(timeDay);

  char timeMonth[3];
  strftime(timeMonth, 3, "%m-", &timeinfo);
  mois = String(timeMonth);

  char timeYear[5];
  strftime(timeYear, 5, "%Y-", &timeinfo);
  an = String(timeYear);

J'ai tout essayé: en char, en string, avec ou sans les guillemets. Trois heures que j'y suis... :frowning:

Pourquoi passer par strftime() ?
Cela peut être résolu avec un simple sprintf() :
sprintf(buffer, "particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=%d-%d-%d", timeinfo.tm_year, timeinfo.tm_mon, timeinfo.tm_mday);
Avec un buffer assez grand bien sûr.

Avec un ESP32 tu peux aussi utiliser une String :

  String buf = "particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=";
  buf += timeinfo.tm_year + '-' + timeinfo.tm_mon + '-' + timeinfo.tm_mday;

Au choix.

J'en bave! :frowning:
Je comprends pas grand chose à ce que je fais.

J'ai fait copié/collé de:

String buf = "particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=";
        buf += timeinfo.tm_year + '-' + timeinfo.tm_mon + '-' + timeinfo.tm_mday;

J'ai ce message d'erreur:

error: 'class String' has no member named 'tm_year'

Je n'ai jamais essayé, mais il est possible que += n'accepte qu'un seul argument derrière. Par exemple :
a += 1;
fonctionne, mais pas :
a += 1 + 2;
Donc tu peux changer la seconde ligne par :
buf = buf + timeinfo.tm_year + '-' + timeinfo.tm_mon + '-' + timeinfo.tm_mday;
ou, pourquoi pas :
buf += (timeinfo.tm_year + '-' + timeinfo.tm_mon + '-' + timeinfo.tm_mday);

J'avance, mais j'ai toujours des erreurs.

j'ai mis des print sur ce passage:

String buf = "https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=";
       buf += (an) + '-' + (mois) + '-' + (jour);
       
       http.begin("buf");
       Serial.println(buf);

       String buf2 =("https://particulier.edf.fr/services/rest/referentiel   /getNbTempoDays?TypeAlerte=TEMPO");
       http.begin("buf2");
       Serial.println(buf2);

J'ai des messages d'erreur alors que les adresses sont correctes ( j'ai copié et testé dans mon navigateur ).
à noter que l'adresse du buf2 qui répondait quand ce n'était pas une string donne désormais le message d'erreur "returnError(): error(-1): connection refused"

17:10:41.858 -> [ 10404][I][WiFiMulti.cpp:174] run(): [WIFI] Connecting done.
17:10:41.858 -> [HTTP] begin...
17:10:41.858 -> [ 10404][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
17:10:41.858 -> [ 10405][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
17:10:41.858 -> https://particulier.edf.fr/services/rest/referentiel/searchTempoStore?dateRelevant=2023-03-20
17:10:41.858 -> [ 10411][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
17:10:41.901 -> [ 10418][E][HTTPClient.cpp:257] beginInternal(): failed to parse protocol
17:10:41.901 -> https://particulier.edf.fr/services/rest/referentiel/getNbTempoDays?TypeAlerte=TEMPO
17:10:41.901 -> [HTTP] GET...
17:10:41.901 -> [ 10424][W][HTTPClient.cpp:1469] returnError(): error(-1): connection refused
17:10:41.901 -> [HTTP] GET... failed, error: connection refused```