Page 1 sur 1

Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 12 févr. 2017, 16:45
par Doume
J'ai récemment mis en place un switch piloté par WiFi, à base de Wemos D1 mini
- Un module Wemos D1 mini ( 4,25 € )
- Un module relais ( 2,5 € )

Depuis Domoticz, j'ai déclaré un interrupteur, et j'ai configuré comme suit :
Action on : http://ip_module/relay/on
Action off : http://ip_module/relay/off

Bien sûr j'ai flashé un sketch arduino adapté dans le module Wemos (inspiré du code 'lighthouse' de Sommerhack sur Github)

Code : Tout sélectionner

#include <Arduino.h>

#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <ESP8266mDNS.h>

//Function declarations:
void handleRoot();
void handleOn();
void handleOff();
void handleToggle();
void handleNotFound();

//WIFI SETTINGS:
const char* ssid     = "SSID_de_votre_reseau_Wifi";
const char* pass     = "le_mot_de_passe";

//init http server on port 80:
ESP8266WebServer server(80);

//hardware stuff:
const unsigned int relayPin = D1;
//const unsigned int relayPin = BUILTIN_LED;
bool lightState=false; // True=on , false=off


void setup() {
  Serial.begin(115200);
  WiFi.hostname("Relais_80");
  WiFi.mode(WIFI_STA); //neccesary?
  WiFi.begin(ssid,pass);
  
  pinMode(relayPin,OUTPUT);
  
  digitalWrite(relayPin,LOW);
  Serial.println("Relay => OFF !");

  //Let WiFi become stable
  delay(500);

  Serial.print("Waiting for WiFi connected : ");
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println();
  Serial.print("WiFi up!");
  Serial.print("  IPv4: ");
  Serial.println(WiFi.localIP());

  if (MDNS.begin("Relais_80")) {
    Serial.println("MDNS responder started");
  }

//Connect callbacks on http requests
  server.on("/relay", handleRoot);
  server.on("/relay/on", handleOn);
  server.on("/relay/off", handleOff);
  server.on("/relay/toggle", handleToggle);
  server.onNotFound(handleRoot);

  server.begin();
  Serial.println("HTTP server started");

}


void loop() {
	server.handleClient();
	yield();
}

//http server:
// Differents callbacks appelés par Webserver suivant requête

