Forum

Please or Register to create posts and topics.

MQTT et Home Assistant

PreviousPage 2 of 2

Bonjour,

J'ai travaillé là-dessus jusqu'à tard hier soir et ai fais les premiers essais dans le temps de midi !

 

Ça marche bien ! Je vais pouvoir faire ça sur toutes les entités maintenant 🙂

Mais, entre temps, j'ai voulu optimiser la structure du programme pour éviter les répétitions et améliorer la lisibilité du code. Si pour l'envoi MQTT il n'y a pas de problème, j'ai sans doute fait quelques chose qui ne va pas (dans le type de variable à envoyer via InfluxDB) pour le serveur Grafana, car je n'ai plus aucune remontée sur ce dernier....

 

Va falloir que je me plonge dans comment ça fonctionne InfluxDB et trouver une technique pour débugger tout ça ... YAPLUKA !

Lionel has reacted to this post.
Lionel

Bonjour,

je viens de tester la version que tu m'as envoyé et clairement félicitation!!! Elle est vraiment belle en terme d'interface et clean au niveau code (J'ai encore pas mal à apprendre de mon côté ^^)

Je viens de tester MQTT et InfluxDB et les 2 fonctionnent de mon côté sur mon compteur Historique. Les données remontent bien sur le serveur de l'expérience.

Je ferai les tests avec une tic Standard Lundi au laboratoire.

Je vais pousser ta version sur le gitlab du projet et si tu es d'accord, je vais t'ouvrir les droits en tant que dev afin que tu puisses contribuer dans de bonnes conditions.

Encore merci,

Jérôme

Lionel has reacted to this post.
Lionel

Il y a bien un problème sur la remontée influxDB, les données sont toutes à zéros. Je vais voir ce qu'il se passe.

Jérôme

Salut Jérôme,

Merci, je suis content que cette version plaise 🙂

Effectivement, sur va V56.2.SD que je t'ai envoyé, les parties MQTT et InfluxDB fonctionnent bien en mode Historique 🙂 (Néanmoins, il est possible que j'ai laissé une petite coquille au niveau des mesures en mode Standard, corrigée dans le V56.3.X.SD, tu me diras 🙂 ).

Aucun problème pour la publier, mais attention à la stabilité en mode Standard.

Je suis actuellement dans la V56.3.3.SD, le chantier de la V56.3 consiste à s'attaquer à l'optimisation de tout ce qui se trouve dans les prises de mesure, le formatage et l'envoie des données du LinKy (+ ajout de la fonction MQTTDiscovery pour HA, et donc la bonne compréhension des paramètres, des unités, des modes de fonctionnements et des différents abonnement du LinKy pour être cohérent ).

Dans cette version, j'ai donc changé les méthodes d'inscription de données dans le JSON et les "Points" par des fonctions pour éviter les trèèèèèèès longues répétitions 🙂  Mais comme je n'ai pas encore bien saisie la notion de points avec InfluxDB et le fonctionnement de la lib, je fais sans doute une mauvaise manip 😉 Si tu me dit que les données reçus de ton coté sont toutes à "0", ca me donnes des pistes pour corriger le pb 🙂

Sébastien

Lionel has reacted to this post.
Lionel

Salut,

j'ai poussé un peu plus loin les tests et c'est bien que sur les nombre que les zéros survient. Pas de souci sur les strings, surement un formatage qui coince.

 

Re,

Ok, je vais regarder ça pour le formatage des variable 🙂

Pour le mode Historique, j'ai terminé les descriptions des différents éléments, mais j'ai quelques doutes sur certaines descriptions ou unités, je serais preneur d'une confirmation ^^

Je pense faire la découverte des différents éléments en fonction des paramètre du compteur (Mono ? Tri ? / Option tarifaire, etc ...) et masquer les paramètres qui ne concernent pas l'utilisateur ?

 Complétion pour les données du compteur Linky :
