Retour d'expérience : Un switch WiFi à moins de 7 €
Publié : 12 févr. 2017, 16:45
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)
Le Wifi semble très stable, et la portée excellente !
- 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
}