Pas de réception de message mqtt sur esp32

Bonsoir,
Pour pouvoir mettre en place l'envoi de commande par Mqtt , j'ai mis en place un petit programme sur un esp32 pour pouvoir tester.
Je remonte bien les infos esp32 vers Mqtt mais je n'arrive pas a envoyer depuis le Mqtt une commande sur l'esp32 pour allumer le relais.
Sur Mqtt j'envoi une commande de type: (commande)= Action → (topic)= Tracker-ldr/info_bouton → (valeur)= 1
Et dans le moniteur série je ne vois pas le = Serial.println("Message MQTT reçu !");

Le code de test:

/********* TEST-MQTT *************/
#include <ArduinoJson.h>
//#include <ArduinoJson.hpp>
#include <AsyncElegantOTA.h>
#include <ESPAsyncWebServer.h>
#include <AsyncTCP.h>
#include <WiFi.h>
#include <PubSubClient.h>
#include <Wire.h>
#include "LiquidCrystal_I2C.h"
#include <Adafruit_Sensor.h>
#include <Adafruit_TSL2561_U.h>
#define TSL2561_SDA 21
#define TSL2561_SCL 22
//relais pour test mqtt
#define relais1 16 // gpio
int relais1State; //test etat relais test mqtt 
const int Boutonrelais1 = 32;
bool info_bouton = false; //test
bool led = false; //variable pour bouton ou seuil lumière

Adafruit_TSL2561_Unified tsl = Adafruit_TSL2561_Unified(TSL2561_ADDR_FLOAT, 12345);
const char* ssid = "xxxxxxxxx";
const char* password = "xxxxxxxxxx";
const char* mqttServer = "192.168.50.12";
const int mqttPort = 1883;
const char* clientId = "ESP32Client";

//variable RSSI pour tempo envoi
unsigned long lastMqttUpdate = 0;
const unsigned long mqttUpdateInterval = 5000;  // Intervalle en millisecondes (30 secondes)


WiFiClient espClient;
PubSubClient client(espClient);

//Créer objet  AsyncWebServer sur le port 80 :
AsyncWebServer server(80); //***

char message[10]; // Définissez un tableau de caractères pour stocker le message
//TEST MQTT**************
void MQTTsend() {
  char buffer[512];
  DynamicJsonDocument docMqtt(512);
  docMqtt["Lux"] = message;
  //docMqtt["notification"]= "Test envois sur le broker";  // exemple message texte
  // Convertir le RSSI WiFi en chaîne de caractères
  char rssiBuffer[5];
  itoa(WiFi.RSSI(), rssiBuffer, 10);
  docMqtt["RSSI du WiFi"]= rssiBuffer;
  docMqtt["Relais1"]= relais1State;
  docMqtt["Bouton"]= info_bouton;
  //size_t n = serializeJson(docMqtt, buffer);
  String jsonString;
  serializeJson(docMqtt, jsonString);
  //client.publish("Tracker-ldr/sensor/state", buffer, n);
  client.publish("Tracker-ldr/sensor/state", jsonString.c_str());
}
// Connection au wifi
void setup_wifi() {
  delay(10);
  //Wifi
  Serial.printf("Connecting to %s ", ssid);
  WiFi.begin(ssid, password);
  while (WiFi.status() != WL_CONNECTED) {
      delay(500);
      Serial.print(".");
  }
  Serial.println();
  Serial.print("Connecté au réseau WiFi avec l'adresse IP: ");
  Serial.println(WiFi.localIP());
  //Serial.print("Signal Wifi");
  //Serial.println(WiFi.RSSI());
   server.on("/", HTTP_GET, [](AsyncWebServerRequest *request) {
    request->send(200, "text/plain", "Je suis le test mqtt .");
  });

  AsyncElegantOTA.begin(&server);    // Start ElegantOTA
  server.begin();
  Serial.println("HTTP server started");
}

// reconnection Mqtt
void reconnect() {
  // Boucle jusqu'à ce que nous soyons reconnectés
  while (!client.connected()) {
    Serial.print("Tentative de connexion au broker MQTT...");
    // Tentative de connexion
    if (client.connect("ESP32Client")) {
      Serial.println("Connecté");
      
      // Une fois connecté, vous pouvez vous abonner à des topics ici
    } else {
      Serial.print("échoué, rc=");
      Serial.print(client.state());
      Serial.println(" nouvelle tentative dans 5 secondes");
      // Attendez 5 secondes avant de réessayer
      delay(5000);
    }
  }
}
void callback(char* topic, byte* payload, unsigned int length) {
  Serial.println("Message MQTT reçu !");
  // Traitez le message ici
  // Par exemple, allumez ou éteignez le relais en fonction du message reçu
  if (payload[0] == '1') {
    digitalWrite(relais1, HIGH);
    relais1State = 1;
  } else if (payload[0] == '0') {
    digitalWrite(relais1, LOW);
    relais1State = 0;
  }
}

