Communication ESP32 - Domoticz - Boucle dans code -- RESOLU

Bonjour,
Finalement j’ai pu revoir complétement mon code qui maintenant parait plus “clean”. Je retire donc mes impressions précédentes sur les besoins de passer par “l’usine à gaz”.

BIEN CORDIALEMENT.
ETIENNE - 73290

//Communication WIFI  ESP32-avec capteur DHT22 - Domoticz 
#include <WiFi.h>
#include <HTTPClient.h>
#include <DHT.h>

#define DHTTYPE   DHT22       // DHT type (DHT11, DHT22)
#define DHTPIN    27          // Broche du DHT / DHT Pin

const char* ssid     = "XXXXXXX";
const char* password = "YYYYYYYY";
const char* host = "192.168.t.u";
const int   port = vv;
const int   watchdog = 5000; // Fréquence d'envoi des données à Domoticz - Frequency of sending data to Domoticz
unsigned long previousMillis = millis(); 

DHT dht(DHTPIN, DHTTYPE);
HTTPClient http;

void setup() {
  Serial.begin(115200);
  delay(10);
  
  Serial.setDebugOutput(true);  
  Serial.println("Connecting Wifi...");

  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print("bof--");
  }
   
  Serial.println("");
  Serial.println("WiFi connected");
  Serial.println("IP address: ");
  Serial.print(WiFi.localIP()); 
  dht.begin();
}

int value = 0;

void loop() {
  unsigned long currentMillis = millis();

  if ( currentMillis - previousMillis > watchdog ) {
    previousMillis = currentMillis;

    if(WiFi.status() != WL_CONNECTED) {
      Serial.println("WiFi not connected !");
    } else {  
      Serial.println("Send data to Domoticz");
      
      float t = dht.readTemperature();
      float h = dht.readHumidity();
      
      if ( isnan(t) || isnan(h) ) {
      Serial.println("DHT KO");   } else { Serial.print(F("Humidity: ")); Serial.print(h); Serial.print(F("%  Temperature: ")); Serial.print(t); Serial.println(F("°C ")); }

        String url = "/json.htm?type=command&param=udevice&idx=20&nvalue=0&svalue="; 
        url += String(t); url += ";";
        url += String(h); url += ";";
        url += 0;
        sendDomoticz(url); 
      }   
    }
  }

void sendDomoticz(String url){
  Serial.print("connecting to ");
  Serial.println(host);
  Serial.print("Requesting URL: ");
  Serial.println(url);

  String complete_url = "http://";
  complete_url += String(host);
  complete_url += ":";
  complete_url += String(port);
  complete_url += String(url); 
  http.begin(host,port,url);
  int httpCode = http.GET();
    if (httpCode) {
      if (httpCode == 200) {
        String payload = http.getString();
        Serial.println("Domoticz response "); 
        Serial.println(payload);
      }else{
        String payload = http.getString();
        Serial.println("Domoticz not response ");
        Serial.println(String(httpCode));
        Serial.println(complete_url);
      }
    }
  Serial.println("closing connection");
  http.end();
}

Hello

Le password de la box : à éviter. Remplacer par XXXXXXXXXXXX

C'est complexe. Pourquoi faire la lecture du DHT dans une tâche et l'envoi des données dans la loop() ?

La loop est appelée en boucle, donc cela ne m'étonne pas que l'envoi soit fait en rafale.
Ensuite tasksEnabled est mis à UN et la tâche tempTask est lancée, puis elle se suspend jusqu'à ce qu'elle soit relancée par le Ticker.
La tâche ne fait que la lecture du DHT, mais elle est aussi faite dans la loop() ! ! !
Usine à gaz ...

Tout pourrait être fait dans la loop() :

 void loop() {
  TempAndHumidity newValues = dht.getTempAndHumidity();
  send(msgTemp.set(newValues.temperature,1));
  send(msgHum.set(newValues.humidity,1));

  delay(10000);  // ou mieux avec millis()
}

Et mettre à la poubelle cette tâche et tout ce qui va autour.

Un code MySensors DHT11 devrait ressembler à ceci :

