Configuration MQTT devices v4

Bonjour,
Je n’arrive pas communiquer avec Gladys par le MQTT.
Voici le projet. J’ai crée un broker MQTT sur mon PC.
J’ai connecté à ce broker un arduino qui publie une température, une humidité et l’état de deux boutons poussoirs. L’arduino souscrit à 3 topics pilotant chacun une couleur d’une led tricolore.
J’ai configuré sur mon mobile l’appli mqtt dash et tout fonctionne.

Dans Gladys, j’ai configuré la configuration MQTT pour le broker, là encore c’est bon Gladys a se connecter à mon broker.

Par contre, dans la vue MQTT devices, j’ai essayé pas mal de configuration et rien n’y fait, Gladys ne publie rien et n’arrive pas à souscrire à quelque chose.

Pouvez vous m’aider SVP ? merci d’avance

salut, est-ce que tu publie bien sur:

le topic: gladys/master/device/state/update

en format Json: {"device_feature_external_id":"mqtt:ID DU DEVICE","state":LA VALEUR}

?

Salut, non je ne publie pas sur ce topic en effet. Mais pour etre franc, j’ai lu pas mal de chose sur le forum et j’ai pas compris ce qu’il fallait faire pour que Gladys souscrive et publie des données. Tu peux m’aider sur ce sujet ?
Je ne sais pas ce que c’est que Json, j’utilise un arduino pour publier et souscrire.

ci dessous le programme :

// Définition des librairies nécessaire

#include <SimpleDHT.h>
#include <Ethernet.h>
#include <PubSubClient.h>

// Définition de constants

int pinDHT11 = 2;       // Le pin de connexion du capteur
SimpleDHT11 dht11;      // Le type de capteur DHT 11

// les topic pour la température et de l'humidité

const char* topic_t = "Capteur/temperature";
const char* topic_h = "Capteur/humidity";
const char* topic_l7 = "7";
const char* topic_l8 = "8";
const char* topic_l9 = "9";
const char* topic_bp1 = "bp1";
const char* topic_bp2 = "bp2";
const char* clientID = "Arduino45500Gien";

char USER[10] = "boby88";
char PWD[10] = "tresdur";

char hum[10],tem[10],c[10],d[10];
char etat[10];

// les paramètres de connexion du shield Ethernet

byte mac[] = {  0x12, 0xA2, 0xB8, 0x48, 0xAA, 0xF0 };   // L'adresse Mac de votre shield ethernet
IPAddress ip(192, 168, 1, 100); 

// L'adresse du Broker

const char* server = "192.168.1.79";

// instance de la classe EthernetClient : crée un client qui peut se connecter à une adresse IP et un port internet spécifique

EthernetClient ethClient;       // ethClient est juste le nom donné à l'instance

// l'instance de la classe MQTT, cette instance doit être complétée de mqtt.setserver pour être entièrement configuée

PubSubClient mqtt(ethClient);   // mqtt est juste le nom donné à l'instance

void reconnect(void);
void pubCapteur(void);

void setup()
{
// initialisation des entrées/sorties numériques

    pinMode(6, INPUT_PULLUP);
    pinMode(7, OUTPUT);
    pinMode(8, OUTPUT);
    pinMode(9, OUTPUT);
    pinMode(10, INPUT_PULLUP);
   
  // Initialisation de la liaison série

  Serial.begin(115200);

  // Initialisation de la connexion TCP

  Ethernet.begin(mac,ip);

  // Initialisation de la connexion au Broker

  mqtt.setServer(server, 1883);
  mqtt.setCallback(callback);
}

void loop()
{
  if(mqtt.connected())
    {
     // Si la connexion au Broker est réalisé envoyer les données
     pubCapteur();
     mqtt.loop();
    }else {
     // Sinon se reconnecte au Broker
     reconnect();
    }
        delay(3000);
}

void callback(char* topic, byte* payload, unsigned int length) {
 //Serial.print("Message arrived [");
 //Serial.print((char[10])topic);
 //Serial.print("] ");
 //Serial.print("");
 int a=topic[0]-48;
// Serial.print(a);

   for (int i=0;i<length;i++) {
    char receivedChar = (char)payload[i];
    if (receivedChar == '1')
    digitalWrite(a, HIGH);
    if (receivedChar == '0')
     digitalWrite(a, LOW);
    }
}

void pubCapteur(void)
{
// start working...
  
  // read with raw sample data.
  byte temperature = 0;
  byte humidity = 0;
 byte data[40];
  if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
    //Serial.print("Read DHT11 failed");
    return;
  }
  
  dtostrf(humidity, 7, 4, hum);
  dtostrf(temperature, 7, 4, tem);
  dtostrf(digitalRead (10), 1, 0, c);
  dtostrf(digitalRead (6), 1, 0, d); 
  //Serial.print(tem); Serial.print(" *C, ");
 // Serial.print(hum); Serial.println(" %,   ");
  
  // DHT11 sampling rate is 1HZ.
  // convertion des valeurs capturé en chaine de caractére

  // publication des données sur la Broker

  mqtt.publish(topic_h, hum);
  mqtt.publish(topic_t, tem);
  mqtt.publish(topic_bp1, c);
  mqtt.publish(topic_bp2, d);
}


