Pages Web multiples

On est près du but...
La chaîne "local" est bien détectée dans le retour server, et un petit test sur le moniteur montre que ça marche bien avec mes 4 valeurs de "local".
Par contre, curieusement les "alias" dans la suite de la fonction ne fonctionnent pas
Voici le début du code de la fonction :

void handlePage8(void) {
  Serial.println("GET /page8");
  if (server.hasArg("local"))
  { local = server.arg("local"); 
  Serial.print("local :");
  Serial.println(local); 
  message = htmlPage8;
  message.replace("%LOCAL%", local);
  if (local == "Salon")
 { message.replace("%TEMPJ%", String(tjs));
   message.replace("%TEMPN%", String(tns));
   message.replace("%TIMEJ%", Djs);
   message.replace("%TIMEN%", Dns); } .....

Comme on ne voit pas comment est initialisé message, impossible à dire.
Il faut lui donner à manger la page HTML qui va bien (quelque chose comme
htmlPage8), comportant les balises
%LOCAL%, %TEMPJ%, %TEMPN%, %TIMEJ%, %TIMEN%.

Le message dispose du menu complet (fromage et dessert :

const char htmlPage8[] PROGMEM = R"=====(
<html>

<head>
    <meta http-equiv="content-type" content="text/html;charset=UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/css/bootstrap.min.css">
    <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    <script src="https://maxcdn.bootstrapcdn.com/bootstrap/3.4.1/js/bootstrap.min.js"></script>
    <title>%LOCAL%</title>
</head>
<body style="background-color:#F7F98B;"></body>
<body>
    <div class="container">
        <p><center>    
        <B>%LOCAL%</B>
            <br><B>
            <a class="btn btn-basic" href='/tpjdown' role="button"><B>&#x25C0;</a>&nbsp;
            Temp. J&nbsp;%TEMPJ%&deg&nbsp;
            <a class="btn btn-basic" href='/tpjup' role="button"><B>&#x25B6;</a>
            <br>
            <a class="btn btn-basic" href="/tpndown" role="button"><B>&#x25C0;</a>&nbsp;
            Temp. N&nbsp;%TEMPN%&deg&nbsp;
            <a class="btn btn-basic" href="/tpnup" role="button"><B>&#x25B6;</a>
            <br>
            <a class="btn btn-basic" href="/tmjdown" role="button"><B>&#x25C0;</a>&nbsp;
            Début J&nbsp;%TIMEJ%&nbsp;
            <a class="btn btn-basic" href="/tmjup" role="button"><B>&#x25B6;</a>
            <br>
            <a class="btn btn-basic" href="/tmndown" role="button"><B>&#x25C0;</a>&nbsp;
            Début N&nbsp;%TIMEN%&nbsp;
            <a class="btn btn-basic" href="/tmnup" role="button"><B>&#x25B6;</a>
            <br>
            <a class="btn btn-danger" href="/" role="button">Annuler</a>
            <a class="btn btn-success" href="/valid" role="button">Valider</a>
            <br></B>
          </p>
        </center>
    </div>
</body>

</html>
)=====";

Oui mais encore faut-il l'affecter :

void handlePage8(void) {
  message = htmlPage8;
// avant de faire le reste

j'avais remarqué l'oubli et ajouté la ligne (post édité aussi). Aucun changement...

J'ai même modifié la ligne "message.replace("%LOCAL%", local);"
par celle-ci : "message.replace("%LOCAL%", Salon);

On dirait que le fait d'explorer le server interdit d'en modifier des balises...

A moins que Salon ne soit une variable, cette ligne devrait produire une erreur de compilation. Poste le code complet du handler, plutôt que des morceaux.

C'était juste un essai, la ligne que j'ai postée n'est pas issue du croquis, je l'avais juste saisie dans le post en oubliant les guillemets. Dans l'essai ils figuraient.

Mon code est volumineux, donc je dois poster uniquement le code du handler. Mais ma profanitude me fait te demander "que comprend le handler" ?

Je pense qu'il est constitué par l'ensemble des fonctions lançant les pages (?)

Les voici :

void handleRoot() {
  Serial.println("GET /");
  message = htmlPage1;
  if (state.toInt()>19)
  { actif = ("") ; }
  else
  { actif = ("disabled"); }
  message.replace("%ACTIF%", actif);
  server.send(200, "text/html", message);
  
}

void handlePage2() {
  Serial.println("GET /page2");
  //Serial.println(state);
  if (sal == 1)
  { cols = ("#4AFF00"); }
  else
  { cols = ("#1C5F00"); }
  if (par == 1)
  { colp = ("#4AFF00"); }
  else
  { colp = ("#1C5F00"); }
  if (eva == 1)
  { cole = ("#4AFF00"); }
  else
  { cole = ("#1C5F00"); }
  if (vic == 1)
  { colv = ("#4AFF00"); }
  else
  { colv = ("#1C5F00"); }
  
  message = htmlPage2;
  message.replace("%TS%", ts);
  message.replace("%CS%", cs);
  message.replace("%TP%", tp);
  message.replace("%CP%", cp);
  message.replace("%TE%", te);
  message.replace("%CE%", ce);
  message.replace("%TV%", tv);
  message.replace("%CV%", cv);
  message.replace("%TEX%", String(Tex));
  message.replace("%TCH%", tch);
  message.replace("%CCH%", cch);
  message.replace("%TEC%", tec);
  message.replace("%TCT%", tct);
  message.replace("%CONS%", cons);
  message.replace("%ETAT%", etat);
  message.replace("%COLS%", cols);
  message.replace("%COLP%", colp);
  message.replace("%COLE%", cole);
  message.replace("%COLV%", colv);
  message.replace("%ALL%", String(all));
  message.replace("%FUM%", String(fum));
  if (heur.toInt() >= 10 )
    {message.replace("%HEU%", heur);}
  else
    {message.replace("%HEU%", "0"+heur);}
  if (minu.toInt() >= 10 )
    {message.replace("%MIN%", minu);}
  else
    {message.replace("%MIN%", "0"+minu);}
  if (sec.toInt() >= 10 )
    {message.replace("%SEC%", sec);}
  else
    {message.replace("%SEC%", "0"+sec);}
  server.send(200, "text/html", message);
}

void handlePage3() {
  Serial.println("GET /page3");
  message = htmlPage3;
  message.replace("%MEX%", String(Mex));
  message.replace("%MIX%", String(Mix));
  message.replace("%CONSO%", conso);
  message.replace("%MAXAL%", maxal);
  message.replace("%MAXFU%", maxfu);
  message.replace("%SES%", String(ses));
  server.send(200, "text/html", message);
}

void handlePage4() {
  Serial.println("GET /page4");
  relance = 1;
  Serial.print("relance : ");
  Serial.println(relance);
  server.send(200, "text/html", htmlPage4);
}

void handlePage5() {
  Serial.println("GET /page5");
  server.send(200, "text/html", htmlPage5);
}

void handlePage6() {
  Serial.println("GET /page6");
  server.send(200, "text/html", htmlPage6);
}

void handlePage7() {
  Serial.println("GET /page7");
  server.send(200, "text/html", htmlPage7);
}

void handlePage8(void) {
  Serial.println("GET /page8");
  message = htmlPage8;
  if (server.hasArg("local"))
  { local = server.arg("local"); } 
  Serial.print("local :");
  Serial.println(local);
  message.replace("%LOCAL%", local);
  if (local == "Salon")
 { message.replace("%TEMPJ%", String(tjs));
   message.replace("%TEMPN%", String(tns));
   message.replace("%TIMEJ%", Djs);
   message.replace("%TIMEN%", Dns); }
  if (local == "Ch. Parents")
 { message.replace("%TEMPJ%", String(tjp));
   message.replace("%TEMPN%", String(tnp));
   message.replace("%TIMEJ%", Djp);
   message.replace("%TIMEN%", Dnp); }
  if (local == "Ch. Eva")
 { message.replace("%TEMPJ%", String(tje));
   message.replace("%TEMPN%", String(tne));
   message.replace("%TIMEJ%", Dje);
   message.replace("%TIMEN%", Dne); }
  if (local == "Ch. Vic")
 { message.replace("%TEMPJ%", String(tjv));
   message.replace("%TEMPN%", String(tnv));
   message.replace("%TIMEJ%", Djv);
   message.replace("%TIMEN%", Dnv); }
   server.send(200, "text/html", htmlPage8); 
 }

Voici aussi ce qui lance les fonctions :

  server.on("/", handleRoot);
  server.on("/page2", handlePage2);
  server.on("/page3", handlePage3);
  server.on("/page4", handlePage4);
  server.on("/page5", handlePage5);
  server.on("/page6", handlePage6);
  server.on("/page7", handlePage7);
  server.on("/page8", handlePage8);

Étourderie ?
Ne pas envoyer htmlPage8 mais message.

Je dirais oui, ou pire : sénilité galopante...

L'avant-dernier écueil est à présent franchi. Ne reste "plus" qu'à faire fonctionner les boutons d'incrémentation / décrémentation des valeurs de consigne.
Le côté arduino est codé, reste à récupérer les tics des boutons en restant sur la même page et en réaffichant la valeur modifiée pas par pas...
Là le projet sera bouclé, un peu avant l'hiver, pour du chauffage c'est mieux...

Je viens de mettre en place l'incrémentation / décrémentation des valeurs de la page8.
Comme prévu, le code fonctionne, mais l'affichage ne suit pas : je dois recharger manuellement la page à chaque click pour afficher la valeur modifiée.
J'ai codé comme suit :
Sur la page, chacune des 4 valeurs de paramètre à changer est précédée d'un bouton décrémenter et suivie d'un autre incrémenter.
Exemple issu de la page8, les boutons envoient "tpjdown" et "tpjup" pour température de jour :

<a class="btn btn-basic" href='/tpjdown' role="button"><B>&#x25C0;</a>&nbsp;
Temp. J&nbsp;%TEMPJ%&deg&nbsp;
 <a class="btn btn-basic" href='/tpjup' role="button"><B>&#x25B6;</a>

Si je traite ces "GET /" chacun dans une fonction en ne traitant que le calcul, j'ai une erreur de page, normal.
J'ai donc écrit ceci (exemple pour incrémentation) :

void tpjincr() {
  Serial.println("GET /tpjup");
  if (local == "Salon")
    { tjs = tjs + 0.5;
      if (tjs > 22.0)
       { tjs = 22.0; }
       message.replace("%TEMPJ%", String(tjs,1));}
        ......  //idem pour les 3 autre locaux , puis ......
       server.send(200, "text/html", message); // à la fin de la fonction

le message étant élaboré pour la page8 reste donc valable, balise de TEMPJ exceptée, donc actualisée avant.

L'incrémentation se passe bien "en dessous" mais la page réaffichée reste sur sa valeur d'ouverture. Je dois remonter à la page pointant vers la page8 par un choix "valider" pour réafficher cette dernière, cette fois avec la valeur modifiée.

Cette gymnastique a le mérite d'être fonctionnelle, mais va vite m'énerver...

Il faudrait savoir si la page est ré-affichée ou pas.
Éventuellement ajouter des Serial.print() pour savoir ce qui se passe.

Problème réglé et tout fonctionne à merveille.
Le serveur Web est très dynamique.
Certes, j'ai un peu chargé la mûle avec 85% de contenu de mémoire programme, c'est juste un peu long en compilation mais ça tourne...
A priori,pas de souci côté RAM.
Encore un grand merci pour ton support!!!

Je vais à présent me tourner vers le traitement des données de mon Linky tout neuf...

Bonne continuation :wink:

Dans un souci de sécurisation, je souhaiterais limiter le nombre d'accès à mon serveur Web à 1. Je ne trouve pas de littérature à ce sujet.

D'autre part, peut-on conditionner l'accès par un identifiant et un mot de passe (bien sûr en plus du SSID et du PWD du point d'accès) ?

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.