Messages : 3
Sujets : 1
Inscription : Jul 2025
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
Messages : 951
Sujets : 8
Inscription : Jun 2024
Bonjour,
Le routeur effectue un GET et non un POST c'est sûrement la raison du disfonctionnement.
Messages : 1,276
Sujets : 11
Inscription : Sep 2024
01-08-2026, 08:12 PM
(Modification du message : 01-08-2026, 08:14 PM par Lolo69.)
Le -H ?? Et potentiellement un / devant switch
Messages : 1,625
Sujets : 52
Inscription : May 2024
Le routeur fait un GET et non pas un POST.
André
Messages : 424
Sujets : 0
Inscription : Jun 2024
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 ?]
Merci André  ,
Routeur V17.19 (since V2.01) / Source UxI / 5 actions
Si les réponses que je propose bénévolement sur ce forum ne vous plaisent pas, ignorez-les simplement sans me jeter la pierre ! (Ou ne posez pas de question)
Messages : 3
Sujets : 1
Inscription : Jul 2025
(Hier, 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
Messages : 424
Sujets : 0
Inscription : Jun 2024
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"
Merci André  ,
Routeur V17.19 (since V2.01) / Source UxI / 5 actions
Si les réponses que je propose bénévolement sur ce forum ne vous plaisent pas, ignorez-les simplement sans me jeter la pierre ! (Ou ne posez pas de question)
Messages : 3
Sujets : 1
Inscription : Jul 2025
(Hier, 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 ?
|