Page 3 sur 3

Re: Gestion On/off sur Esp8266 via MQTT

Publié : 27 mai 2023, 11:12
par pierrotori
quand je sors de la callback je perds mes valeurs

Code : Tout sélectionner

char* msg_veille_date=".";
char* msg_etat=".";
char* msg_etat_date=".";

void callback(char* topic, byte* payload, unsigned int length) {
  DPRINT("Message arrived [");
  DPRINT(topic);
  DPRINT("] ");
  String messageTemp;
  for (int i = 0; i < length; i++) {
    DPRINT((char)payload[i]);
    messageTemp += (char)payload[i];
  }
    DPRINTLN();
    DynamicJsonDocument doc(128);
    DeserializationError error = deserializeJson(doc, payload, length);
    if (error) {
       DPRINTLN(error.f_str());
        return;
    }
    // If a message is received on the topic
    if (String(topic) == mqtt_action) {
      const char* msg_action = doc["value"].as<const char *>();
      const char* msg_action_date = doc["update"].as<const char *>();
      DPRINT("Action lu : ");DPRINT(msg_action);DPRINT(" ");DPRINTLN(msg_action_date);        
    }
    if (String(topic) == mqtt_etat) {
      const char* msg_etat = doc["value"].as<const char *>();
      const char* msg_etat_date = doc["update"].as<const char *>();
      DPRINT("Status lu : ");DPRINT(msg_etat);DPRINT(" ");DPRINTLN(msg_etat_date);        
    }    
}

void setup(void) {

      for(int i=0;i<10; i++)
      {
        client.loop();  //Ensure we've sent & received everything
        delay(200);
      }
      
     DPRINTLN(msg_action);
     DPRINTLN(msg_etat);
}
les 2 valeurs contiennent un "." en sortie du callback, alors que quand elles sont affichées dans la callback elles contiennent les valeurs des topics
je dois surement passer le pointeur mais je n'arrive pas à faire la copie, besoin d'un peu d'aide !

Re: Gestion On/off sur Esp8266 via MQTT

Publié : 27 mai 2023, 19:10
par Flying Domotic
C'est "normal" ...

Le programme utilise le même nom pour des variables globale et locales au callback.Du coup, quand on est dans le callback, c'est la valeur du callback qui est affichée, alors qu'en dehors, c'est la valeur globale. Et comme il n'y a pas de liens entre les deux, chacun vit sa vie dans son coin.

Ce qu'il faudrait faire, c'est copier le contenu des valeurs récupérées localement dans des valeurs globales (et en profiter pour utiliser des noms uniques). Par exemple :

Code : Tout sélectionner

char msg_etat[80];	// Ajuster les longueurs max (ici 80 pris au hasard) au contenu le plus long de chaque variable
char msg_etat_date=[80];
char msg_action[80];
char msg_action_date=[80];

void callback(char* topic, byte* payload, unsigned int length) {
  DPRINT("Message arrived [");
  DPRINT(topic);
  DPRINT("] ");
  String messageTemp;
  for (int i = 0; i < length; i++) {
    DPRINT((char)payload[i]);
    messageTemp += (char)payload[i];
  }
    DPRINTLN();
    DynamicJsonDocument doc(128);
    DeserializationError error = deserializeJson(doc, payload, length);
    if (error) {
       DPRINTLN(error.f_str());
        return;
    }
    // If a message is received on the topic
    if (String(topic) == mqtt_action) {
      const char* value = doc["value"].as<const char *>();
      const char* update = doc["update"].as<const char *>();
      strncpy(msg_action, value, sizeof(msg_action));
      strncpy(msg_action_date, update, sizeof(msg_action_date));
      DPRINT("Action lu : ");DPRINT(msg_action);DPRINT(" ");DPRINTLN(msg_action_date);
    }
    if (String(topic) == mqtt_etat) {
      const char* value = doc["value"].as<const char *>();
      const char* update = doc["update"].as<const char *>();
      strncpy(msg_etat, value, sizeof(msg_etat));
      strncpy(msg_etat_date, update, sizeof(msg_etat_date));
      DPRINT("Status lu : ");DPRINT(msg_etat);DPRINT(" ");DPRINTLN(msg_etat_date);
    }
}

void setup(void) {

      for(int i=0;i<10; i++)
      {
        client.loop();  //Ensure we've sent & received everything
        delay(200);
      }
      
     DPRINTLN(msg_action);
     DPRINTLN(msg_etat);
}

Re: Gestion On/off sur Esp8266 via MQTT

Publié : 28 mai 2023, 10:02
par pierrotori
milles merci, ca remarche , je continue sur la gestion des dates et heure
Du coup j'ai changé toutes mes conditions
de

Code : Tout sélectionner

if (msg_action == "on")
en

Code : Tout sélectionner

strcmp(msg_action,"on") == 0

Re: Gestion On/off sur Esp8266 via MQTT

Publié : 28 mai 2023, 10:45
par Flying Domotic

Code : Tout sélectionner

if (msg_action == "on")
marche bien quand msg_action est de type String. Si c'est un char, c'est

Code : Tout sélectionner

strcmp
qu'il faut utiliser.