S'apprécie dans un IDE :
publishMQTTDiscovery(true, "Puissance Maximale "     +nameMQTTDiscovery, "PMAX",      "power",   "W",   icon_sensor_gr1); // PMAX - Puissance Maximale atteinte dans la journée. (Unité ? PA ou W ?)
publishMQTTDiscovery(true, "Heures Creuses "         +nameMQTTDiscovery, "HCHC",      "energy",  "kWh", icon_sensor_gr1); // HCHC - Signifie "Heures Creuses / Heures Creuses" et représente le compteur d'énergie consommée pendant les périodes d'heures creuses (kWatt-heure).
publishMQTTDiscovery(true, "Heures Pleines "         +nameMQTTDiscovery, "HCHP",      "energy",  "kWh", icon_sensor_gr1); // HCHP - Signifie "Heures Creuses / Heures Pleines" et représente le compteur d'énergie consommée pendant les périodes d'heures pleines (kWatt-heure).
publishMQTTDiscovery(true, "EJP Heures Normales "    +nameMQTTDiscovery, "EJPHN",     "energy",  "kWh", icon_sensor_gr1); // EJPHN - Signifie "Effacement Jour de Pointe, Heures Normales" et représente le compteur d'énergie consommée pendant les périodes normales (hors jours EJP) pour les clients ayant souscrit à l'option EJP. (KWh)
publishMQTTDiscovery(true, "EJP Heures de Pointe "   +nameMQTTDiscovery, "EJPHPM",    "energy",  "kWh", icon_sensor_gr1); // EJPHPM - Signifie "Effacement Jour de Pointe, Heures de Pointe Mobile" et représente le compteur d'énergie consommée pendant les périodes de pointe des jours EJP. (k Watt-heure).
publishMQTTDiscovery(true, "Index Base "             +nameMQTTDiscovery, "BASE",      "energy",  "Wh",  icon_sensor_gr1); // BASE - variable BASE correspond à l'index de consommation pour les clients ayant souscrit à l'option tarifaire de base, aussi appelée "tarif bleu" ou "tarif réglementé" (kWh).
publishMQTTDiscovery(true, "Heures Creuses Bleu "    +nameMQTTDiscovery, "BBRHCJB",   "energy",  "kWh", icon_sensor_gr1); // BBRHCJB - Consommation heures creuses en période tarifaire Bleu (kWh).
publishMQTTDiscovery(true, "Heures Pleines Bleu "    +nameMQTTDiscovery, "BBRHPJB",   "energy",  "kWh", icon_sensor_gr1); // BBRHPJB - Consommation heures pleines en période tarifaire Bleu (kWh).
publishMQTTDiscovery(true, "Heures Creuses Blanc "   +nameMQTTDiscovery, "BBRHCJW",   "energy",  "kWh", icon_sensor_gr1); // BBRHCJW - Consommation heures creuses en période tarifaire Blanc (kWh).
publishMQTTDiscovery(true, "Heures Pleines Blanc "   +nameMQTTDiscovery, "BBRHPJW",   "energy",  "kWh", icon_sensor_gr1); // BBRHPJW - Consommation heures pleines en période tarifaire Blanc (kWh).
publishMQTTDiscovery(true, "Heures Creuses Rouge "   +nameMQTTDiscovery, "BBRHCJR",   "energy",  "kWh", icon_sensor_gr1); // BBRHCJR - Consommation heures creuses en période tarifaire Rouge (kWh).
publishMQTTDiscovery(true, "Heures Pleines Rouge "   +nameMQTTDiscovery, "BBRHPJR",   "energy",  "kWh", icon_sensor_gr1); // BBRHPJR - Consommation heures pleines en période tarifaire Rouge (kWh).
publishMQTTDiscovery(true, "Intensité Maximale "     +nameMQTTDiscovery, "IMAX",      "current", "A",   icon_sensor_gr1); // IMAX, indique simplement la capacité maximale de mesure du compteur en mono (sera toujours = à 90A).
publishMQTTDiscovery(true, "Intensité Max Phase 1 "  +nameMQTTDiscovery, "IMAX1",     "current", "A",   icon_sensor_gr1); // IMAX1 - indique simplement la capacité maximale de mesure de la phase 1 du compteur en tri (sera toujours = à 60A).
publishMQTTDiscovery(true, "Intensité Max Phase 2 "  +nameMQTTDiscovery, "IMAX2",     "current", "A",   icon_sensor_gr1); // IMAX2 - indique simplement la capacité maximale de mesure de la phase 2 du compteur en tri (sera toujours = à 60A).
publishMQTTDiscovery(true, "Intensité Max Phase 3 "  +nameMQTTDiscovery, "IMAX3",     "current", "A",   icon_sensor_gr1); // IMAX3 - indique simplement la capacité maximale de mesure de la phase 3 du compteur en tri (sera toujours = à 60A).
publishMQTTDiscovery(true, "Intensité Souscrite "    +nameMQTTDiscovery, "ISOUSC",    "current", "A",   icon_sensor_gr1); // ISOUSC Signifie "Intensité SOUSCrite" et représente l'intensité maximale que votre contrat d'électricité vous autorise à utiliser (A)
publishMQTTDiscovery(true, "???"                     +nameMQTTDiscovery, "PEJP",      "??",      "?",   icon_sensor_gr1); // PEJP ???? //EJP n'est plus comercialisée depuis 1998 et est utilisée uniquement pour les clients qui auraient encore ce type de contract
publishMQTTDiscovery(true, "Intensité instantanée "  +nameMQTTDiscovery, "IINST",     "current", "A",   icon_sensor_gr1); // IINST signifie "Intensité INSTantanée" et indique l'intensité électrique consommée en temps réel sur compteur mono (en A).
publishMQTTDiscovery(true, "Intensité Phase 1 "      +nameMQTTDiscovery, "IINST1",    "current", "A",   icon_sensor_gr1); // IINST1 - Signifie "Intensité INSTantanée" sur la phase 1 et indique l'intensité électrique consommée en temps réel sur la phase 1 du compteur tri (en A).
publishMQTTDiscovery(true, "Intensité Phase 2 "      +nameMQTTDiscovery, "IINST2",    "current", "A",   icon_sensor_gr1); // IINST2 - Signifie "Intensité INSTantanée" sur la phase 2 et indique l'intensité électrique consommée en temps réel sur la phase 2 du compteur tri (en A).
publishMQTTDiscovery(true, "Intensité Phase 3 "      +nameMQTTDiscovery, "IINST3",    "current", "A",   icon_sensor_gr1); // IINST3 - Signifie "Intensité INSTantanée" sur la phase 3 et indique l'intensité électrique consommée en temps réel sur la phase 3 du compteur tri (en A).
publishMQTTDiscovery(true, "Avertissement puissance "+nameMQTTDiscovery, "ADPS",      "problem", "",    icon_sensor_gr2); // ADPS - Pour Avertissement de Dépassement de Puissance Souscrite, Si la puissance appelée dépasse pendant plus de 1 seconde la puissance souscrite, ADPS s'active. Après l'avertissement, si la surconsommation persiste pendant 19 secondes supplémentaires, le compteur coupe l'alimentation.
publishMQTTDiscovery(true, "Puissance Apparente "    +nameMQTTDiscovery, "PAPP",      "power",   "VA",  icon_sensor_gr1); // PAPP signifie "Puissance APParente" et indique la puissance électrique consommée en temps réel (VA).
publishMQTTDiscovery(true, "État Compteur "          +nameMQTTDiscovery, "MOTDETAT",  "none",    "",    icon_sensor_gr1); // Le MOTDETAT est une chaîne de 6 caractères qui fournit des informations sur l'état de fonctionnement du compteur Linky. Quelques exemples : 000000 : État normal, pas de défaut. / 000001 : Surtension sur l’une des phases (seulement pour le triphasé). / 000002 : Défaut de sous-tension. / 000003 : Défaut de communication. / 000100 : Déclenchement de l’alimentation pour cause de dépassement de puissance souscrite.
publishMQTTDiscovery(true, "Prévision Tarifaire "    +nameMQTTDiscovery, "DEMAIN",    "none",    "",    icon_sensor_gr3); // DEMAIN - Prévision du tarif pour le lendemain (Genéralement maj le soir). Pour l'option Tempo : BLEU, BLANC ou ROUGE / Pour l'option EJP : EJP ou NON EJP
publishMQTTDiscovery(true, "Période Tarifaire "      +nameMQTTDiscovery, "PTEC",      "none",    "",    icon_sensor_gr1); // PTEC signifie "Période Tarifaire en Cours". Cette variable indique la période tarifaire actuelle appliquée par le compteur. / Pour l'option Base : "TH.." / Pour l'option Heures Creuses/Heures Pleines : "HC.." ou "HP.." / Pour l'option Tempo : "HCJB", "HPJB", "HCJW", "HPJW", "HCJR", "HPJR" / Pour l'option EJP : "HN.." ou "PM.."
publishMQTTDiscovery(true, "Adresse du Compteur "    +nameMQTTDiscovery, "ADCO",      "none",    "",    icon_sensor_gr3); // ADCO - Signification : ADCO signifie "ADresse du COmpteur". C'est une chaîne de 12 caractères alphanumériques.
publishMQTTDiscovery(true, "Option Tarifaire "       +nameMQTTDiscovery, "OPTARIF",   "none",    "",    icon_sensor_gr3); // OPTARIF signifie "OPTion TARIFaire". Fonction : Cette variable indique l'option tarifaire choisie par le client pour son contrat d'électricité. Exemple : "BASE" pour le tarif de base / "HC.." pour l'option Heures Creuses/Heures Pleines / "EJP." pour l'option Effacement Jours de Pointe / "BBRx" pour l'option Tempo (où x peut être S, T ou U selon la version)
publishMQTTDiscovery(true, "Programmation horaire"   +nameMQTTDiscovery, "HHPHC",     "none",    "",    icon_sensor_gr3); // HHPHC signifie "Horaire Heures Pleines Heures Creuses". Fonction : Cette variable indique la programmation horaire des périodes tarifaires Heures Pleines (HP) et Heures Creuses (HC) sur le compteur. HHPHC est généralement représenté par un seul caractère alphabétique. Valeurs possibles : A : pas d'heures creuses / C : heures creuses de 22h à 6h / D : heures creuses de 23h à 7h / E : heures creuses de 22h30 à 6h30 / Y : autres cas (heures creuses sur mesure)

 

