Page 1 sur 2
Retour d'état carte wemos
Publié : 22 juin 2021, 19:11
par Postel_nicolas
Bonjour
Je viens de réaliser mon premier module avec une carte wemos mini d1 pour un capteur de température et le contrôle d'un relais pour une pompe de piscine.
J'ai réussi à intégrer les 2 à domoticz, par contre je n'ai pas de retour d'état du relais de la pompe,
Si je redémarre la carte wemos mon relais retombe à 0 par default alors que domoticz le voie à 1, il y t il un script qui me permet de récupérer l'état du relais ou alors de demander à domoticz de renvoyer la commande soit 0 ou 1 par html toutes les x minutes ?
En vous remerciant d'avance
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 21:00
par Chrominator
C'est le Wemos qui commande le relais, donc c'est à lui que revient le rôle d'envoyer la bonne information à DZ.
Avec quel firmware a-t-il été chargé ?
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 21:25
par Postel_nicolas
Bonjour Chrominator
Tout a été codé via le logiciel arduino.
Dans domoticx j ai créé un interrupteur virtuel pour le relais de la pompe (en dummy) pour pouvoir planifier les horaires de mise en route, mais si pendant la période de fonctionnement il se passe une coupure de courant ou autre sur la carte wemos, celle ci en redémarrant laisse le relais inactif alors que pour domoticz la pompe est en route.
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 21:43
par Chrominator
Visiblement le code a été conçu par quelqu'un d'autre.
Il faudrait programmer le Wemos pour transmettre à DZ l'état du relais, notamment au redémarrage après une coupure de courant.
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 21:47
par Jieffe
Sur le Wemos, tu peux lire le statut de ton relais (au démarrage ou lors d'un changement d'état) et le communiquer à Domoticz
Un code genre :
Puis tu l'envoies à Domoticz via JSON ou MQTT
Il serait plus simple de te donner un exemple si tu précisais les libraires employées ou si tu postais ton code.
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 21:51
par Postel_nicolas
Bonjour Jieffe
Voici ci dessous le code du programme
Ceux sont des morceaux de code trouver sur le net que j 'ai adapté à mon utilisation
Code : Tout sélectionner
//
#include <ESP8266WiFi.h>
#include <WiFiClient.h>
#include <ESP8266WebServer.h>
#include <OneWire.h>
#include <Arduino.h>
#include <ESP8266HTTPClient.h>
// Définition des constantes reseau wifi
#ifndef STASSID
#define STASSID "xxxxxxxxx" // ssid resau wifi
#define STAPSK "xxxxxxxx" // mot de passe wifi
#endif
const char* ssid = STASSID;
const char* password = STAPSK;
//
#include <WiFiClient.h>
WiFiClient wifiClient;
//Adresse Ip/port du serveur domoticz
#define DOMOTICZ_IP "192.168.1.111"
#define DOMOTICZ_PORT (8080)
//idx du device virtuel domoticz qui représente le capteur de temperature
#define DEVICE_IDX 02
////////////////////////////////////////////////////// Variables relatives à Domoticz
char *sDomoticzIp = DOMOTICZ_IP;
int iDomoticzPort = DOMOTICZ_PORT;
HTTPClient oDomoticzClient;
String osUrl = ""; //Pour construire l'URL JSON d'envoi des données à domoticz
// ATTRIBUTION PIN et autre AUTRES
const int led = BUILTIN_LED;
const int relayPin = D5;
//int relais = D4; // RELAIS = la broche D4 devient relais
int mforce = D1; // MARCHE FORCE = la broche D1 devient mforce
int etatboutonmforce; // variable qui enregistre l'état du bouton marche force
int mauto = D5; // MARCHE AUTO = la broche D2 devient mauto
int etatboutonmauto; // variable qui enregistre l'état du bouton marche auto
int ledwifi = D6; // LED WIFI CONNECTE = la broche D5 devient ledwifi
int temperature; // variable qui enregistre la temperature de l'eau
int compteur=0; // variable qui met à 0 la valeur compteur
//
// SONDE DS18B20,Temperature
OneWire ds(D4); // on pin D3 (AVEC RESISTANCE DE 4.7KOHM)
//
// Le serveur Web "ecoute" sur le port 80 (port HTTP par défaut)
ESP8266WebServer server(80);
//
/****************************************************************************/
void handleRoot() {
//// MESURE DE LA TEMPERATURE
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr))
{
ds.reset_search();
delay(1);
return;
}
if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(1000);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}
// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" °C");
temperature = celsius;
int val;
// Lecture de l'état du relais
val = digitalRead(relayPin);
// En-tête et titre de la page
String s = "<!DOCTYPE HTML>\r\n<html><head><title>MODULE GESTION PISCINE ";
s += (val)?"ON":"OFF"; // Affiche ON ou OFF selon l'état du relais
s += "</title></head><body style=\"";
s += "margin:auto; background-color:white; width:100%;\">\r\n";
s += "<h1 style=\"text-align:center; font-size:300%;\">MODULE GESTION PISCINE</h1>\r\n";
// Bouton ON / OFF
s += "<br/><br/><div><a style=\"display:block; height:70px; background-color:";
s += (val)?"green":"red"; // La couleur du bouton change selon l'état du relais
s += "; color:white; text-align:center; padding:20px; margin:20px; font-size:300%; text-decoration: none;\" href=\"http://";
s += WiFi.localIP().toString();
s += "/setgpio/";
s += (val)?"0":"1";
s += "\">Relais pompe piscine</a></div>\r\n";
s += "<p style=\"margin:20px;\">Temperature de l'eau : ";
s += celsius;
s += " degres Celcius";
s += " </p>";
s += " </br>";
// Informations de connexion (SSID et force du signal)
s += "<p style=\"margin:20px;\">Connecté à : ";
s += ssid;
s += " - Force du signal : ";
long rssi = WiFi.RSSI();
s += rssi;
s += " dBm</p>";
s += "</body></html>\n";
// Envoie de la page (Le code HTTP 200 indique que la requête a été traitée avec succès
server.send(200, "text/html", s);
}
/****************************************************************************/
void handleNotFound() {
digitalWrite(led, 1);
String message = "File Not Found\n\n";
message += "URI: ";
message += server.uri();
message += "\nMethod: ";
message += (server.method() == HTTP_GET) ? "GET" : "POST";
message += "\nArguments: ";
message += server.args();
message += "\n";
for (uint8_t i = 0; i < server.args(); i++) {
message += " " + server.argName(i) + ": " + server.arg(i) + "\n";
}
server.send(404, "text/plain", message);
digitalWrite(led, 0);
}
/****************************************************************************/
void setup(void) {
IPAddress ip(192, 168, 1, 120); // ip fixe
IPAddress dns(192, 168, 1, 1); // ip fixe
IPAddress gateway(192, 168, 1, 1); // ip fixe
IPAddress subnet(255, 255, 255, 0); // ip fixe
WiFi.config(ip, dns, gateway, subnet);
// Initialisation GPIO led et relais en sorties
pinMode(led, OUTPUT);
pinMode(relayPin, OUTPUT);
digitalWrite(led, HIGH);
digitalWrite(relayPin, LOW);
// Initialisation port série à 115 200 bauds
Serial.begin(115200);
// Connection au point d'accès WiFi
WiFi.mode(WIFI_STA);
WiFi.begin(ssid, password);
Serial.println("");
// Wait for connection
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
}
// Affichage des paramètres de connexion (point d'accès et IP obtenue par DHCP)
Serial.println("");
Serial.println("WiFi connected");
delay(500);
Serial.println("MODULE PISCINE");
delay(500);
Serial.print("Connected to ");
Serial.println(ssid);
Serial.print("IP address: ");
Serial.println(WiFi.localIP());
// Quand un client se connecte sur l'URL / on appelle la fonction handleRoot()
server.on("/", handleRoot);
Serial.print("Connection détéctée ");
// Quand un client se connecte sur l'URL /setgpio/1
server.on("/setgpio/1", []() {
digitalWrite(relayPin, HIGH); // Activation de relais
digitalWrite(led, 1);; // test avec led interne
handleRoot(); // appel de la fonction handleRoot()
Serial.print("RELAIS ON ");Serial.println("");
});
// Quand un client se connecte sur l'URL /setgpio/0
server.on("/setgpio/0", []() {
digitalWrite(relayPin, LOW); // Désactivation de relais
digitalWrite(led, 0);; // test avec led interne
handleRoot(); // appel de la fonction handleRoot()
Serial.print("RELAIS OFF ");Serial.println("");
});
// Si le client se connecte sur une URL non programmée
server.onNotFound(handleNotFound); // appel de la fonction handleNotFound()
// Démarrage du serveur
server.begin();
Serial.println("HTTP server started");
}
/****************************************************************************/
void loop(void) {
server.handleClient(); // Attente de la connexion d'un client
//// MESURE DE LA TEMPERATURE
byte i;
byte present = 0;
byte type_s;
byte data[12];
byte addr[8];
float celsius, fahrenheit;
if ( !ds.search(addr))
{
ds.reset_search();
delay(1);
return;
}
if (OneWire::crc8(addr, 7) != addr[7])
{
Serial.println("CRC is not valid!");
return;
}
Serial.println();
// the first ROM byte indicates which chip
switch (addr[0])
{
case 0x10:
type_s = 1;
break;
case 0x28:
type_s = 0;
break;
case 0x22:
type_s = 0;
break;
default:
Serial.println("Device is not a DS18x20 family device.");
return;
}
ds.reset();
ds.select(addr);
ds.write(0x44, 1); // start conversion, with parasite power on at the end
delay(500);
present = ds.reset();
ds.select(addr);
ds.write(0xBE); // Read Scratchpad
for ( i = 0; i < 9; i++)
{
data[i] = ds.read();
}
// Convert the data to actual temperature
int16_t raw = (data[1] << 8) | data[0];
if (type_s) {
raw = raw << 3; // 9 bit resolution default
if (data[7] == 0x10)
{
raw = (raw & 0xFFF0) + 12 - data[6];
}
}
else
{
byte cfg = (data[4] & 0x60);
if (cfg == 0x00) raw = raw & ~7; // 9 bit resolution, 93.75 ms
else if (cfg == 0x20) raw = raw & ~3; // 10 bit res, 187.5 ms
else if (cfg == 0x40) raw = raw & ~1; // 11 bit res, 375 ms
}
celsius = (float)raw / 16.0;
fahrenheit = celsius * 1.8 + 32.0;
Serial.print(" Temperature = ");
Serial.print(celsius);
Serial.print(" °C");
////////////////////////////////////////////Envoi des données à domoticz
//construit l'URL d'appel
osUrl = "/json.htm?type=command¶m=udevice&idx=" + String( DEVICE_IDX ) + \
"&nvalue=0&svalue=" + String( celsius );
//////////////////// Appel domoticz pour mettre a jour le capteur
if (compteur == 0)
{
int iResCallDomo = iEnvoiDomoticz( osUrl );
}
compteur = compteur + 1;
if (compteur == 120)
{compteur = 0;}
Serial.print(compteur);
}
/*====================================================================
* Fonction pour mettre a jour le capteur dans domoticz
* ==================================================================*/
int iEnvoiDomoticz( String osDomoUrl ){
int iRes = 0;
oDomoticzClient.begin( wifiClient,sDomoticzIp, iDomoticzPort, osDomoUrl );
int iHttpCode = oDomoticzClient.GET();
oDomoticzClient.end();
return iRes;
}
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 22:17
par Jieffe
Dans ton code, je ne vois qu'un seul IDX de Domoticz pour le capteur de température.
Je suppose que tu a créé dans Domoticz un capteur pour la température et un switch, et que ce dernier fonctionne en appelant l'URL de ton interface Web.
Dans ton programme arduino, tu dois définir un IDX supplémentaire correspondant à celui de ton switch dans Domoticz et éventuellement envoyer la requête d'état via une fonction.
Code : Tout sélectionner
#define DEVICE_IDX2 idx_de_ton_switch
[...]
void sendStatus(){
int RelayStatus = digitalRead(D5);
String theUrl = "/json.htm?type=command¶m=udevice&idx=" + String( DEVICE_IDX2 ) + "&nvalue= + RelayStatus ";
oDomoticzClient.begin( wifiClient, sDomoticzIp, iDomoticzPort, theUrl );
}
Et tu rajoutes la fonction sendStatus() à la fin de ta fonction Setup.
Re: Retour d'état carte wemos
Publié : 22 juin 2021, 22:58
par Postel_nicolas
Merci Jieffe, j'essaye ca dès demain, bonne soirée
Re: Retour d'état carte wemos
Publié : 23 juin 2021, 11:46
par Jieffe
J'ai testé ma solution, cela fonctionne avec :
Code : Tout sélectionner
void sendStatus(int stat) {
String theUrl = "/json.htm?type=command¶m=udevice&idx=" + String( DEVICE_IDX2 ) + "&nvalue=" + stat;
iEnvoiDomoticz(theUrl);
}
Tu déplaces la déclaration de variable "int val" en dessous de celles déclarés dans "// ATTRIBUTION PIN et autre AUTRES" (pour la faire passer en globale) et tu rajoutes 3 fois l'appel à la fonction "sendStatus" là :
Code : Tout sélectionner
// Quand un client se connecte sur l'URL / on appelle la fonction handleRoot()
server.on("/", handleRoot);
Serial.print("Connection détéctée ");
// Quand un client se connecte sur l'URL /setgpio/1
server.on("/setgpio/1", []() {
digitalWrite(relayPin, HIGH); // Activation de relais
digitalWrite(led, 1);; // test avec led interne
handleRoot(); // appel de la fonction handleRoot()
Serial.print("RELAIS ON "); Serial.println("");
sendStatus(val); // <------------------------------
});
// Quand un client se connecte sur l'URL /setgpio/0
server.on("/setgpio/0", []() {
digitalWrite(relayPin, LOW); // Désactivation de relais
digitalWrite(led, 0);; // test avec led interne
handleRoot(); // appel de la fonction handleRoot()
Serial.print("RELAIS OFF "); Serial.println("");
sendStatus(val); // <------------------------------
});
// Si le client se connecte sur une URL non programmée
server.onNotFound(handleNotFound); // appel de la fonction handleNotFound()
// Démarrage du serveur
server.begin();
Serial.println("HTTP server started");
sendStatus(0); // <------------------------------
P.S. Tu gagnerais un peu de lisibilité dans ton code en utilisant la libraire DallasTemperature pour lire ton capteur de temperature, en 2 lignes, ça le fait

Re: Retour d'état carte wemos
Publié : 23 juin 2021, 11:55
par Postel_nicolas
Bonjour Jieffe, j'ai justement de tester le 1er code ce matin , celui que tu m'a envoyé hier soir et ca marche parfaitement j'ai juste corrigé ces lignes
Code : Tout sélectionner
void sendStatus(){
int RelayStatus = digitalRead(D5);
String theUrl = "/json.htm?type=command¶m=udevice&idx=" + String( DEVICE_IDX2 ) + "&nvalue= + RelayStatus ";
oDomoticzClient.begin( wifiClient, sDomoticzIp, iDomoticzPort, theUrl );
}
Par
Code : Tout sélectionner
void sendStatus(){
int RelayStatus = digitalRead(D5);
String theUrl = "/json.htm?type=command¶m=udevice&idx=" + String( DEVICE_IDX2 ) + "&nvalue=" + RelayStatus ;
oDomoticzClient.begin( wifiClient, sDomoticzIp, iDomoticzPort, theUrl );
int iHttpCode = oDomoticzClient.GET();
oDomoticzClient.end();
Serial.print(theUrl);
}
Je vais regarder le code que tu viens de me donné,
pour la température ok je vais regarder ca aussi avec la libraire DallasTemperature
Merci