F1ATB forum
Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - Version imprimable

+- F1ATB forum (https://f1atb.fr/forum_f1atb)
+-- Forum : Forum de F1ATB (https://f1atb.fr/forum_f1atb/forum-3.html)
+--- Forum : Routeur Photovoltaïque (https://f1atb.fr/forum_f1atb/forum-4.html)
+--- Sujet : Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? (/thread-2874.html)



Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - D4v1d - 01-08-2026

Bonjour, voilà une semaine que je recherche la méthode pour commander un relais wifi Sonoff MINIR4 reprogrammé sous ESPHome (en version 7.3)  via le GPIO externe.
Aujourd'hui, j'arrive à commander le relais sous Windows via cette commande >curl.exe -X POST http://192.168.1.14/switch/relais/turn_on -H "Content-Length: 0" pour le mettre en service 
et >curl.exe -X POST http://192.168.1.14/switch/relais/turn_off -H "Content-Length: 0" pour le couper.

De ce que j'ai compris, la configuration du GPIO externe sera:

HOST: 192.168.1.14
PORT: 80
ORDER ON: switch/relais/turn_on?"Content-Length: 0"
ORDER OFF: switch/relais/turn_off?"Content-Length: 0"
mais il manque quelque chose car ça ne fonctionne pas. 

Quelqu'un a-t-il déjà réussi ?

Merci d'avance


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - Mike - 01-08-2026

Bonjour,
Le routeur effectue un GET et non un POST c'est sûrement la raison du disfonctionnement.


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - Lolo69 - 01-08-2026

Le -H ?? Et potentiellement un / devant switch


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - F1ATB - 01-08-2026

Le routeur fait un GET et non pas un POST.

André


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - michy - 02-08-2026

Bonjour,
  si Content-Length: 0 alors un GET devrait passer sans ajout de header pour dire qu'il n'y a pas de body :

à la place de 
Code :
curl.exe -X POST http://192.168.1.14/switch/relais/turn_on -H "Content-Length: 0"

essayez
Code :
curl.exe -X GET http://192.168.1.14/switch/relais/turn_on

 si ça fonctionne avec curl, l'usage avec le routeur devrait être Ok [le Sonoff MINIR4 impose peut être de travailler avec POST ?]


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - D4v1d - 02-08-2026

(02-08-2026, 12:03 AM)michy a écrit : Bonjour,
  si Content-Length: 0 alors un GET devrait passer sans ajout de header pour dire qu'il n'y a pas de body :

à la place de 
Code :
curl.exe -X POST http://192.168.1.14/switch/relais/turn_on -H "Content-Length: 0"

essayez
Code :
curl.exe -X GET http://192.168.1.14/switch/relais/turn_on

 si ça fonctionne avec curl, l'usage avec le routeur devrait être Ok [le Sonoff MINIR4 impose peut être de travailler avec POST ?]

Bonjour et merci pour vos réponses.

La conclusion est que c'est impossible, car ESPHome ne fait de changement d'état du relais que sur une requête POST.

Voici les réponses que je reçois pour :
> curl.exe -X GET http://192.168.1.14/switch/relais => {"name_id":"switch/relais","id":"switch-relais","value":false,"state":"OFF"}
> curl.exe -X POST http://192.168.1.14/switch/relais/turn_on -H "Content-Length: 0" => changement d'état du relais
> curl.exe -X GET http://192.168.1.14/switch/relais => {"name_id":"switch/relais","id":"switch-relais","value":true,"state":"ON"}
mais pour une requête en GET :
> curl.exe -X GET http://192.168.1.14/switch/relais/turn_on => Not Found


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - michy - 02-08-2026

Bonjour,

  Pour piloter le relais avec le routeur, une petite modif dans le code source, (le fonctionnement reste implicite avec un GET) :

Code :
void Action::CallExterne(String host, String url, const int port) { // void Action::CallExterne(const String &host, const String &url, const int port) {
  if (url == "") return;
  NetworkClient clientExt;  // Use local NetworkClient class to create TCP connections, mendatory to close before any return !!
  char hostbuf[host.length() + 1];
  host.toCharArray(hostbuf, host.length() + 1);
  if (!clientExt.connect(hostbuf, port, 3000)) {
    clientExt.stop();
    delay(500);
    if (!clientExt.connect(hostbuf, port, 3000)) {
      delay(100);  //Necessaire
      StockMessage("connection to :" + host + " failed");
      delay(100);
      return;
    }
  }
  if (url.startsWith("POST "))
    clientExt.print(url + " HTTP/1.1\r\nHost: " + host + "\r\nContent-Length: 0\r\nConnection: close\r\n\r\n"); // POST sans body
  else
    clientExt.print(String("GET ") + url + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (clientExt.available() == 0) { // donne 5s de délai pour recevoir un retour
    if (millis() - timeout > 5000) {
      StockMessage(">>> clientESP_Ext Timeout ! : " + host);
      clientExt.stop();
      return;
    }
  }
  timeout = millis();
  while (clientExt.connected() || clientExt.available()) { // on lit le retour pour vider le buffer, on utilise pas la réponse
    if (clientExt.available()) clientExt.readString();
    if (millis() - timeout > 2000) break;  // garde-fou
  }
  clientExt.stop();
}

et les commandes a passer devront être du style "POST /switch/relais/turn_on" et  "POST /switch/relais/turn_off"


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - D4v1d - 02-08-2026

(02-08-2026, 12:38 PM)michy a écrit : Bonjour,

  Pour piloter le relais avec le routeur, une petite modif dans le code source, (le fonctionnement reste implicite avec un GET) :

Code :
void Action::CallExterne(String host, String url, const int port) { // void Action::CallExterne(const String &host, const String &url, const int port) {
  if (url == "") return;
  NetworkClient clientExt;  // Use local NetworkClient class to create TCP connections, mendatory to close before any return !!
  char hostbuf[host.length() + 1];
  host.toCharArray(hostbuf, host.length() + 1);
  if (!clientExt.connect(hostbuf, port, 3000)) {
    clientExt.stop();
    delay(500);
    if (!clientExt.connect(hostbuf, port, 3000)) {
      delay(100);  //Necessaire
      StockMessage("connection to :" + host + " failed");
      delay(100);
      return;
    }
  }
  if (url.startsWith("POST "))
    clientExt.print(url + " HTTP/1.1\r\nHost: " + host + "\r\nContent-Length: 0\r\nConnection: close\r\n\r\n"); // POST sans body
  else
    clientExt.print(String("GET ") + url + " HTTP/1.1\r\nHost: " + host + "\r\nConnection: close\r\n\r\n");
  unsigned long timeout = millis();
  while (clientExt.available() == 0) { // donne 5s de délai pour recevoir un retour
    if (millis() - timeout > 5000) {
      StockMessage(">>> clientESP_Ext Timeout ! : " + host);
      clientExt.stop();
      return;
    }
  }
  timeout = millis();
  while (clientExt.connected() || clientExt.available()) { // on lit le retour pour vider le buffer, on utilise pas la réponse
    if (clientExt.available()) clientExt.readString();
    if (millis() - timeout > 2000) break;  // garde-fou
  }
  clientExt.stop();
}

et les commandes a passer devront être du style "POST /switch/relais/turn_on" et  "POST /switch/relais/turn_off"

Bonjour Michy,

Merci pour ce custom code. Je viens de le compiler sur la V17-16S3 que je fais tourner sur un XIAO ESP32S3 depuis 4 mois.
Ton code est bon et j'arrive enfin à piloter mon sonoff à partir de l'esp32S3 du routeur.

Merci André et merci Michy pour le travail effectué.

Si la modification ne prend pas trop de place en mémoire, pouvez-vous l'intégrer à la prochaine mise à jour ?


RE: Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ? - michy - 03-08-2026

Bonjour,

  heureux de savoir que ça fonctionne,

  Libre à André d'inclure (ou pas) cette possibilité de commander un relais externe avec méthode POST