ESP8266 Nodemcu - Horloge et MQTT

Bonjour a tous,

J'ai réalisé une horloge (ntp) avec un nodemcu et l'affichage led.
J'y ai intégré dans mon code des test pour l'éteindre de 23 à 6h etc etc ....

Cela fonctionne trés bien. J'ai intégré une sonde dht22, et avec mqtt je publie les températures sur mon serveur Home-Assistant.

Nickel tout fonctionne bien !

J'ai une autre sonde avec ESPEASY à l'exterieur qui elle aussi envoi vers mon serveur domotique.

Aujourd'hui sur mon horloge j'aimerai en plus de l'affichage de la température ajouter la température de la sonde exterieure.

J'ai essayé d'utilisé la fonction "callback" apres mettre abonné au topic de la sonde exterieur.

Mais cela ne fonctionne pas ... Je n'y comprend rien ....

Pouvez vous m'aider ?

Merci d'avance

Bonjour

Voir la Règle du Forum Francophone (quelles informations fournir....)

Sans code de l'horloge il est difficile de répondre autre chose qu'une banalité du genre
'quelque chose fait que la carte horloge ne récupère ou ne traite pas correctement le contenu du topic 'température extérieure' auquel elle à souscrit' !

Voici quelles précisions :

Sur le broker , le topic suivant apparait : ESP_Easy/temp_lolo/temperature 22.60.

voici le code pour faire un test du coup sans la partie horloge.... mais rien ne s'affiche sur le port serie. par contre la publication fonctionne.

#include <Arduino.h>
#include <ESP8266WiFi.h>
#include <WiFiUdp.h>
#include <PubSubClient.h>  

//WiFi Connection configuration
char ssid[] = "xxxxxxx";     //  le nom du reseau WIFI
char password[] = "xxxxxxxxxx";  // le mot de passe WIFI
//mqtt server
char mqtt_server[] = "10.1.2.198";  //adresse IP serveur
#define MQTT_USER ""
#define MQTT_PASS ""

WiFiClient espClient;
PubSubClient MQTTclient(espClient);

//Fonctions mqtt
void MQTTsend() {
 static int cpt=0;
 cpt++;
String reponse="test Mqtt n°"+(String)cpt;
MQTTclient.publish("ESP_EASY/test",reponse.c_str());
}

void MQTTconnect() {

 while (!MQTTclient.connected()) {
     Serial.print("Attente  MQTT connection...");
     String clientId = "TestClient-";
     clientId += String(random(0xffff), HEX);

   // test connexion
   if (MQTTclient.connect(clientId.c_str(),"","")) {
     Serial.println("connected");
      MQTTclient.subscribe("ESP_Easy/temp_lolo");
   } else {  // si echec affichage erreur
     Serial.print("ECHEC, rc=");
     Serial.print(MQTTclient.state());
     Serial.println(" nouvelle tentative dans 5 secondes");
     delay(5000);
   }
 }
}

void setup() {
Serial.begin(115200);
 // Conexion WIFI
  WiFi.begin(ssid, password);
  Serial.println("");
 // Wait for connection
 while (WiFi.status() != WL_CONNECTED) {
   delay(500);
   Serial.print(".");
 }
  Serial.println("Connected");
  MQTTclient.setServer(mqtt_server, 1883);
  MQTTclient.setCallback(MQTTcallback);
}

void loop() {
 static uint32_t  lastTimeMqtt= 0;
 // connect serveur MQTT
 if (!MQTTclient.connected()) {
   MQTTconnect();
 }

 if (millis() - lastTimeMqtt >= 10000)  // toutes les 20 secondes
  {
    lastTimeMqtt = millis();
    MQTTsend();
  }
}

void MQTTcallback(char* topic, byte* payload, unsigned int length) {

 Serial.print("Message MQTT [");
 Serial.print(topic);
 Serial.print("] ");
}