Pour le formatage des variables, j'ai fait quelque chose de vite fait dans un premiers temps (mais ca sera simplifié et beaucoup plus lisible, une fois que ca fonctionne), avec ce que j'ai compris des formats de variables. Mais je ne sais pas ce qu'attends la base InfluxDB comme formats pour chaque variables, si tu peux y jeter un coups d'œil à l'occasion ? 🙂

S'apprécie dans un IDE :

IfOkString(true, "ModeTic", "Historique");
  IfOkString(true, "FWVersion", FWVersion);
  IfOkString(true, "BoardVersion", BoardVersion);
  IfOkString(true, "ADCO", ADCO);
  IfOkString(true, "OPTARIF", OPTARIF);
  IfOkInt(true, "ISOUSC", ISOUSC);
  IfOkUnsignedLong(true, "BASE", BASE);
  IfOkUnsignedLong(okHCHP || okHCHC, "HCHC", HCHC);
  IfOkUnsignedLong(okHCHP || okHCHC, "HCHP", HCHP);
  IfOkUnsignedLong(okEJPHN || okEJPHPM, "EJPHN", EJPHN);
  IfOkUnsignedLong(okEJPHN || okEJPHPM, "EJPHPM", EJPHPM);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJB", BBRHCJB);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJB", BBRHPJB);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJW", BBRHCJW);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJW", BBRHPJW);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJR", BBRHCJR);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJR", BBRHPJR);
  IfOkUnsignedLong(okPMAX, "PMAX", PMAX);
  IfOkInt(okPEJP, "PEJP", PEJP);
  IfOkString(okPTEC, "PTEC", PTEC);
  IfOkString(okDEMAIN, "DEMAIN", DEMAIN);
  IfOkInt(okIINST, "IINST", IINST);
  IfOkInt(okIINST1, "IINST1", IINST1);
  IfOkInt(okIINST2, "IINST2", IINST2);
  IfOkInt(okIINST3, "IINST3", IINST3);
  IfOkInt(okIMAX, "IMAX", IMAX);
  IfOkInt(okIMAX1, "IMAX1", IMAX1);
  IfOkInt(okIMAX2, "IMAX2", IMAX2);
  IfOkInt(okIMAX3, "IMAX3", IMAX3);
  IfOkInt(okADPS, "ADPS", ADPS);
  IfOkInt(true, "PAPP", PAPP);
  IfOk(okHHPHC, "HHPHC", HHPHC);
  IfOkString(okMOTDETAT, "MOTDETAT", MOTDETAT);
  IfOkLong(true, "RSSI", WiFi.RSSI());
  IfOkUnsignedLong(true, "TimeStartup", timestartup);
  IfOkUnsignedLong(true, "TimeDecode", timedecode);
  IfOkLong(true, "TimePrepa", MQAll);
  IfOkUnsignedLong(true, "TimeConn", timeconnexion);
  IfOkBool(true, "UseOptimWifi", useoptimwifi);
  IfOkInt(true, "MidTryWifiCon", midtrywificon);
  IfOkInt(true, "OffsetDeepsleep", DeepSleepSecondsOpti);
  IfOkBool(true, "UseLed", useled);

 

// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkUnsignedLong(bool condition, const char* fieldName, unsigned long fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
void IfOkString(bool condition, const char* fieldName, String fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = fieldValue;
  }
}
void IfOkChar(bool condition, const char* fieldName, char fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkInt(bool condition, const char* fieldName, int fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOk(bool condition, const char* fieldName, int fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkLong(bool condition, const char* fieldName, long fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkBool(bool condition, const char* fieldName, bool fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}

 

Mais je crois avoir trouvé le problème, je passe les infos de l'objet 'sensor' dans une fonction d'envoi influxDB, et je pense avoir fait une erreur ici (je refais un essais d'ici demain).

Lionel has reacted to this post.
Lionel

Bonsoir,

Aux nouvelles, j'ai encore pas mal de soucis côté InfluxDB, je ne comprends pas trop tout ce que le serveur attends comme types de données ...

Par exemple, lorsque j'envoie :

[InfluxDB] Envoi de données par influxDB ...
[Debug] Affichage des données du capteur :
Tags et Fields : xKy MacAdress="xky-XX:X:XX:XX:XX:XX",ModeTic="Historique",FWVersion="V56.3.4.SD",BoardVersion="ESP8266",ADCO="000000000000",OPTARIF="BBR.",ISOUSC=0i,BASE=0i,PAPP=0i,RSSI=-27i,TimeStartup=12989i,TimeDecode=690129i,TimePrepa=690129i,TimeConn=690450i,UseOptimWifi=false,MidTryWifiCon=150i,OffsetDeepsleep=10000000i,UseLed=false
[InfluxDB] ... exit !
Il n'y a aucune valeur qui s'affiche dans Grafana ... même pas le numéro de version alors que c'est un type String et qu'il semble correcte ... je suis un peu dérouté 
Sinon, la partie MQTTDiscov. avance bien :)


 

Bonsoir,

je pense que c'est la construction de la demande qui est pas bonne. Est-ce que cela est possible d'avoir le code de concaténation du Point?

Techniquement je fais de la façon suivante:

#include <InfluxDbClient.h>
char* EASF01;
char* EASF02;
............
Point sensor("xKy");
sensor.clearFields();
sensor.addField("ModeTic", "Standard");
sensor.addField("HCHC", atoi(String(EASF01).c_str()));
sensor.addField("HCHP", atoi(String(EASF02).c_str()));
....
InfluxDBClient clientinflux(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
clientinflux.setInsecure();
boolean influxconnec = 0;
    boolean writeok = 0;
    while (!influxconnec) {
      influxconnec = clientinflux.validateConnection();
      delay(100);
    }
    while (!writeok) {
      writeok = clientinflux.writePoint(sensor);
      delay(100);
    }

Re,

J'avais mis le code de concaténation du Point au poste #16, mais je le remets ici 🙂

 

Pour la partie MQTT, c'est simple puisque toute les données sont uniformes (en string).

Pour la partie InfluxDB, je n'arrive pas à comprendre qui est un string, qui est un int, qui est un long int, etc .... Voila ma tentative (qui n'est pas encore bien optimisée, mais qui attends d'être fonctionnel pour l'être) :

 

Après la prise de mesure :

 

dataConstructHistoriqueMode();
if (useinflux == 1) { //Verif si utilisation de influx db est activée :
  publishInfluxDB(sensor); // Envoie les données par influxDB
}

 

La mise en forme des variables :

faire dérouler

void dataConstructHistoriqueMode(){
  sensor.clearFields(); //réinitialiser tous les champs précédemment ajoutés à l'objet sensor
  IfOkString(true, "MacAdress", adressmacesp);
  IfOkString(true, "ModeTic", "Historique");
  IfOkString(true, "FWVersion", FWVersion);
  IfOkString(true, "BoardVersion", BoardVersion);
  IfOkString(true, "ADCO", ADCO);
  IfOkString(true, "OPTARIF", OPTARIF);
  IfOkInt(true, "ISOUSC", ISOUSC);
  IfOkUnsignedLong(true, "BASE", BASE);
  IfOkUnsignedLong(okHCHP || okHCHC, "HCHC", HCHC);
  IfOkUnsignedLong(okHCHP || okHCHC, "HCHP", HCHP);
  IfOkUnsignedLong(okEJPHN || okEJPHPM, "EJPHN", EJPHN);
  IfOkUnsignedLong(okEJPHN || okEJPHPM, "EJPHPM", EJPHPM);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJB", BBRHCJB);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJB", BBRHPJB);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJW", BBRHCJW);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJW", BBRHPJW);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHCJR", BBRHCJR);
  IfOkUnsignedLong(okBBRHCJB || okBBRHPJB || okBBRHCJW || okBBRHPJW || okBBRHCJR || okBBRHPJR, "BBRHPJR", BBRHPJR);
  IfOkUnsignedLong(okPMAX, "PMAX", PMAX);
  IfOkInt(okPEJP, "PEJP", PEJP);
  IfOkString(okPTEC, "PTEC", PTEC);
  IfOkString(okDEMAIN, "DEMAIN", DEMAIN);
  IfOkInt(okIINST, "IINST", IINST);
  IfOkInt(okIINST1, "IINST1", IINST1);
  IfOkInt(okIINST2, "IINST2", IINST2);
  IfOkInt(okIINST3, "IINST3", IINST3);
  IfOkInt(okIMAX, "IMAX", IMAX);
  IfOkInt(okIMAX1, "IMAX1", IMAX1);
  IfOkInt(okIMAX2, "IMAX2", IMAX2);
  IfOkInt(okIMAX3, "IMAX3", IMAX3);
  IfOkInt(okADPS, "ADPS", ADPS);
  IfOkInt(true, "PAPP", PAPP);
  IfOk(okHHPHC, "HHPHC", HHPHC);
  IfOkString(okMOTDETAT, "MOTDETAT", MOTDETAT);
  IfOkLong(true, "RSSI", WiFi.RSSI());
  IfOkUnsignedLong(true, "TimeStartup", timestartup);
  IfOkUnsignedLong(true, "TimeDecode", timedecode);
  IfOkLong(true, "TimePrepa", MQAll);
  IfOkUnsignedLong(true, "TimeConn", timeconnexion);
  IfOkBool(true, "UseOptimWifi", useoptimwifi);
  IfOkInt(true, "MidTryWifiCon", midtrywificon);
  IfOkInt(true, "OffsetDeepsleep", DeepSleepSecondsOpti);
  IfOkBool(true, "UseLed", useled);
  Serial.println("[DATA] Fin du formatage des données du LINKY");
  if (useled){digitalWrite(blueLED, LOW);}
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkUnsignedLong(bool condition, const char* fieldName, unsigned long fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
void IfOkString(bool condition, const char* fieldName, String fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = fieldValue;
  }
}
void IfOkChar(bool condition, const char* fieldName, char fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkInt(bool condition, const char* fieldName, int fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOk(bool condition, const char* fieldName, int fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkLong(bool condition, const char* fieldName, long fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
// Fonction pour ajouter des champs à sensor et JSONbuffer
void IfOkBool(bool condition, const char* fieldName, bool fieldValue) {
  if (condition) {
    sensor.addField(fieldName, fieldValue);
    JSONbuffer[fieldName] = String(fieldValue);
  }
}
.
.
.
Avec la fonction d'envoi (blindée, qui évite les blocages en cas de pb) :
void publishInfluxDB(Point& mySensor){
  Serial.println("[InfluxDB] Envoi de données par influxDB ...");
  // Création d'un client InfluxDB avec l'URL, l'organisation, le bucket et le token d'authentification
  InfluxDBClient clientinflux(INFLUXDB_URL, INFLUXDB_ORG, INFLUXDB_BUCKET, INFLUXDB_TOKEN);
  clientinflux.setInsecure();// Permet la connexion non sécurisée (pas de validation stricte du certificat SSL)
  boolean influxconnec = 0;  // Variable pour surveiller l'état de connexion à InfluxDB
  boolean writeok = 0;       // Variable pour surveiller si l'écriture du point de données est réussie
  // Affichage des informations du capteur
  Serial.println("[Debug] Affichage des données du capteur :");
  // Affiche les tags et champs configurés dans le point
  Serial.print("Tags et Fields : ");
  Serial.println(mySensor.toLineProtocol()); // toLineProtocol() affiche tout en format ligne protocole
  const int maxAttempts = 10; // Nombre maximum de tentatives
  int attempt = 0;
  influxconnec = clientinflux.validateConnection();
  while (attempt >= maxAttempts) {
    if(influxconnec){ // Si l'envoi fonctionne
          Serial.println("[InfluxDB] Connecté à InfluxDB !");
          attempt = maxAttempts;
    }else{
      attempt++;
      Serial.println("[InfluxDB] Attempt "+String(attempt)+" failed. Retrying...");
      Serial.println("[InfluxDB] Connexion échouée. Erreur : " +String(clientinflux.getLastErrorMessage()));
      delay(500); // Pause entre chaque tentative
    }
  }
  attempt = 0;
  while (attempt >= maxAttempts) {
    Serial.print("[InfluxDB] Vérification de la mémoire disponible :");
    Serial.println(String(ESP.getFreeHeap()));
    writeok = clientinflux.writePoint(mySensor);
    if(writeok){ // Si l'envoi fonctionne
          Serial.println("[InfluxDB] Data send !");
          attempt = maxAttempts;
    }else{
      attempt++;
      Serial.println("[InfluxDB] Data, attempt "+String(attempt)+" failed. Retrying...");
      Serial.println("[InfluxDB] Échec de l'envoi. Erreur : "+String(clientinflux.getLastErrorMessage()));
      delay(200); // Pause entre chaque tentative
    }
  }
  Serial.println("[InfluxDB] ... exit !");
}
Lionel has reacted to this post.
Lionel
PreviousPage 2 of 2