Problème de syntaxe pour envoyer sur un serveur MQTT; ca ne compile pas

Bonjour à tous.

Habituellement, j’utilise un firmware espaesy sur des wemos D1 mini pro pour envoyer des données vers un serveur domoticz. Malheureusement, un de mes capteur un peu exotique n’est pas “reconnu” par domoticz et je dois trouver un subterfuge. je veux donc envoyer les données sur un serveur MQTT pour quelles soient traitées par domoticz.

Dans un premier temps et pour me familiariser, j’ai utilisé un sketch tout fait pour un dht22, ça fonctionne bien, mais je dois encore modifier la syntaxe du message à envoyer sous cette forme :
{ "idx" : 2, "nvalue" : 0, "svalue':"20;60"} ou 20 et 60 sont les valeurs mesurées par le dht22

Seulement, quand je cherche à ecrire la ligne pour poster , il refuse de compiler.

voici le code du programme: avec en commentaire en gras la partie ou je bug

/*
  Projet d'apprentissage d'un objet connecté (IoT)  pour réaliser une sonde de température
  ESP8266 + DHT22 + LED + MQTT + Home-Assistant
  Projets DIY (https://www.projetsdiy.fr) - Mai 2016
  Licence : MIT
*/
#include <ESP8266WiFi.h>
#include <PubSubClient.h>
#include "DHT.h"          // Librairie des capteurs DHT

#define wifi_ssid "mabox"
#define wifi_password "xxxxxxxxxxxxxxxxxx"

#define mqtt_server "192.168.1.72"
#define mqtt_user "olitask"  //s'il a été configuré sur Mosquitto
#define mqtt_password "xxxxxxxxxxxxxxxxxxxx" //idem

#define temperature_topic "sensor/temperature"  //Topic température
#define humidity_topic "sensor/humidity"        //Topic humidité
#define domoticz_topic "domoticz/in"  
//Buffer qui permet de décoder les messages MQTT reçus
char message_buff[100];

long lastMsg = 0;   //Horodatage du dernier message publié sur MQTT
long lastRecu = 0;
bool debug = true;  //Affiche sur la console si True

#define DHTPIN D4    // Pin sur lequel est branché le DHT

// Dé-commentez la ligne qui correspond à votre capteur 
//#define DHTTYPE DHT11       // DHT 11 
#define DHTTYPE DHT22         // DHT 22  (AM2302)

//Création des objets
DHT dht(DHTPIN, DHTTYPE);     
WiFiClient espClient;
PubSubClient client(espClient);

void setup() {
  Serial.begin(9600);     //Facultatif pour le debug
  pinMode(D2,OUTPUT);     //Pin 2 
  setup_wifi();           //On se connecte au réseau wifi
  client.setServer(mqtt_server, 1883);    //Configuration de la connexion au serveur MQTT
  client.setCallback(callback);  //La fonction de callback qui est executée à chaque réception de message   
  dht.begin();
}

//Connexion au réseau WiFi
void setup_wifi() {
  delay(10);
  Serial.println();
  Serial.print("Connexion a ");
  Serial.println(wifi_ssid);

  WiFi.begin(wifi_ssid, wifi_password);

  while (WiFi.status() != WL_CONNECTED) {
    delay(500);
    Serial.print(".");
  }

  Serial.println("");
  Serial.println("Connexion WiFi etablie ");
  Serial.print("=> Addresse IP : ");
  Serial.print(WiFi.localIP());
}

//Reconnexion
void reconnect() {
  //Boucle jusqu'à obtenur une reconnexion
  while (!client.connected()) {
    Serial.print("Connexion au serveur MQTT...");
    if (client.connect("ESP8266Client", mqtt_user, mqtt_password)) {
      Serial.println("OK");
    } else {
      Serial.print("KO, erreur : ");
      Serial.print(client.state());
      Serial.println(" On attend 5 secondes avant de recommencer");
      delay(5000);
    }
  }
}

void loop() {
  if (!client.connected()) {
    reconnect();
  }
  client.loop();

  long now = millis();
  //Envoi d'un message par 20 secondes
  if (now - lastMsg > 1000 * 20) {
    lastMsg = now;
    //Lecture de l'humidité ambiante
    float h = dht.readHumidity();
    // Lecture de la température en Celcius
    float t = dht.readTemperature();

    //Inutile d'aller plus loin si le capteur ne renvoi rien
    if ( isnan(t) || isnan(h)) {
      Serial.println("Echec de lecture ! Verifiez votre capteur DHT");
      return;
    }
  
    if ( debug ) {
      Serial.print("Temperature : ");
      Serial.print(t);
      Serial.print(" | Humidite : ");
      Serial.println(h);
    }  
    client.publish(temperature_topic, String(t).c_str(), true);   //Publie la température sur le topic temperature_topic
    client.publish(humidity_topic, String(h).c_str(), true);      //Et l'humidité
   // client.publish(domoticz_topic, "{\"idx\":2,\"svalue\":\"20;60;3\"}");  // LA CA FONCTIONNE, MAIS 20 ET 60 DOIVENT ETRE REMPLACE PAR LES BONNES VARIABLES
   client.publish(domoticz_topic,"{\"idx\":2,\"svalue\":\"", t , h );  // LA CA NE COMPILE  PLUS
  }
  if (now - lastRecu > 100 ) {
    lastRecu = now;
    client.subscribe("homeassistant/switch1");
  }
}

// Déclenche les actions à la réception d'un message
// D'après http://m2mio.tumblr.com/post/30048662088/a-simple-example-arduino-mqtt-m2mio
void callback(char* topic, byte* payload, unsigned int length) {

  int i = 0;
  if ( debug ) {
    Serial.println("Message recu =>  topic: " + String(topic));
    Serial.print(" | longueur: " + String(length,DEC));
  }
  // create character buffer with ending null terminator (string)
  for(i=0; i<length; i++) {
    message_buff[i] = payload[i];
  }
  message_buff[i] = '\0';
  
  String msgString = String(message_buff);
  if ( debug ) {
    Serial.println("Payload: " + msgString);
  }
  
  if ( msgString == "ON" ) {
    digitalWrite(D2,HIGH);  
  } else {
    digitalWrite(D2,LOW);  
  }
}

Je précise que j’ai essaye plusieurs manières pour ecrire mon code mais sans succes .

Merci d’avance
olivier

En regardant ici : pubsubclient/PubSubClient.h at master · knolleary/pubsubclient · GitHub

Je ne vois aucune méthode publish() qui prenne des flots en paramètre :

   boolean publish(const char* topic, const char* payload);
   boolean publish(const char* topic, const char* payload, boolean retained);
   boolean publish(const char* topic, const uint8_t * payload, unsigned int plength);
   boolean publish(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);
   boolean publish_P(const char* topic, const char* payload, boolean retained);
   boolean publish_P(const char* topic, const uint8_t * payload, unsigned int plength, boolean retained);

Il va falloir à mon avis formater un message avec les données sous forme de texte.

@hbachetti

en texte c'est donc String :blush: :blush: ? ou bien char ??

alors j'ai modifie en

     if ( debug ) {
      //Serial.print("Temperature : ");
     // Serial.print(t);
      //Serial.print(" | Humidite : ");
     // Serial.println(h);
      String information_str = String ("{\"idx\":2,\"svalue\":\"") + String(t).c_str() + ";" + String(h).c_str() + ";3\"}";
      information_str.toCharArray(information_char, information_str.length() + 1);
      Serial.println(information_char);
    }
    //client.publish(temperature_topic, String(t).c_str(), true);   //Publie la température sur le topic temperature_topic
    // client.publish(humidity_topic, String(h).c_str(), true);      //Et l'humidité
    //client.publish(domoticz_topic, "{\"idx\":2,\"svalue\":\"20;60;3\"}");  // LA CA FONCTIONNE, MAIS 20 ET 60 DOIVENT ETRE REMPLACE PAR LES BONNES VARIABLES
    client.publish(domoticz_topic, information_char);  // LA CA  COMPILE  a nouveau

En réalité, j'ai vraiment l'impression de bidouiller :confused: :confused:

merci Olivier

un de mes capteur un peu exotique n'est pas "reconnu" par domoticz

Je ne vois pas trop ce qu'un DHT22 a d'exotique.

Il y a pas mal de projets :

https://lofurol.fr/joomla/electronique/domotique/165-espeasy-temperature-et-humidite-avec-capteur-dht22

Y compris avec MQTT :