void setup() {
  Serial.begin(115200);
  delay(10);
  // TSL2561
  Wire.begin(TSL2561_SDA, TSL2561_SCL);
    
    if (!tsl.begin()) {
        Serial.println("Capteur TSL2561 non trouvé. Vérifiez votre câblage !");
        while (1);
    }
    tsl.enableAutoRange(true); 
  // connection wifi
  setup_wifi();
  AsyncElegantOTA.begin(&server);//***
  server.begin();                //***
  // Connexion au serveur MQTT
  client.setServer(mqttServer, mqttPort);
  client.setCallback(callback); // Définissez la fonction de rappel pour les messages MQTT reçus
  // Abonnez-vous au sujet MQTT
  client.subscribe("Tracker-ldr");
  //type relais
 pinMode(relais1, OUTPUT); //*pour test mqtt
 pinMode(Boutonrelais1, INPUT_PULLUP); //*pour test mqtt
}

void loop() {
  delay(1000);
  //fonction de reconnection wifi
  if (!client.connected()) {
    reconnect();
  }   
  //Tempo envoi info MQTT
  // Vérifiez si le temps écoulé dépasse l'intervalle de mise à jour du RSSI (30 secondes)
  if (millis() - lastMqttUpdate >= mqttUpdateInterval) {
    // Mettez à jour le dernier temps d'envoi du RSSI
    lastMqttUpdate = millis(); 
    MQTTsend();  //lancement envoi info Mqtt 
        
  } 
  
  // info lux
  sensors_event_t event; // info tsl2561
  tsl.getEvent(&event);
  //variable pour lumière
  int lumiere = event.light; 
  // Convertissez l'int en chaîne de caractères
  dtostrf(event.light, 6, 2, message);
  //snprintf(message, sizeof(message), "%d", event.light);
  Serial.print("Message à publier sur MQTT : ");
  Serial.println(message);

  if (event.light) {
      Serial.print("Luminosité: ");
      Serial.println(event.light);
  } else {
     Serial.println("Erreur lors de la lecture de la luminosité !");
  }
  //int relaisporteState; //etat relais test mqtt
  int Boutonrelais1State = digitalRead(Boutonrelais1);  //test mqtt
  //test mise en marche relais auto et remonter mqtt
  if (lumiere > 150) {
    digitalWrite(relais1, HIGH);
    relais1State = 1;
    led = true;
  }
  if (lumiere < 50) {
    digitalWrite(relais1, LOW);
    relais1State = 0;
    led = false;
  }
   
  Serial.println(relais1State); //état relais moniteur série //debug
  //test en local esp
  if (led) {   
  } else{
  if (Boutonrelais1State == LOW) {
    digitalWrite(relais1, HIGH);
    relais1State = 1;
    info_bouton = true;    
    } else {
      
    digitalWrite(relais1, LOW);
    relais1State = 0;
    info_bouton = false;
    Serial.println("relais off sur bouton");//debug
   }
  }
  client.loop();
}

Merci

vous vous abonnez au topic "Tracker-ldr"

mais vous touchez "Tracker-ldr/info_bouton"

il vous faut rajouter

client.subscribe("Tracker-ldr/info_bouton");

J'ai déjà testé avec

client.subscribe("Tracker-ldr/info_bouton");

et ça fonctionne pas mieux, sur mon server domotique je récupère les infos de l'esp sur le topic:
Tracker-ldr/sensor/state mais pour la commande je n'arrive pas a trouver le type, donc j'ai testé:
Tracker-ldr/info_bouton et Tracker-ldr mais rien n'arrive sur l'esp.

dans ce cas c'est sur ce topic qu'il faut s'abonner "Tracker-ldr/sensor/state" et c'est celui là qu'il faut modifier

ok je vais tester
Merci

Bon ça ne fonctionne pas ; j'ai mis sur l'esp:

client.subscribe("Tracker-ldr/sensor/state");

et sur ma domotique: Tracker-ldr/sensor/state → valeur 1 et pas de relais allumer n'y message reçu sur le moniteur série

est-ce que https://github.com/knolleary/pubsubclient/blob/v2.8/examples/mqtt_esp8266/mqtt_esp8266.ino fonctionne chez vous ?

Je regarde demain.
Merci

Hello,
petit retour , bon j'ai trouvé pourquoi je n'avais pas de réception mqtt et c'était tous bête comme problème.
Il suffisait de mettre le client.subscribe dans le void reconnect après la connexion.

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