Page 1 sur 1

Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 28 mai 2019, 15:10
par ttoni0
Bonjour,

Je ne sais pas si je poste au bon endroit, bref je me lance...

Je dispose d'une Wemos D1 mini, d'un relay shield et d'un button shield sur un tripleur.
Le but des opérations ? Domotiser un interrupteur de plafonnier, avec un contrôle dans domoticz (dummy device) ET un contrôle physique (button shield).
Je me suis basé sur ce sketch : viewtopic.php?t=3530
Je l'ai modifié pour gérer le bouton :

code :

#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();

const unsigned int inputPin = D3; // pushbutton connected to digital pin D3
int val = 0; // variable to store the read value

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

//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_01");
WiFi.mode(WIFI_STA); //neccesary?
WiFi.begin(ssid,pass);

pinMode(relayPin,OUTPUT);

pinMode(inputPin, INPUT); // set pin as input

digitalWrite(relayPin,HIGH);
Serial.println("Relay => OFF !");

digitalWrite(inputPin,LOW);

//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();
val = digitalRead(inputPin); // read the input pin
handleToggle();
}

//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>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(){
if (val== LOW) {
delay(250);
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
}




Tout fonctionne, l'interface web, Siri, etc... Là où ça coince c'est quand j'appuie sur le bouton. Le relais change bien d'état mais le "dummy device" ne se met pas à jour. En clair je souhaite que domoticz et mon bouton soient "connectés".

Ma première question : est-ce réalisable simplement (comme vous avez pu voir je suis newbie en programmation...)?
Ensuite, il y a la fonction "void setstate()" y aurait pas quelquechose à faire avec ça ?

Voilà, merci pour votre aide...

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 29 mai 2019, 12:00
par adv
Salut, c'est ptet bête ce que je vais dire, mais t'as jeté un œil du coté d'espeasy, c'est infiniment moins prise de tête...

Un simple rule de quelques lignes te ça fait le job, le reste se configure en "web".

A+

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 29 mai 2019, 16:13
par Jeff
+1

Je m'étais abstenu de le dire en 1ère lecture...

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 30 mai 2019, 07:27
par ttoni0
J'ai tenté d'explorer la voie "ESPEasy" mais je ne parviens pas à flasher ma wemos : le Flasher ne trouve pas le bon port com sur mon pc et comme je bosse sur Mac (ESPEasy sur Mac, c'est pas la sinécure...).
Si quelqu'un peut gentillement m'indiquer un tuto pour flasher ma wemos (sur Mac ou pc tant que c'est pas traduit par un portugais qui a appris le français avec un russe...) d'avance merci.
ESPEasy me semble complexe à mettre en oeuvre.
De plus, j'ai cru comprendre qu'il y avait des problèmes avec les relay shields, est-ce vrai ?

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 30 mai 2019, 10:06
par Jeff
Regarde ici, tu as plein d'articles et plein de méthode pour flasher.
https://projetsdiy.fr/category/esp8266/espeasy-esp8266/

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 31 mai 2019, 08:42
par adv
Surement un problème de driver, tu es allé voir dans le gestionnaire de périphérique quel port COM il prenait ?

Flasher ESPeasy est un jeu d'enfants, quand à la config tu te trompes, c'est vraiment facile, à 1000 lieux de tes dizaines de lignes de code (qui reste néanmoins bien compréhensible).

Retente, ça vaut le coût !

Re: Remontée d'état Wemos D1 mini + relay shield + button shield

Publié : 31 mai 2019, 12:55
par andpierard
Tout fonctionne, l'interface web, Siri, etc... Là où ça coince c'est quand j'appuie sur le bouton. Le relais change bien d'état mais le "dummy device" ne se met pas à jour. En clair je souhaite que domoticz et mon bouton soient "connectés".

Ma première question : est-ce réalisable simplement (comme vous avez pu voir je suis newbie en programmation...)?
Ensuite, il y a la fonction "void setstate()" y aurait pas quelquechose à faire avec ça ?
Bonjour,
Je ne suis pas sûr d'avoir bien compris le problème mais j'ai eu un souci similaire entre des dummy devices dans domoticz et des relais. Quand un relais est actionné par un bouton poussoir, le dummy device corrspondant ne peut pas savoir que l'état du relais a changé.Il faut donc génèrer la commande de changement d'état. Dans mon cas, j'utilise des commandes json encapsulées dans MQTT comme ceci :
{
"idx" : 17,
"name" : "Hall entree Ancien",
"nvalue" : 0

}
où idx = l'identifiant du dummy device dans domoticz et nvalue = 0 pour off et 1 pour on.
Je ne sais pas si une remontée d'état est simple dans votre architecture, j'ai du quand même pas mal ramerpour y arriver
Courage,
André