Note de ce sujet :
  • Moyenne : 0 (0 vote(s))
  • 1
  • 2
  • 3
  • 4
  • 5
Commander un relais Wi-Fi sous ESPHome via le GPIO externe du routeur. Possible ?
#1
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
Répondre

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

#3
Le -H ?? Et potentiellement un / devant switch
Répondre

#4
Le routeur fait un GET et non pas un POST.

André
Répondre

#5
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é Smile ,
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)
Répondre

#6
(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
Répondre

#7
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é Smile ,
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)
Répondre

#8
(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 ?
Répondre



Atteindre :


Utilisateur(s) parcourant ce sujet :
1 visiteur(s)

Moteur MyBB, © 2002-2026 Melroy van den Berg.