Sur ce forum on utilises des balsies pour publier le code (voir les consigens épinglées en tête de forum.
Ainsi balisé le code apparaîtra de la manière suivente sera lisible et exploitable

...
...

Sur le broker , le topic suivant apparait : ESP_Easy/temp_lolo/temperature 22.60.

bien distinguer le topic .... et son contenu (avec un certain format)

j'entrevois une publication de la valeur 22,6 dans le topic ESP_Easy/temp_lolo /temperature
et dans le callback la récupération d'un entier dans ... ESP_Easy/temp_lolo

autre topic ? autre type de contenu ? les deux ?
contenu json temperature:22,60 pour le topic ESP_Easy/temp_lolo ?

(PS je ne connais pas du tout EspEasy et ne sais'il implique des particularités par rapport à l'utilisation directe de la librairie pubsub)

Pour la mise au point le logiciel multiplateforme MQTT.Fx est utile pour interagir en direct avec un broker ('Serveur MQTT'), souscrire a divers topics pour voir comment ils évoluent et y publier au besoin

J'ai modifié mon post. Désolé.

Pour la souscription au topic dans la fonction " MQTTconnect() " :
J'ai utilisé :

MQTTclient.subscribe("ESP_Easy/temp_lolo");

ou

MQTTclient.subscribe("ESP_Easy/temp_lolo/Temperature");

Mais ca change rien !

Température ou température ?

ce qui compte c'est qu'entre publication et souscription il y ait une totale cohérence entre leur inition des topics et le format des données échangées

Le topic est bien le bon. Sans accent.

Voici une copie du broker sur mon serveur Linux :

ESP_Easy/temp_lolo/Temperature 26.00
ESP_Easy/temp_lolo/Humidity 26.30

J'ai ajouter dans void loop(), la ligne suivante :

MQTTclient.loop();

Et là dans ma fenetre du port serie, j'ai maintenant :

Message MQTT [
ESP_Easy/temp_lolo/Temperature
]

Par contre j'aimerai mettre la valeur comme par exemple 26.00 dans une variable pour l'afficher ...
Pouvez vous m'aider ?

s'il n'y avait pas EspEasy dans la boucle je dirai qu'on peut toujours, via un topic MQTT, faire passer un nombre réel au moyen d'une chaîne de caractères

La présence d'ESPEsay impose peut être , ou pas, un formatage pour les infos en 'float'... faut voir...

Sur un exemple , il utilise la librairie ArduinoJson.h

J'ai ajouter à ma fonction callback :

void MQTTcallback(char* topic, byte* payload, unsigned int length) {
  Serial.print("Message MQTT [");
  Serial.print(topic);
  Serial.print("] ");

DynamicJsonDocument docMqtt(512);
deserializeJson(docMqtt, payload, length);  
String msg , title;
msg=docMqtt["msg"]|"";
title=docMqtt["title"]|"";
Serial.println("message reçu : "+msg +" et titre reçu "+title);
}

Mais il me renvoi pas de message pour msg et title ....

Pas facile d'avancer en bricolant des bribes à droite à gauche , si le topic doit être garni en json c'est une autre affaire !!

Je laisse la main à des personnes maîtrisant MQTT sur EspEasy pour échanger des 'nombres à virgule' !
EspEasy aurait d'ailleurs dû figurer dans le titre ce ce fil au mêm titre que MQTT, Nodemcu par contre est inutile c'est maintenant un terme que les vendeurs utilisent à tort et à travers)

Non pas du tout , EspEasy c'est juste la sonde qui envoi la température à mon serveur domotique et broker.

Moi je veux recuperer cette valeur sur un autre Nodemcu avec le code mis plus haut !

lolo19430:
Pour la souscription au topic dans la fonction " MQTTconnect() " :
J'ai utilisé :

MQTTclient.subscribe("ESP_Easy/temp_lolo");

ou

MQTTclient.subscribe("ESP_Easy/temp_lolo/Temperature");

Mais ca change rien !

Bonjour
Il faut que la publication soit faite avec l'attribut retained à TRUE
publish (topic, payload, [length], [retained])

Bon j'ai trouvé ça fonctionne.

Ma question peut on "s'enregistrer" sur plusieurs topic ?

Oui , on souscrit a plusieurs topics si nécessaire, idem pour la publication.

Mon code seul fonctionne.

Par contre quand je l'intègre dans mon script d'horloge cela ne fonctionne pas.

La fonction callback ne se lance jamais.

Pour l'affichage de l'heure j'ai comme code pour que l'heure reste affiché :

delay(30000);

Je pense que le problème est là .... mais je ne sais pas comment le résoudre .....

Si je met 10000, ça fonctionne !

Bon, apres quelques recherches, la fonction delay bloque l'appel aux autres fonctions.
Il faut que je fasses une boucle de 15 sec avec la fonction millis().
Mais je vais ouvrir un autre sujet ...

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