void handleRoot() {
  Serial.println("client request on /relay");
  //server.send(200, "text/plain", "hello from esp8266!");
  server.sendContent("HTTP/1.1 200 OK\r\n"); //send new p\r\nage
  server.sendContent("Content-Type: text/html\r\n");
  server.sendContent("\r\n");
  server.sendContent("<HTML>\r\n");
  server.sendContent("<HEAD>\r\n");
  server.sendContent("<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">"); //zoom to width of window
  server.sendContent("<meta name='apple-mobile-web-app-capable' content='yes' />\r\n");
  server.sendContent("<meta name='apple-mobile-web-app-status-bar-style' content='black-translucent' />\r\n");
  server.sendContent("<link rel='stylesheet' type='text/css' href='https://moore.dk/doorcss.css' />\r\n"); //External CSS
  server.sendContent("<TITLE>Doume relais on/off</TITLE>\r\n");
  server.sendContent("</HEAD>\r\n");
  server.sendContent("<BODY>\r\n");
  if(lightState) 
     server.sendContent("<H1>Relais est ON.</H1>\r\n");
  else 
     server.sendContent("<H1>Relais est OFF.</H1>\r\n");
  server.sendContent("<hr />\r\n");
 // server.sendContent("<H2>vBatt: ");
 // server.sendContent(String(vBatt));
 // server.sendContent("</H2>\r\n");
  server.sendContent("<br />\r\n");
  server.sendContent("<br />\r\n");
  server.sendContent("<a class=\"red\" align=left href=\"/relay/off\"\">Forcer OFF</a>");
  server.sendContent("<a  align=right href=\"/relay/on\"\">Forcer ON</a>\r\n");
  server.sendContent("<br />\r\n");
  server.sendContent("<br />\r\n");
  server.sendContent("<hr />\r\n");
  server.sendContent("<br />\r\n");
  if(lightState) 
     server.sendContent("<a class=\"red\" href=\"/relay/toggle\"\">Commuter sur OFF !</a>\r\n");
  else 
     server.sendContent("<a href=\"/relay/toggle\"\">Commuter sur ON!</a>\r\n");
  server.sendContent("<br />\r\n");
  server.sendContent("</BODY>\r\n");
  server.sendContent("</HTML>\r\n");
}

void handleOff(){
  Serial.println("client request on /relay/off");
  lightState=false;
  setstate();
}

void handleOn(){
  Serial.println("client request on /relay/on");
  lightState=true;
  setstate();
}

void handleToggle(){
  Serial.println("client request on /relay/toggle");
	lightState=!lightState;
  setstate();
}

void setstate(){
  if(lightState)	
  {
    digitalWrite(relayPin,HIGH);
	  Serial.println("relay on..");
  } else {
    digitalWrite(relayPin,LOW);
	  Serial.println("relay off..");
  }
    
  //reply to client with redirect to root, to update status of light in browser
  server.sendContent("HTTP/1.1 303 See Other\r\n");
  server.sendContent("Location: /relay\r\n");
  server.sendContent("\r\n"); //EOT
}
Le Wifi semble très stable, et la portée excellente !

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 12 févr. 2017, 20:06
par Ninipc
Y-a-t'il un intérêt à utiliser un sketch comme celui-ci plutôt que mettre ESP easy? Sur un Wemos s'entend, sur un ESP01 limité en mémoire c'est ptet effectivement mieux.

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 12 févr. 2017, 21:08
par Neutrino
J'ai réalisé un montage de ce style : viewtopic.php?f=7&t=1507
Niveau stabilité, j'ai un uptime de 86 jours alors qu'il a enduré quelques températures négatives.
Comparé à un IPX800, la tarif est imbattable :D

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 13 févr. 2017, 10:42
par Doume
Ninipc a écrit :Y-a-t'il un intérêt à utiliser un sketch comme celui-ci plutôt que mettre ESP easy? Sur un Wemos s'entend, sur un ESP01 limité en mémoire c'est ptet effectivement mieux.
Le sketch ESPeasy ne semble contenir aucun plugin pour gérer un relais.
C'était mon intention au début, car ESPeasy contient tout ce qu'il faut pour faire des remontées d'état ( MQTT ou http client) , mais pas trouvé de solution.

Je vais peut-être essayer d'intégrer mon bout de code dans ESPeasy, mais ce dernier est un peu compliqué....

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 13 févr. 2017, 11:02
par Doume
De l'intérêt de ce forum..... :
@Neutrino semble avoir résolu la question de ESPeasy et des relais ! (merci pour le tuto)
Le plugin C01 semble traiter cet aspect, c'est une question de configuration.

Me reste à essayer de mettre ça en oeuvre, car ESPeasy a plusieurs avantages :
- Remontée d'infos
- Accès normalisé via requêtes Json
- Mises à jour OTA

A suivre

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 13 févr. 2017, 11:52
par ericd
Bonjour Doume

Je suis aussi sur cette problématique et je cherche aussi à faire ça...
Je pense que ça va être ta prochaine étape....

https://easydomoticz.com/forum/viewtopi ... =24&t=3423

@+
Eric

Re: Retour d'expérience : Un switch WiFi à moins de 7 €

Publié : 13 févr. 2017, 12:44
par Doume
Ben voilà, opération réussie :

- Mise en place ESPeasy sur la Wemos
Il m'a fallu un moment pour comprendre pourquoi je ne pouvais pas associer mon relais (pré-cablé sur un shield) avec le GPIO-5, à savoir D1
En effet, ce choix était grisé lors de la config du switch
En fait, c'est parce que dans la config générale 'Hardware' de ESPeasy, le GPIO-5 était associé à 'SCL', donc inutilisable pour les plugins.
J'ai associé SCL au GPIO-16, et j'ai pu configurer mon switch avec le GPIO-5

Côté Domoticz, mon switch a été configuré avec :
Action on : http://IP_ESPeasy/control?cmd=GPIO,5,1
Action off : http://IP_ESPeasy/control?cmd=GPIO,5,0

Dans ESPeasy, j'ai activé le protocole MQTT (adresse IP du broker, port) et coché la case 'Send data' dans la config switch, et le module remonte vers Domoticz l'état du relais, d'après le log :

Code : Tout sélectionner

SW   : GPIO 5 Set to 1
SW   : State 1
{"idx":64,"command":"switchlight","switchcmd":"On"}
../..
Mais Domoticz ne semble pas interpréter ce message MQTT (et modifier l'état) si le basculement est fait de manière externe (hors Domoticz)
EDIT : Par moment, je mérite des baffes ! le 'matériel' MQTT Broker était inactif dans Domoticz !
En fait, le protocole MQTT fonctionne !


Par contre, si j'utilise le protocole Domoticz HTTP, ça fonctionne :
Tout changement d'état commandé extérieurement à Domoticz est répercuté sur le dispositif Domoticz :

Code : Tout sélectionner

W   : GPIO 5 Set to 0
SW   : State 0
HTTP : connecting to 192.168.2.31 using port 8080
HTTP : Success
HTTP : closing connection
Merci encore @Neutrino ! ;)