Créer une interface graphique pour piloter des relais wifi

Bonjour,

Je travail actuellement sur un projet qui doit me permettre de piloter a distance un relais wifi et a terme plusieurs relais en même temps.
J’utilise un Raspberry Pi 4 et un relais wifi avec ESP 01 (Type LC Tech)

Le firmware utilisé sur l’ESP est ESP Easy, il est programmé et fonctionnel.

J’utilise des commande en IP pour faire fonctionner le relais :
Relais 1 ON : @IP/control?cmd=relay,0,1
Relais 1 OFF: @IP/control?cmd=relay,0,0

Relais 2 ON : @IP/control?cmd=relay,1,1
Relais 1 OFF: @IP/control?cmd=relay,1,0

Je souhaiterais donc créer une interface graphique simple qui me permettrais de piloter le relais depuis le Raspberry:
Avec pour chaque relais un bouton ON et un bouton OFF et un retour d’état de chaque relais.
Il faudrait que cette interface ressemble a ceci pour 1 relais :

Schéma 2

De quelle façon je pourrais créer cette interface? avec quel type de code? … Sachant que pour finaliser le projet, je souhaiterais piloter plusieurs relais de la même manière et ainsi les regrouper dans la même interface sur le RPi.
Si quelqu’un peut m’aider.

Merci d’avance

Guillaume

Bonjour @Guillaume_Cab,

J’ai fait un peu la même chose avec une interface web pour piloter des prises 433 MHz,
Mais pour le retour de l’état je n’ai rien d’autre que le retour que la commande est bien partie.
Question,
Peux tu connaître l’état du relais en ligne de commande ?

hello,