void reconnect(void) {
  // Loop until we're reconnected
  while (!mqtt.connected()) {
    Serial.print("Attempting MQTT connection...");
    // Attempt to connect
    if (mqtt.connect(clientID,USER,PWD)) {
 
     Serial.println("connected");
      // Once connected, publish an announcement...
       mqtt.subscribe(topic_l7);
       mqtt.subscribe(topic_l8);
       mqtt.subscribe(topic_l9);
    } else {
      Serial.print("failed, rc=");
      Serial.print(mqtt.state());
      Serial.println(" try again in 5 seconds");
      // Wait 5 seconds before retrying
      delay(5000);
    }
  }
}

Hello Camille,

J’ai bossé sur une station météo il y a peu. J’ai été confronté au même problème que toi.

Je te propose de consulter le code de ma station météo basée sur un ESP32 avec :

  • Un module DHT11 pour la température et le taux d’humidité,
  • Un module MH-Z19B pour pour le CO2.

Voici un extrait de mon code sur le volet température :

#include <WiFi.h>
#include <PubSubClient.h>
#include <ArduinoJson.h>
#define mqtt_server "Mon broker"   // server name or IP
#define mqtt_user "username"            // username
#define mqtt_password "password"        // password
#define gladys_topic "gladys/master/device/state/update"  /
#define mqtt_temperature "mqtt:sensor/temp1"     //Topic temperature
WiFiClient espClient;
PubSubClient client(espClient);

void reconnect() {
 
  while (!client.connected()) {
    Serial.print("Connecting to MQTT broker ...");
    if (client.connect("StationMeteo", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("[Error] Not connected: ");
      Serial.print(client.state());
      Serial.println("Wait 5 seconds before retry.");
      delay(5000);
    }
  }
}

void setup() {
    //Edition des objets JSON + publication
    StaticJsonDocument<300> JSONbuffer;
    char JSONmessageBuffer[100];

    Serial.begin(115200);
    setup_wifi();                           //Connect to Wifi network
   
    client.setServer(mqtt_server, 1883);    // Configure MQTT connection, change port if needed.
 
    if (!client.connected()) {
        reconnect();
    }
    
    dht.begin();
    // Read temperature in Celcius
    float t = dht.readTemperature();
   
    // Publish values to MQTT topics 
    // Gladys attend un fichier JSON
    // Temperature
    JSONbuffer["device_feature_external_id"] = mqtt_temperature;
    JSONbuffer["state"] = String(t);
    serializeJson(JSONbuffer, JSONmessageBuffer);
    client.publish(gladys_topic, JSONmessageBuffer, true);   // Publish temperature on sensor/temp1
    if ( debug ) {    
      Serial.println("Temperature sent to MQTT.");
    }
    
  // Déconnexion du broker MQTT
  client.disconnect();
  
  // Déconnexion du réseau wifi
  WiFi.disconnect();

  esp_sleep_enable_timer_wakeup(TIME_TO_SLEEP * uS_TO_S_FACTOR); 
  esp_deep_sleep_start();
}

Un très grand merci à toi. J’ai une erreur quand j’utilise ton code, je vais regarder cela de plus près mais grâce à tes explications et des infos trouvées dans le sujet : https://community-3.gladysassistant.com/t/mqtt-comment-fonctionne-le-module-mqtt/5000/27?u=camilleb

J’ai réussi à formater une chaine de caractéres afin que Gladys puisse la lire.

const char* gladys_topic = “gladys/master/device/state/update”;
char* donnees1 = “{\“device_feature_external_id\”:\“mqtt:sensor/temperature\”,“state\”:\ 25.78\}”;

et ensuite j’ai publié avec l’arduino :

mqtt.publish(gladys_topic, donnees1);

Résultat dans Gladys :

image

Il me reste à trouver la raison de mon erreur qui est la suivante :

image

1 Like

Bonsoir, si cela peut aider quelqu’un comme moi qui n’est pas un très bon informaticien, j’ai réussi à envoyer la chaine de caractère nécessaire à Gladys pour lire des données via un serveur MQTT.
J’ai essayé de trouver des infos sur Json mais pour être franc, je n’ai rien trouvé d’accessible pour moi.
Je suis preneur si quelqu’un peut me donner un lien ou un doc qui explique simplement comment utiliser Json.

Pour en revenir à la chaine de caractère, j’ai commencé par créer une chaine type.

char* donnees = “{\“device_feature_external_id\”:\“mqtt:sensor/temperature\”,\“state\”:\ 00}”;

le but est de remplacer ensuite les deux 00 par la valeur mesurée.

mesure des données :

if (dht11.read(pinDHT11, &temperature, &humidity, data)) {
//Serial.print(“Read DHT11 failed”);
return;
}

conversion des données :

dtostrf(humidity, 2, 0, hum);

très gros bidouillage (pardon aux softeux qui doivent s’arracher les cheveux en voyant mes lignes de codes, je suis meilleur en hardware :slight_smile:, en m^me temps pas dur avec ce que j’ai écrit :wink:) bref on remplace dans la chaine initiale la valeur mesurée :

char* essai = hum;
donnees[65] = essai[0];
donnees[66] = essai[1];

mqtt.publish(gladys_topic, donnees);

Voilà ce que l’arduino envoi :

image

Voilà ce que Gladys voit :

Je suis preneur d’aide pour améliorer le code de l’arduino avec la bibliothéque Json.

Merci d’avance

1 Like

Je prépare un template arduino pour Gladys mqtt qui pourra être utilisé dans la plupart des cas. Tant que ça marche c’est le principal.

L’auto satisfaction d’avoir réussi ça n’a pas de prix :relieved:.

Merci pour ton retour.

4 Likes