Je vous présente un petit montage simple à quelques Euros qui permet de remonter sur la boite eedomus l’information si la porte du garage est ouverte ou fermée, et de commander son ouverture/fermeture toujours depuis la eedomus.
Cette solution se base sur le matériel suivant
• Un module "NodeMCU, ESP8260", acheté sur Wish pour 3 Euros
• Un relais et un capteur d’inclinaison, pour Arduino, acheté aussi sur Wish pour 2 Euros
• Une alimentation USB (que j’avais déjà)
Prérequis: le circuit "NodeMCU ESP8260" fonctionne par Wifi, et donc, il faut une couverture Wifi dans le garage.
Le montage hardware
Pour mettre en route l’environnement de développement, je me suis basé sur les mini tutos que vous trouverez à cette adresse :
https://easycoding.tn/index.php/nodemcu/
La mise en œuvre est simple et rapide : en moins d’une heure, je pouvais déjà actionner la led interne du NodeMCU, et une heure plus tard, je pouvais faire la même chose, mais par Wifi. Bref, c’est un module assez impressionnant.
Voici le schéma, relativement simple, qui montre donc comment le relais et le capteur d’inclinaison sont connectés au NodeMCU :
Alimenté en 5V par le port USB, Consommation: moins de 0.1W
I/O Pin usage:
Relais 13= Pin D7
Sensor 4= Pin D2
J’ai mis tout cela dans une petite boite, les circuits étant fixés sur un petit morceau de lino. Pour le boitier de mon prochain montage, je négocierai avec mon fils quelques legos !
Et quelques photos, l’installation montée dans mon garage
Porte fermée, on voit le capteur contre la porte, et la petite boite sur l’étagère
Le module sur l’étagère. Le cable rouge/noir va vers le capteur sur la porte, le cable blanc sur l’entrée du système d’ouverture/fermeture du garage, et enfin, on distingue encore le petit chargeur USB, pour alimenter le module
Le programme du NodeMCU
Il vous faudra modifier ce programme ainsi
• Fixer vos informations WiFi : adresse IP, gateway et subnet, SSID et mot de passe
• Fixer vos codes api_user et api_secret (voir la section « Configuration eedomus »)
• A regarder, j’ai mis des XXX ou YYY là où il faut adapter
Quelques informations sur ce programme. Bien sûr, tout peut être modifié à votre guise
• Le module est programmé pour attendre 10s lorsqu’un changement a lieu. Cela permet à ma porte de garage de changer de position, au capteur d’inclinaison de se stabiliser, pour ne pas remonter des notifications intermédiaires, inutiles
• Dès que le capteur détecte un changement, il envoie la notification sur l’API de la eedomus.
• Si vous fermez le garage, par une commande eedomus, l’état sera « Ferme le garage » pendant 10 secondes, ensuite, le module enverra une notification « Garage fermé », et donc, l’état passera à « Garage fermé »
• Relais: mon garage fonctionne ainsi : S’il est ouvert, une impulsion le ferme et s’il est fermé, une impulsion l’ouvre. J’ai programmée une impulsion de 0.5 sec pour actionner la porte du garage. Vous pouvez évidemment faire plus long ou plus court. Mais 0.5 sec correspond bien à une pression courte sur un bouton pression
• Pour tester le module sans la boîte eedomus, il suffit d’entrer dans un Explorer : http://192.168.0.XX/OuvreLaPorte ou http://192.168.0.XX/FermeLaPorte
La configuration eedomus
1) Création d'un actionneur HTTP
• Nom: Porte Garage Actionneur
• Pièce: Aucune
• Usage: Ouverture
• Avec 2 états: 0: Ouvre le garage ; 1: Ferme le Garage
• Sur "Ouvre le garage", placer l'URL suivante: http://192.168.0.40/OuvreLaPorte
• Sur "Ferme le garage" placer l'URL suivante: http://192.168.0.40/FermeLaPorte
Il faut ensuite aller dans « Paramètres Experts » et cliquer sur la clé située à côté de « Code API ». Le système vous demande alors votre mot de passe eedomus, et vous donne deux informations qu’il faut noter
api_user : XXXXXX (6 caractères)
api_secret : YYYYYYYYYYYYYYYY (16 caractères)
2) Création d'un état virtual
• Nom: Porte Garage NodeMCU
• Pièce: Extérieur
• Avec 4 états: 0: Garage Ouvert (état); 1: Garage Fermé (état); 2: Ouvre le garage (action); 3: Ferme le garage (action)
• Fixer les icones "Garage ouvert" et "Garage Fermé", sur les deux états
• Sur "Ouvre le garage (action)", mettre comme action associée "Porte garage - Ouvre le garage"
• Sur "Ferme le garage (action)", mettre comme action associée "Porte garage - Ferme le garage"
Le code
- Code : Tout sélectionner
//Open/Close Garage door
//Provide status, Open or closed
//Version 1.0
//CEN, November 2017
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
//////////////////////////////////////////////////////////////
//For debug purpose, compiler commands
//#define DEBUG //Comment this line to remove all debug lines
#ifdef DEBUG
#define DEBUG_PRINT(x) Serial.print(x)
#define DEBUG_PRINTLN(x) Serial.println(x)
#else
#define DEBUG_PRINT(x)
#define DEBUG_PRINTLN(x)
#endif
const char* ssid = "XXX"; //WiFi ID
const char* password = "XXX"; //WiFi PWD
int DoorState = 0; //0=Ouvert, 1=Fermé
int Door; //Will contain the sensor state
HTTPClient http; //Declare an object of class HTTPCLient
int httpCode;
String httpError;
//I/O Pin usage
int RelayPin = 13; //13= Pin D7, Relay
int SensorPin = 4; //4= Pin D2, Sensor
//eedomus information
//const char* IP_Eedomus = "192.168.0.XX";
//const char* PeriphID_Eedomus = "XXXXXX";
//api_user=XXXXXX
//api_secret=XXXXXXXXXXXXXXXX
//Command to be sent to the eedomus to notify that the garage door is opened, value=0 to open, value=1 to close
const char* GO= "http://192.168.0.XX/api/set?action=periph.value&periph_id=XXXXXX&value=0&api_user=XXXXXX&api_secret=XXXXXXXXXXXXXXXX";
const char* GF= "http://192.168.0.XX/api/set?action=periph.value&periph_id=XXXXXX&value=1&api_user=XXXXXX&api_secret=XXXXXXXXXXXXXXXX";
//Static IP, Gateway and Subnet
IPAddress staticIP (192,168,0,XX);
IPAddress gateway (192,168,1,1);
IPAddress subnet(255,255,255,0);
//Start server
WiFiServer server(80);
void setup() {
Serial.begin(115200); delay(10);
//Setup pin 12 & 13
pinMode(SensorPin, INPUT);
pinMode(RelayPin, OUTPUT);
digitalWrite(RelayPin, LOW);
// Connect to WiFi network
DEBUG_PRINTLN("");DEBUG_PRINT("Connecting to WIFI Network ");DEBUG_PRINTLN(ssid);
WiFi.disconnect();
WiFi.begin(ssid, password);
while (WiFi.status() != WL_CONNECTED) { delay(300); DEBUG_PRINT("."); }
WiFi.config(staticIP, gateway, subnet);
WiFi.hostname("ThierryNodeMCUGarage");
DEBUG_PRINTLN("");
DEBUG_PRINT("Connected to WIFI ");DEBUG_PRINTLN(ssid);
DEBUG_PRINT("My IP Address: ");DEBUG_PRINTLN(WiFi.localIP());
DEBUG_PRINT("My Gateway: ");DEBUG_PRINTLN((WiFi.gatewayIP().toString().c_str()));
DEBUG_PRINT("My hostname: ");DEBUG_PRINTLN(WiFi.hostname());
// Start the server
server.begin();
DEBUG_PRINTLN("Server started");
// Print the IP address
DEBUG_PRINT("Use this URL to connect: "); DEBUG_PRINT("http://"); DEBUG_PRINT(WiFi.localIP()); DEBUG_PRINT("/");DEBUG_PRINTLN("OuvreLaPorte");
DEBUG_PRINT("Use this URL to connect: "); DEBUG_PRINT("http://"); DEBUG_PRINT(WiFi.localIP()); DEBUG_PRINT("/");DEBUG_PRINTLN("FermeLaPorte");
}
void loop() {
// Check if a client has connected
WiFiClient client = server.available();
//Client has connected. Treat request
if (client) {
DEBUG_PRINTLN("New connection");
// Read the first line of the request
String request = client.readStringUntil('\r');
DEBUG_PRINTLN(request);
client.flush();
// Match the request, for both request (close or open), close the relay for 500ms
if (request.indexOf("/OuvreLaPorte") != -1) {
DEBUG_PRINTLN("Ouvre la porte");
digitalWrite(RelayPin, HIGH);
delay(500);
digitalWrite(RelayPin, LOW);
}
if (request.indexOf("/FermeLaPorte") != -1) {
DEBUG_PRINTLN("Ferme la porte");
digitalWrite(RelayPin, HIGH);
delay(500);
digitalWrite(RelayPin, LOW);
}
client.println("HTTP/1.1 200 OK"); //Acknoledge command. Without that, eedomus keeps sending the command
delay(10000); //Wait that the garage door is fully opened or closed, ignore all during 10sec
} //if (client)
//Pull Sensor
Door=digitalRead(SensorPin); //Read the sensor
//If the captor returns a different value of the DoorState, send the info to the eedomus
if (Door != DoorState) {
DEBUG_PRINT("Sensor= ");DEBUG_PRINTLN(Door);
switch (Door) {
case 0:
http.begin(GO);
httpCode = http.GET();
if (httpCode > 0) {
httpError= http.getString();
DEBUG_PRINTLN(httpError);
}
DoorState=0;
break;
case 1:
http.begin(GF);
httpCode = http.GET();
if (httpCode > 0) {
httpError= http.getString();
DEBUG_PRINTLN(httpError);
}
DoorState=1;
break;
default:
DEBUG_PRINT("Error, capteur returns "); DEBUG_PRINTLN(Door);
break;
} //switch (Door)
delay(10000); //Ignore all during 10sec
} //if (Door != DoorState)
delay(1); //Wait 1 before next loop
}
Conclusions
Ce circuit NodeMCU est vraiment impressionnant. Il se programme comme un Arduino, offre des possibilités énormes, et cela pour quelques euros. Ca fait « montage maison » dans mon boitier transparent, comparé à une installation du commerce, mais ce montage remplace deux modules z-waves, nécessaire pour créer un tel système (Fibaro capteur d’inclinaison et un actionneur pour faire fonctionner le moteur de la porte du garage). J’ai été agréablement surpris de pouvoir faire un montage en quelques heures de travail seulement!
Ce circuit permet vraiment de songer à tout type de module maison. Ma prochaine idée est de fabriquer un haut-parleur télécommandé par la eedomus, capable de jouer des sons MP3 préenregistrés (aboiements, alarme, message de bienvenue, …).
Avez-vous d’autres idées ?