Les avantages

  • envoi température et humidité seulement s'il y a changement
  • envoi forcé si pas de changement pendant une période donnée (voir FORCE_UPDATE_N_READS)
  • gestion des erreurs DHT11
  • intervalle de mesure : 60 minutes (personnellement j'utilise 15 minutes)

L'appel à sleep() endort le µC. Je ne sais pas si cela fonctionne sur ESP32. A essayer.

Bonjour,

Ci dessous une mise à jour du sketch qui fonctionne bien entre ESP32 et domoticz.

Ce n’est sans doute pas la solution la plus harmonieuse, mais elle a me mérite de fonctionner.
Je suis preneur d’une solution plus élégante.

Merci à Henri pour ses réponses
Bien cordialement

Etienne

#include "DHTesp.h"
#include "Ticker.h"
//**************************************************************
#define MY_DEBUG
#define MY_GATEWAY_ESP32
#define MY_WIFI_SSID "XXXXXXXXXX"
#define MY_WIFI_PASSWORD "PPPPPPPPPP"     
#define MY_IP_ADDRESS 192,168,1,75    
#define MY_IP_GATEWAY_ADDRESS 192,168,1,1
#define MY_IP_SUBNET_ADDRESS 255,255,255,0
#define MY_PORT 5003                                                                // port node server mode
#define MY_GATEWAY_MAX_CLIENTS 2                                                    // Nb clients max 
#include <SPI.h>
#include <MySensors.h>  
#define CHILD_ID_TEMP 50  
#define CHILD_ID_HUM 51
#define DHTPIN 4                                                                    // Broche sur laquelle est branché le DHT
#define DHTTYPE DHT22                                                               // DHT 22  (AM2302), DHT11
MyMessage msgTemp(CHILD_ID_TEMP, V_TEMP); MyMessage msgHum(CHILD_ID_HUM, V_HUM);    //defini message domoticz
DHTesp dht; int dhtPin = 27; // paramètres capteurs DHT capteur DHT
//*********************************************************************************** paramètre et initialisation tache de lecture DHT
 void tempTask(void *pvParameters); bool getTemperature(); void triggerGetTemp(); TaskHandle_t tempTaskHandle = NULL; Ticker tempTicker; ComfortState cf; bool tasksEnabled = false;
 bool initTemp() { byte resultValue = 0; dht.setup(dhtPin, DHTesp::DHT22); Serial.println("DHT initiated");
 xTaskCreatePinnedToCore( tempTask, "tempTask ", 4000, NULL, 5, &tempTaskHandle, 1); if (tempTaskHandle == NULL) { Serial.println("Failed to start task for temperature update"); 
 return false;} else { tempTicker.attach(20, triggerGetTemp); } return true; }      // période de tache; ici 20 s
 void triggerGetTemp() { if (tempTaskHandle != NULL) {  xTaskResumeFromISR(tempTaskHandle); } }
  void tempTask(void *pvParameters) { Serial.println("tempTask loop started"); while (1) { if (tasksEnabled) { getTemperature(); } vTaskSuspend(NULL); } }
 //***********************************************************************************Lecture param Temp-Hum
 bool getTemperature() { TempAndHumidity newValues = dht.getTempAndHumidity(); if (dht.getStatus() != 0) { Serial.println("DHT11 error status: " + String(dht.getStatusString())); 
 return false; }  Serial.println(" T:" + String(newValues.temperature) + " H:" + String(newValues.humidity)); send(msgTemp.set(newValues.temperature, 1)); 
 send(msgHum.set(newValues.humidity, 1)); return true;}                              // message envoyé Domoticz ********
 //***********************************************************************************
 void setup() { Serial.begin(115200);  Serial.println();  Serial.println("DHT ESP32 example with tasks"); initTemp(); tasksEnabled = true;  }       // ******VOID Setup 
void presentation()  { sendSketchInfo("Sonde Temp/Hum DHT22", "1.0"); present(CHILD_ID_TEMP, S_TEMP); present(CHILD_ID_HUM, S_HUM); }               //****   VOID Présntation 
 void loop() { if (!tasksEnabled) {  delay(2000); tasksEnabled = true; if (tempTaskHandle != NULL) {  vTaskResume(tempTaskHandle); }  }  yield(); } //****   VOID LOOP

This topic was automatically closed 120 days after the last reply. New replies are no longer allowed.