sur cette page ( ESPEasy Command Reference - Let's Control It ) tu trouveras les différents protocoles utilisables, http, mqtt, serial …

si tu utilises le protocole http, une simple page web sur ton PC maître devrait suffire: (pas besoin de serveur web sur le PC)

<html>
<a href="<l'ip de l'esp>/control?cmd=relay,0,1>put relay on</a>
</html>

après ça dépend de ce que répond l’esp … (retour d’état qui pourrait être testé par javascript (?) )
je n’utilise pas easy esp mais l’ide d’arduino ; et c’est au niveau de l’esp qu’on peut gérer, via son serveur web, l’envoie d’une page en javascript avec le bouton et la commande voulue. si j’en crois cette page il existe une solution identique sur easy esp en uploadant une page web (ESP Easy display read temperature data as a web page upon request. · Issue #2186 · letscontrolit/ESPEasy · GitHub)
mais la syntaxe est pas franchement « eazy » … (Rules — ESP Easy 2.1-beta1 documentation)…

la page ressemblerait a un truc comme ça :

 <!DOCTYPE html><html>
 <head><meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:,">
 // CSS to style the on/off buttons
 // Feel free to change the background-color and font-size attributes to fit your preferences
 <style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
 .button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;border-radius: 3px;
 text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
 .button2 {background-color: #77878A;}</style></head>

 <body><h1>ESP8266 Web Server</h1>

 <p>- Etat " + State + "</p>  // la c'est du c++ ( enfin un bout de) il faudra remplacer par le langage d'esp easy

 if (State=="off") {                 // la aussi sur if then else...
 <p><a href="/control?cmd=relay,0,1"><button class="button">ON</button></a></p>
 } else {     
 <p><a href="/control?cmd=relay,0,0"><button class="button button2">OFF</button></a></p>
 }
</body>*
</html>

En clair dans l’exemple, c’est le serveur de l’esp qui envoie les commandes et affiche le bouton permettant de changer l’état.

Après une page web sur ton PC avec un lien vers les différentes pages ( celle que tu auras uploader) de tes différents relais dans des div ou des frames (https://www.w3schools.com/)

Merci pour vos réponses je vais étudier ça de plus près.

Bonjour @gtv61

Peux tu envoyer une copie d’écran de ton interface web ?

merci d’avance

Screenshot_20200323_134303

Dis moi si tu peux le voir ?

Merci mais je n’est pas l’image !!

Voici enfin… c’est arrivé

Merci!
Comment as tu fais pour que quand tu appuis sur lampe 1 allumé, celle si s’allume et inversement?

Je suis occupé pour l’instant je te ferai un topo plus tard :slightly_smiling_face:

@Guillaume_Cab,
As tu installé apache2 et php , sinon il fait le faire …
Dans le dossier

/var/www/html/

Tu as un fichier index.html que tu renommés en old.index.html

Je te donne le reste un peu plus tard , donnes moi une réponse de ton avancement
A plus

pour faire une page avec des liens vers tes différentes commandes de relais tu peux simplement créer une page un_nom.html n’importe où dans ton PC même sans apache bon ok elle est moins joli que celle de gtv61

<!DOCTYPE html><html>
 <head><meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:,">
 <style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: center;}
 .button { background-color: #195B6A; border: none; color: white; padding: 16px 40px;border-radius: 3px;
 text-decoration: none; font-size: 30px; margin: 2px; cursor: pointer;}
 .button2 {background-color: #77878A;} .lib {font-size:30px}</style></head>

 <body><h1>ESP8266 Web Server ip = 192.168.1.2</h1>

<table>
 <tr>
  <td class="lib">Relais 0 eclairage exterieur</td> 
  <td><a href="http://192.168.1.2/control?cmd=relay,0,1"><button class="button">ON</button></a></td>
  <td><a href="http://192.168.1.2/control?cmd=relay,0,0"><button class="button button2">OFF</button></a></td>
 </tr>
 <tr>
  <td class="lib">Relais 1 </td> 
  <td><a href="http://192.168.1.2/control?cmd=relay,1,1"><button class="button">ON</button></a></td>
  <td><a href="http://192.168.1.2/control?cmd=relay,1,0"><button class="button button2">OFF</button></a></td>
 </tr>
</table>
</body>*
</html>

si j’ai bien compris cette page ( ESP Easy web interface - Let's Control It)
on doit pouvoir récupérer l’état des différents relais au format json. Mais la il faudra du javascript ou du php ( et apache ou nginx) et de la programmation mais ça permettrait de connaître l’état du relais et donc de conditionner l’affichage on ou off.

sources :

https://www.php.net/manual/fr/function.json-decode.php

Salut @bof,
moi c’est du php qui envoie les commandes directement mais pour moi comme je travaille avec un relais radio je ne peux pas voir l’état et donner l’info en retour, sauf que la commande est bien partie…
Quand @Guillaume_Cab nous auras répondu pour savoir où il en est de l’installation , il aura le choix de prendre et d’essayer ta version ou la mienne, mais ma page est plus rigolote que jolie :wink:
Il y a du CSS pour les boutons et une image qui fait le fond…
Expliques moi un peu NGIX l’intérêt ?
A plus

Merci !!
La solution de @bof est pas mal aussi, pour le moment je pense que c’est le plus simple étant donné que je ne passe pas par le RPi et donc plus facile a mettre en œuvre.
Je vais essayer de comprendre comment faire pour avoir le retour d’état du relais.

merci beaucoup pour votre aide

Très bien,
Si tu as besoin sonne :bell::slightly_smiling_face:

Le principal intérêt de nginx c’est que c’est plus léger ( moins gourmand en ressource, et plus rapide ) que apache. On peut quant même utiliser PHP avec et c’est en gros le même principe pour les droits et le répertoire où il installe ses documents. par contre les .htaccess de apache sont gérés différemment ds nginx.
tu trouveras en source une explication plus complète.

source:
un peu de théorie … NGINX — Wikipédia
et en pratique :
Raspberry Pi Documentation - Remote access
How To Install Linux, Nginx, MariaDB, PHP (LEMP stack) on Debian 10 | DigitalOcean

Bonjour,

Je reviens vers vous pour la suite de mon projet.
J’ai, pour le moment, 2 problèmes :

  • Je voudrais que lorsqu’on appuis sur le bouton « Fermé » le voyant vert passe en rouge et inversement (il doit surement manquer quelque chose mais je ne comprend pas).

  • Lorsque j’appuie sur l’un des boutons j’envoie une requête HTTP pour commander l’ouverture ou la fermeture du relais. Je souhaiterais donc que lorsque j’appuie sur le bouton, la commande s’exécute mais qu’il n’y ai pas d’ouverture de la page associer a la commande HTTP://@IP/contol?cmd=relay,0,1 (par exemple).

Et enfin je suis toujours a la recherche pour avoir le retour d’état des relais.

Si l’un d’entre vous peu m’aider, je vous remercie d’avance.

Voici le code utilisé:

    <!DOCTYPE html>
<html lang="fr">
<head>
  <title>Projet SA Fictif</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
</head>


<body>

<head><meta name="viewport" content="width=device-width, initial-scale=1">
 <link rel="icon" href="data:,">
 <style>html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: left;}
 .button { background-color: #e91111; border: none; color: white; padding: 5px 15px;border-radius: 3px;
 text-decoration: none; font-size: 15px; margin: 2px; cursor: pointer;}
 .button2 {background-color: #18b11d;} .lib {font-size:15px}</style>
 </head>
 
 

<div class="jumbotron text-center">
  <h1>PROJET SA FICTIF</h1>
  
</div>
  
<div class="container">
  <div class="row">
    <div class="col-sm-4">
           <h4>ESP n°1</h4>
  <table>
 <tr>
  <td class="lib">Relais 1 </td> 


  <td><a href="http://192.168.1.39/control?cmd=relay,0,1">
	  <button onclick="document.getElementById('myImage').src='fermé.jpg'" class="button">Fermé</button></a></td>
  <td><a href="http://192.168.1.39/control?cmd=relay,0,0">
	  <button onclick="document.getElementById('myImage').src='ouvert.png'" class="button button2">Ouvert</button></a> 
            <img id="myImage" src="ouvert.png" style="width:20px"> </td>
 </tr>           
   <tr>
  <td class="lib">Relais 2 </td> 
  <td><a href="http://192.168.1.39/control?cmd=relay,1,1">
	  <button onclick="document.getElementById('myImage').src='fermé.jpg'" class="button">Fermé</button></a></td>
	  
   <td><a href="http://192.168.1.39/control?cmd=relay,1,0">
	  <button onclick="document.getElementById('myImage').src='ouvert.png'" class="button button2">Ouvert</button></a> 
	  	  <img id="myImage" src="ouvert.png" style="width:20px"></td>
 </tr> 
  <span class="badge badge-warning">Etat GPIO 16</span>
</table>     
    </div>
    
  </body>
  </html>

Bonsoir @Guillaume_Cab,
Tu envoies une requête HTML sur une page normal de voir la page,
Il manque un rappel a ta page de base !
En suite la partie style est dans la partie body,
Normal ou pas ?
Commençons par trouver le rappel à ta page automatiquement …

Je cherche en HTML, en PHP j’ai la solution.

si tu as des fichiers images: ferme.png et un autre ouvert.png dans le même répertoire que le html ce code doit faire ce que tu demandes ; bien évidemment si tu fermes ta page tu perds l’info du status de tes relais.
pour palier a ce problème tu pourrais utiliser des cookies comme c’est expliqué là:

sinon le code (sans les cookies) donnerait un machin comme ça:

<!DOCTYPE html>
<html lang="fr">
<head>
  <title>Projet SA Fictif</title>
  <meta charset="utf-8">
  <meta name="viewport" content="width=device-width, initial-scale=1">
  <link rel="stylesheet" href="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/css/bootstrap.min.css">
  <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.4.1/jquery.min.js"></script>
  <script src="https://cdnjs.cloudflare.com/ajax/libs/popper.js/1.16.0/umd/popper.min.js"></script>
  <script src="https://maxcdn.bootstrapcdn.com/bootstrap/4.4.1/js/bootstrap.min.js"></script>
  <link rel="icon" href="data:,">
 <style>
   html { font-family: Helvetica; display: inline-block; margin: 0px auto; text-align: left;}
   .button { background-color: #e91111; border: none; color: white; padding: 5px 15px;border-radius: 3px;
text-decoration: none; font-size: 15px; margin: 2px; cursor: pointer;}
   .button2 {background-color: #18b11d;}
   .lib {font-size:15px}
   #myImage {width: 73px; height:33px}
   #myImage2 {width: 73px; height:33px}
   iframe {display: none;}
 </style>
</head>
<body>
<iframe name="invisible"></iframe>
<div class="jumbotron text-center">
  <h1>PROJET SA FICTIF</h1>
</div>
  
<div class="container">
  <div class="row">
    <div class="col-sm-4">
           <h4>ESP n°1</h4>
  <table>
 <tr>
  <td class="lib">Relais 1 </td> 


  <td><a href="http://192.168.1.39/control?cmd=relay,0,1" target="invisible">
	  <button onclick="document.getElementById('myImage').src='ferme.png'" class="button">Fermé</button></a></td>
  <td><a href="http://192.168.1.39/control?cmd=relay,0,0" target="invisible">
	  <button onclick="document.getElementById('myImage').src='ouvert.png'" class="button button2">Ouvert</button></a> 
            <img id="myImage" src="ferme.png" > </td>
 </tr>           
   <tr>
  <td class="lib">Relais 2 </td> 
  <td><a href="http://192.168.1.39/control?cmd=relay,1,1" target="invisible">
	  <button onclick="document.getElementById('myImage2').src='ferme.png'" class="button">Fermé</button></a></td>
	  
   <td><a href="http://192.168.1.39/control?cmd=relay,1,0" target="invisible">
	  <button onclick="document.getElementById('myImage2').src='ouvert.png'" class="button button2">Ouvert</button></a> 
	  	  <img id="myImage2" src="ferme.png" ></td>
 </tr> 
  <span class="badge badge-warning">Etat GPIO 16</span>
</table>
      </div>     
    </div>
</div>    
</body>
</html>

quand tu envoies par exemple http ://192.168.1.39/control?cmd=relay,0,1 il te renvoie une page vide ? as tu regarder son source sur ton navigateur ? son code retour ds les options de développement de ton navigateur ? c’est bizarre qu’il te renvoie pas un truc !