Réception données MQTT et temps réel

Bonjour,
Je récupère des valeurs de mesures d’énergie par un arduino via MQTT et par l’intermédiaire de node-red (je n’ai pas trouvé plus simple pour le moment).
ça marche très bien, j’obtiens des valeurs instantanées. Seulement l’onlget temps réel est accaparé par ces valeurs, et je ne vois rien d’autres comme les lancement de scénario, etc.
Est-ce qu’il est possible d’exclure ces commandes d’énergie dans la timeline ? pourtant dans les configurations des commandes, je n’ai pas coché « suivre dans la timeline ».

Je vous remercie par avance.
Julien

A quel fréquence ?
A tu pensé dans ton code arduino a n’envoyer des données que si elles change ?
Quel est la précision de ta mesure ?
Si ce sont des Watts par exemple n’envoyer que des arrondis a 10 Watts prés …

Bonjour Olive,
En effet, le plus simple est de gérer dans le code arduino : peut être de mettre un delay de 10s déjà ?
Je mesure à 1 W près, c’est inutile c’est vrai. Pour le moment, je ne sais pas arrondir, ni envoyer que si les mesures changent.
Je vais me renseigner (ou tu as le code sous la main :slight_smile: ?)

Sinon du côté de jeedom, pas de possibilités ?

Ben ce serait plus simple que tu copie ici a l’aide du picto </>
le code que tu utilise sur ton arduino !

1 « J'aime »

Bonjour @Geangean
Si tu veux de l’aide sur ton programme passe nous le code.
Tu as plusieurs pistes :
-une condition de temps écoulé pour publier toutes les x minutes ou secondes.
-une condition de temps écoulé pour publier toutes les x minutes ou secondes OU sur un hystérésis autour de ta mesure.
Plein de choix s’offrent à toi.

Mais @olive à raison sans code …

1 « J'aime »

Bonjour, Merci pour votre bienveillance.
Bien sûr que je peu vous donner le code, surtout que ce n’est pas le mien, je l’ai emprunté à Barnabé Chaillot pour l’auto consommation photovoltaique (vidéos YouTube)!


                                 //--------PROGRAMME POUR OPTIMISER AUTOTONSOMMATION PHOTOVOLTAIQUE---------------------------------------
//---1ere partie c'est la  mesure des valeurs Volt_1 et Ampere_1---------------------------------------------------
//---2eme partie, Calculer les watts instantanés,les wattheures cumulés, les kWh et envoyer les valeurs sur un écran LCD
//---3eme partie, Gerer le servo moteur --------------------------------------------------------------------------
//---4eme Partie, Pour 2 autres pinces amperemetriques------------------------------------------------------------
//---5eme partie, gestion de differents affichages avec bouton poussoir sur un meme ecran LCD 2 lignes ---------------

#include "EmonLib.h"             // 1 Pour inclure la librairie "EmonLib.h", aller dans le menu "croquis" puis "inclure une bibliothèque" 
// 1 puis "gérer les bibliothèques ". Une fois la librairie trouvée, appuyer sur "More info" puis " Installer"
EnergyMonitor emon1;             // 1 Creer une instance qui s'appelle emon1 (on s'en servira si on veut installer plusieurs pinces ampèremétriques)
EnergyMonitor emon2;             // 4 Idem que dessus pour une deuxième pince amperemetrique
EnergyMonitor emon3;             // 4 Idem que dessus pour une troisième pince amperemetrique

#include <Wire.h>                        // 2 inclure la librairie "wire.h" (si elle n'existe pas dans la bibliothèque, faire comme expliqué pour EmonLib.h
//#include <LiquidCrystal_I2C.h>           // 2 inclure la librairie "LiquidCrystal_I2C.h" 
////LiquidCrystal_I2C lcd(0x27, 16, 4);    // 2 définir l'adresse de l'écran LCD, le nombre de caractères et le nombre de lignes
//LiquidCrystal_I2C lcd(0x3f, 16, 2);      // 2 Si Le LCD ne fonctionne pas, alors mettre // sur la ligne précédente et enlever les // sur cette ligne

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//#include <Servo.h>                       // 3 inclure la librairie "Servo.h"
//Servo myservo;                           // 3 Création de l'objet Servo pour controler Servo
//float pos = 0;                           // 3 Creation de la variable (flottante)qui donnera la position du servo


const int led = 6;                       // 6  valeur finale auquel la led va s'allumer  de 0(éteint) à 250 (allumé à fond)
int intensite_led = 0;                   // 6  Variable intermédiaire  de l'intensité de la led

float w_instantane_in = 0;            // 2 Creation de la variable flottante "puissance instantanée" qui rentre (en watt) initialisée à la valeur 0
float kwh_cumule_in = 0;              // 2' Création de la variable flottante correspondant au Kilo Watt heure "consommé" cumulés initialisé à 0

float w_instantane_out = 0;           // 2 Creation de la variable flottante "puissance instantanée" qui sort (negative) en watt initialisée à la valeur 0
float kwh_cumule_out = 0;             // 2' Création de la variable flottante correspondant au Kilo Watt heure "surproduction" cumulés initialisé à 0

float w_Chauffe_Eau_1 = 0;             // 4 Creation de la variable flottante "puissance instantanée2" 2ième pince ampèrmétrique, initialisée à la valeur 0
float kwh_Chauffe_Eau_1 = 0;           // 4 Creation de la variable flottante "puissance cumulée2" qui rentre en Kilowattheure initialisée à la valeur 0

const int pin_bouton_changer_ecran=9;  //5 numéro de la pin du bouton poussoir qui sert à changer d'écran
int impulsion = 0;                     //5 creation de la variable impulsion
int compteur_impulsion = 1;            //5 compteur du nombre d'impulsion effectué sur le bouton poussoir, variable qui va servir pour le changement d'affichage


unsigned long previous_millis = 0;   // 2 création de la variable "previous_millis" qui garde en mémoire le temps qui s'écoule en millièmes de seconde"

//-----------------------INITIALISATION DU PROGRAMME-------------------------------------------------

void setup()
{
  Serial.begin(115200);                 // 1 Création du port série pour que l'arduino puisse envoyer des infos vers l'ordinateur

  emon1.voltage(2, 228, 1.7);      //avec 5V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
 // emon1.voltage(0, 125, 1.7);      //avec 3.3V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
  emon1.current(1, 88);          //avec 3.3V   // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)
 // emon1.current(1, 1);             // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)

    emon2.voltage(2, 228, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
    emon2.current(3, 29);             // 4 Initialisation du Courant en ampère ( Pin A3, Valeur à changer lors de l'etalonnage)
  //
  //  emon3.voltage(2, 357, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
  //  emon3.current(6, 28.5);             // 4 Initialisation du Courant en ampère ( Pin A6, Valeur à changer lors de l'etalonnage)

 // lcd.init();                         // 2 initialisation de l'afficheur LCD
lcd.begin(16,2);
  //myservo.attach(5);                   // 3 On attache l'objet servo à la Pin D5

 pinMode(led, OUTPUT);                // 6 La broche sur lequel est la variable led est une sortie 

 pinMode(pin_bouton_changer_ecran, INPUT_PULLUP);   //5 Le bouton poussoir est une entrée forcé à 0V si on appuis pas et à 5V  si on appuie
}

//----------------------- DEMARRAGE DE LA BOUCLE----------------------------------------------------

void loop()
{
  float puissance_reelle1 = emon1.realPower;   //1 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
//   Serial.print("{\"puiss\":");
//   Serial.print(puissance_reelle1);                                                         
//   Serial.println("}");
   //delay(500);
    float puissance_reelle2 = emon2.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
   // float puissance_reelle3 = emon3.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"

  float verif_voltage    = emon1.Vrms;        //1 creation de la variable "volts moyen" (mesurable avec un voltmètre pour l'etalonnage)
  float verif_ampere     = emon1.Irms;        //1 creation de la variable "Ampères Moyen" (mesurable avec une pince ampèremétrique pour l'etalonnage))

  emon1.calcVI(20, 2000);                     // 1 Demande a Emonlib de tout calculer,  (puissance relle, volts moyen, ampère moyen et facteur de puissance)
  emon2.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la deuxième pince ampèrmétrique (si on met 40 au lieu de 20, ca va moins vite)
  //emon3.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la troisième pince ampèrmétrique (et du coup c'est plus lisible sur le LCD)

  //emon1.serialprint();                      // (1) Si on ecrit cette ligne , toutes les valeurs calculées precedemment sont envoyées vers l'ordinateur

  //--------------------------Etalonnage des volts et ampères sans LCD--------------------------------------

//  Serial.print("Est-ce le bon voltage? ");      // 1 envoyer vers l'ordinateur le texte " Est-ce le bon voltage? "
//  Serial.print(verif_voltage);                  // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.print(" V  ");                         // 1 envoyer vers l'ordinateur le caractère "V"
//  Serial.print(verif_ampere);                   // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.println(" A ");                          // 1 envoyer vers l'ordinateur le caractère "A"
//  Serial.println(intensite_led);
//delay(1000);
  //----------------POUR AVOIR LES W, Wh et kWh de l'élélectricité qui rentre et de l'électricité qui sort de ma maison------------------

  if (puissance_reelle1 >= 0)                      // 2 Si la puissance reelle est positive, (c'est que je consomme et qu'a priori il n'y a pas de soleil)
  {
    w_instantane_in = puissance_reelle1;      // 2 alors on dit que la puissance instantanée entrante (in) est egale à la puissance reelle.
    w_instantane_out = 0;                     // 2 dans ces conditions de consommation (positive) , la valeur de la surproduction est nulle.

    kwh_cumule_in = kwh_cumule_in + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
    // 2 La valeur cumulée consommée (entrante) = La valeur cumulée consommée précédente,
    // 2 plus la puissance reelle multipliée par le temps écoulé entre millis et previous millis
    // 2 que divise 3600 (nb secondes / heure) et encore par 1000 car millis compte les millièmes de seconde
    // 2 et encore par mille car ce sont les kWh et non les Wh qui m'intêresse.
  }

  else                                             // 2 SINON (c'est que la puissance_reelle est négative)
  {
    w_instantane_in = 0;                       // 2 idem au dessus
    w_instantane_out = puissance_reelle1; // 2 idem au dessus

    kwh_cumule_out = kwh_cumule_out + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
  }

  // ----------------------Pour avoir les w, wh et kwh production solaire et consommation chauffe eau------

  
      w_Chauffe_Eau_1 = puissance_reelle2;        //4 idem au dessus mais la pince ampèremetrique branché sur la conso du chauffe eau
      kwh_Chauffe_Eau_1 = kwh_Chauffe_Eau_1 + puissance_reelle2 * (millis() - previous_millis) / 3600000/ 1000;


  previous_millis = millis();               // 2 Demandons a la variable previous_millis de garder en memoire la valeur de millis (le tps qui s'écoule)

 //-------------------------------------Si il y a des Watts , balance en dans le chauffe eau---------------------------------

  if (puissance_reelle1 <= 100 && intensite_led < 230) //6 si la puissance sonsommée est inférieur à 1w, et que la led n'est mas à son maximum
  {intensite_led += 5;                               // 6 augmenter l'intensité lumineuse de 5
  analogWrite(led, intensite_led);}                  //6 la led va s'éclairer au niveau de la valeur de intensite_led
  //delay(1000);

  //Serial.println(intensite_led);
  if(puissance_reelle1 >= 100 && intensite_led > 0)  //6 inversement, si la conso en watt est supérieur à 100 et et que la led n'est pas à son minimum
  {intensite_led -= 5;                               //6 diminue alors l'intensité de la led
  analogWrite(led, intensite_led);}                 // 6 la led va s'éclairer au niveau de la valeur de intensite_led

  // --------------------ECRIRE SUR LCD ET POUR CHANGER LES VALEUR DuLCD AVEC UN BOUTON POUSSOIR------------------------------------------------

  //lcd.backlight();                // 2 Allumer l'écran LCD
  lcd.clear();                    // 2 rafraichir l'écran LCD ( efface les données précédentes)


   impulsion = digitalRead(pin_bouton_changer_ecran);               //5 Demande à "impulsion" de prendre la valeur de "pin_bouton_changer_ecran"
    if (impulsion == 0) compteur_impulsion = compteur_impulsion + 1; //5 On incrémente le compteur d'impulsion s'il y a une impulsion sur le bouton
  //Serial.print(compteur_impulsion);
    if (compteur_impulsion == 1)                                     //5 Si le compteur d'impulsion est égale à 1 on affiche le premier écran
          {
  //-----Ecran n°1:-------------------------------

  //1ere ligne, watt entrant et watts sortant----
  lcd.setCursor(0, 0);               // 4 positionner le curseur sur la ligne 1 et à gauche
  lcd.print("In ");   // 4 ecrire "In " pour comprendre qu'il s'agit de la consommation
  lcd.print(w_instantane_in, 0);     // 4 puis écrire la valeur positive de la consommation au compteur EDF avec 2 chiffre derière la virgule
  lcd.setCursor(9, 0);               // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 8
  lcd.print(w_instantane_out, 0);     // 4 ecrire la valeur de w_instantane_out (c'est la surproduction) avec 2 chiffre derière la virgule



  //2eme ligne, Watt solaire et watts chauffe eau
  lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et à gauche
  lcd.print(w_Chauffe_Eau_1, 0);          // 4 puis écrire la valeur de la surproduction visible par EDF avec les compteurs electroniques (sans les virgules)
  lcd.setCursor(9, 1);              // 4 Rester sur la ligne 2 mais curseur position 8
  //lcd.print(w_Chauffe_Eau_2, 0);      // 4 puis écrire à la suite la valeur de la surproduction en Wh avec un chiffre derrière la virgule
          }
  //
   else if (compteur_impulsion == 2) //5 Sinon s'il est égale à 2 on affiche l'écran numéro 2
          {
          //Serial.print(compteur_impulsion);  
          // -----ECRAN N°2:-------------------------------
          //1ere ligne, kWh entrant et KkWh sortant--------
          lcd.setCursor(0, 0);            // 4 positionner le curseur sur la ligne 1 et à gauche
          lcd.print("2 ");                // 4 ecrire "2" pour comprendre que nous sommes sur l'écran n°2
          lcd.print(kwh_cumule_in,4);     // 4 puis écrire la valeur de la consommation en kWh avec 4 chiffres derrière la virgule
          lcd.setCursor(8, 0);            // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 9
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          lcd.print(kwh_cumule_out,4);    // 4 ecrire la valeur des Watts cumulé en kWh, c'est la valeur de la surproduction
  
          //2eme ligne, KWh solaire et kWh chauffe eau
          lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et position 2
          lcd.print(kwh_Chauffe_Eau_1,4);         // 4 puis écrire la valeur de la production cumulée de mes panneaux solaire en kWh
          lcd.setCursor(8, 1);              // 4 rester sur la ligne 2 mais positionner le curseur en position 2
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          //lcd.print(kwh_Chauffe_Eau_2,4);     // 4 puis écrire la consomation cumulée de mon chauffe eau en Kwh
          }
  
   else if (compteur_impulsion == 3)      // 5 si on a appuié 3 fois sur le bouton poussoir,
          {
           // Serial.print(compteur_impulsion);
          compteur_impulsion = 1;          // 5 alors on remet le compteur à 0 et on retrouve l'écran n°1
          }
  Serial.print(w_instantane_in);
  Serial.print(";");
  Serial.print(w_instantane_out);
  Serial.print(";");
  Serial.print(w_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(kwh_cumule_in);
  Serial.print(";");
  Serial.print(kwh_cumule_out);
  Serial.print(";");
  Serial.print(kwh_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(intensite_led);
  Serial.print("\n");
  delay(500);


}                                 // FIN DU PROGRAMME


C’est un peu long désolé.
Merci 
Julien

Bonsoir,
Je regarde ça ce week end…
Vous souhaiter simplement temporisé l’envoi des donnée à MQTT si oui de combien de temps ?
Désirez Vous mettre à jour sur une chute ou monté rapide si oui de combien ?

pour répondre à votre première question le timeline :
Il faut vérifier que dans les paramètres de votre information vous n’avez pas suivre dans la timeline de coché.
un exemple :


bien en tendu il faut le vérifier aussi sur l’info qui pourrait être sur un virtuel.

Bonne soirée à très vite.

si tu recupere les données sur la liaison serie en fin de programme tu a un

delay(500);

cela correspond a .0.5 secondes

essai de changer par

delay(5000);

ça va ralentir l’envoi dans un premiers temps.

Je réfléchi pour la suite dit moi quels informations tu récupère parmi :

w_instantane_in
w_instantane_out
w_Chauffe_Eau_1
kwh_cumule_in
kwh_cumule_out
kwh_Chauffe_Eau_1
intensite_led

Tu doit aussi avoir un autre morceau de code pour faire la liaison mqtt ?

Bonjour,
J’ai regardé, je vous envoie le code en MP, je vous laisse le remettre ici si la modification vous convient pour le partager ou nous tenir au courant :yum:

Bonne jounée

Bonjour,
Merci pour vos propositions, je vais tenter la modification de @PanoLyon PanoLyon et je vous tiens au courant.
Sinon en effet, je pensais rajouter du « delay » mais cela mets en sommeil le programme.
@olive : l’envoie par MQTT se fait via node red qui récupère les données de la voie série.

Si votre port série n’envoie rien ça met en sommeil votre partie NodeRed ou votre carte ? je ne vois pas !
Quelle type de carte utilisez vous ?

Et alors on peut aussi faire autrement ajouter un compteur avec une variable globale en plus
qui n’envoi les données que 1 fois sur 10 par exemple …

Nouveau Code

                                 //--------PROGRAMME POUR OPTIMISER AUTOTONSOMMATION PHOTOVOLTAIQUE---------------------------------------
//---1ere partie c'est la  mesure des valeurs Volt_1 et Ampere_1---------------------------------------------------
//---2eme partie, Calculer les watts instantanés,les wattheures cumulés, les kWh et envoyer les valeurs sur un écran LCD
//---3eme partie, Gerer le servo moteur --------------------------------------------------------------------------
//---4eme Partie, Pour 2 autres pinces amperemetriques------------------------------------------------------------
//---5eme partie, gestion de differents affichages avec bouton poussoir sur un meme ecran LCD 2 lignes ---------------

#include "EmonLib.h"             // 1 Pour inclure la librairie "EmonLib.h", aller dans le menu "croquis" puis "inclure une bibliothèque" 
// 1 puis "gérer les bibliothèques ". Une fois la librairie trouvée, appuyer sur "More info" puis " Installer"
EnergyMonitor emon1;             // 1 Creer une instance qui s'appelle emon1 (on s'en servira si on veut installer plusieurs pinces ampèremétriques)
EnergyMonitor emon2;             // 4 Idem que dessus pour une deuxième pince amperemetrique
EnergyMonitor emon3;             // 4 Idem que dessus pour une troisième pince amperemetrique

#include <Wire.h>                        // 2 inclure la librairie "wire.h" (si elle n'existe pas dans la bibliothèque, faire comme expliqué pour EmonLib.h
//#include <LiquidCrystal_I2C.h>           // 2 inclure la librairie "LiquidCrystal_I2C.h" 
////LiquidCrystal_I2C lcd(0x27, 16, 4);    // 2 définir l'adresse de l'écran LCD, le nombre de caractères et le nombre de lignes
//LiquidCrystal_I2C lcd(0x3f, 16, 2);      // 2 Si Le LCD ne fonctionne pas, alors mettre // sur la ligne précédente et enlever les // sur cette ligne

#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

//#include <Servo.h>                       // 3 inclure la librairie "Servo.h"
//Servo myservo;                           // 3 Création de l'objet Servo pour controler Servo
//float pos = 0;                           // 3 Creation de la variable (flottante)qui donnera la position du servo


const int led = 6;                       // 6  valeur finale auquel la led va s'allumer  de 0(éteint) à 250 (allumé à fond)
int intensite_led = 0;                   // 6  Variable intermédiaire  de l'intensité de la led

float w_instantane_in = 0;            // 2 Creation de la variable flottante "puissance instantanée" qui rentre (en watt) initialisée à la valeur 0
float kwh_cumule_in = 0;              // 2' Création de la variable flottante correspondant au Kilo Watt heure "consommé" cumulés initialisé à 0

float w_instantane_out = 0;           // 2 Creation de la variable flottante "puissance instantanée" qui sort (negative) en watt initialisée à la valeur 0
float kwh_cumule_out = 0;             // 2' Création de la variable flottante correspondant au Kilo Watt heure "surproduction" cumulés initialisé à 0

float w_Chauffe_Eau_1 = 0;             // 4 Creation de la variable flottante "puissance instantanée2" 2ième pince ampèrmétrique, initialisée à la valeur 0
float kwh_Chauffe_Eau_1 = 0;           // 4 Creation de la variable flottante "puissance cumulée2" qui rentre en Kilowattheure initialisée à la valeur 0

const int pin_bouton_changer_ecran=9;  //5 numéro de la pin du bouton poussoir qui sert à changer d'écran
int impulsion = 0;                     //5 creation de la variable impulsion
int compteur_impulsion = 1;            //5 compteur du nombre d'impulsion effectué sur le bouton poussoir, variable qui va servir pour le changement d'affichage

//olive add
int boucle = 0 ; //compteur pour n'envoyer sur la sortie série qu'une fois sur X fois 
//


unsigned long previous_millis = 0;   // 2 création de la variable "previous_millis" qui garde en mémoire le temps qui s'écoule en millièmes de seconde"

//-----------------------INITIALISATION DU PROGRAMME-------------------------------------------------

void setup()
{
  Serial.begin(115200);                 // 1 Création du port série pour que l'arduino puisse envoyer des infos vers l'ordinateur

  emon1.voltage(2, 228, 1.7);      //avec 5V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
 // emon1.voltage(0, 125, 1.7);      //avec 3.3V   // 1 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage (+/-357 pour 6v et +/- 190 pour 12v))
  emon1.current(1, 88);          //avec 3.3V   // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)
 // emon1.current(1, 1);             // 1 Initialisation du Courant en ampère ( Pin A1, Valeur à changer lors de l'etalonnage)

    emon2.voltage(2, 228, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
    emon2.current(3, 29);             // 4 Initialisation du Courant en ampère ( Pin A3, Valeur à changer lors de l'etalonnage)
  //
  //  emon3.voltage(2, 357, 1.7);         // 4 Initialisation du Voltage (Pin A2, Valeur à changer pour etalonnage, phase_shift)
  //  emon3.current(6, 28.5);             // 4 Initialisation du Courant en ampère ( Pin A6, Valeur à changer lors de l'etalonnage)

 // lcd.init();                         // 2 initialisation de l'afficheur LCD
lcd.begin(16,2);
  //myservo.attach(5);                   // 3 On attache l'objet servo à la Pin D5

 pinMode(led, OUTPUT);                // 6 La broche sur lequel est la variable led est une sortie 

 pinMode(pin_bouton_changer_ecran, INPUT_PULLUP);   //5 Le bouton poussoir est une entrée forcé à 0V si on appuis pas et à 5V  si on appuie
}

//----------------------- DEMARRAGE DE LA BOUCLE----------------------------------------------------

void loop()
{
  float puissance_reelle1 = emon1.realPower;   //1 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
//   Serial.print("{\"puiss\":");
//   Serial.print(puissance_reelle1);                                                         
//   Serial.println("}");
   //delay(500);
    float puissance_reelle2 = emon2.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"
   // float puissance_reelle3 = emon3.realPower;   //4 creation de la variable flottante "puissance reelle" qui existe dans la librairie sous "emon1.realPower"

  float verif_voltage    = emon1.Vrms;        //1 creation de la variable "volts moyen" (mesurable avec un voltmètre pour l'etalonnage)
  float verif_ampere     = emon1.Irms;        //1 creation de la variable "Ampères Moyen" (mesurable avec une pince ampèremétrique pour l'etalonnage))

  emon1.calcVI(20, 2000);                     // 1 Demande a Emonlib de tout calculer,  (puissance relle, volts moyen, ampère moyen et facteur de puissance)
  emon2.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la deuxième pince ampèrmétrique (si on met 40 au lieu de 20, ca va moins vite)
  //emon3.calcVI(20,2000);                      // 4 idem qu'au dessus mais pour la troisième pince ampèrmétrique (et du coup c'est plus lisible sur le LCD)

  //emon1.serialprint();                      // (1) Si on ecrit cette ligne , toutes les valeurs calculées precedemment sont envoyées vers l'ordinateur

  //--------------------------Etalonnage des volts et ampères sans LCD--------------------------------------

//  Serial.print("Est-ce le bon voltage? ");      // 1 envoyer vers l'ordinateur le texte " Est-ce le bon voltage? "
//  Serial.print(verif_voltage);                  // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.print(" V  ");                         // 1 envoyer vers l'ordinateur le caractère "V"
//  Serial.print(verif_ampere);                   // 1 envoyer vers l'ordinateur la valeur "verif_voltage (Vrms)"
//  Serial.println(" A ");                          // 1 envoyer vers l'ordinateur le caractère "A"
//  Serial.println(intensite_led);
//delay(1000);
  //----------------POUR AVOIR LES W, Wh et kWh de l'élélectricité qui rentre et de l'électricité qui sort de ma maison------------------

  if (puissance_reelle1 >= 0)                      // 2 Si la puissance reelle est positive, (c'est que je consomme et qu'a priori il n'y a pas de soleil)
  {
    w_instantane_in = puissance_reelle1;      // 2 alors on dit que la puissance instantanée entrante (in) est egale à la puissance reelle.
    w_instantane_out = 0;                     // 2 dans ces conditions de consommation (positive) , la valeur de la surproduction est nulle.

    kwh_cumule_in = kwh_cumule_in + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
    // 2 La valeur cumulée consommée (entrante) = La valeur cumulée consommée précédente,
    // 2 plus la puissance reelle multipliée par le temps écoulé entre millis et previous millis
    // 2 que divise 3600 (nb secondes / heure) et encore par 1000 car millis compte les millièmes de seconde
    // 2 et encore par mille car ce sont les kWh et non les Wh qui m'intêresse.
  }

  else                                             // 2 SINON (c'est que la puissance_reelle est négative)
  {
    w_instantane_in = 0;                       // 2 idem au dessus
    w_instantane_out = puissance_reelle1; // 2 idem au dessus

    kwh_cumule_out = kwh_cumule_out + puissance_reelle1 * (millis() - previous_millis) / 3600000 / 1000;
  }

  // ----------------------Pour avoir les w, wh et kwh production solaire et consommation chauffe eau------

  
      w_Chauffe_Eau_1 = puissance_reelle2;        //4 idem au dessus mais la pince ampèremetrique branché sur la conso du chauffe eau
      kwh_Chauffe_Eau_1 = kwh_Chauffe_Eau_1 + puissance_reelle2 * (millis() - previous_millis) / 3600000/ 1000;


  previous_millis = millis();               // 2 Demandons a la variable previous_millis de garder en memoire la valeur de millis (le tps qui s'écoule)

 //-------------------------------------Si il y a des Watts , balance en dans le chauffe eau---------------------------------

  if (puissance_reelle1 <= 100 && intensite_led < 230) //6 si la puissance sonsommée est inférieur à 1w, et que la led n'est mas à son maximum
  {intensite_led += 5;                               // 6 augmenter l'intensité lumineuse de 5
  analogWrite(led, intensite_led);}                  //6 la led va s'éclairer au niveau de la valeur de intensite_led
  //delay(1000);

  //Serial.println(intensite_led);
  if(puissance_reelle1 >= 100 && intensite_led > 0)  //6 inversement, si la conso en watt est supérieur à 100 et et que la led n'est pas à son minimum
  {intensite_led -= 5;                               //6 diminue alors l'intensité de la led
  analogWrite(led, intensite_led);}                 // 6 la led va s'éclairer au niveau de la valeur de intensite_led

  // --------------------ECRIRE SUR LCD ET POUR CHANGER LES VALEUR DuLCD AVEC UN BOUTON POUSSOIR------------------------------------------------

  //lcd.backlight();                // 2 Allumer l'écran LCD
  lcd.clear();                    // 2 rafraichir l'écran LCD ( efface les données précédentes)


   impulsion = digitalRead(pin_bouton_changer_ecran);               //5 Demande à "impulsion" de prendre la valeur de "pin_bouton_changer_ecran"
    if (impulsion == 0) compteur_impulsion = compteur_impulsion + 1; //5 On incrémente le compteur d'impulsion s'il y a une impulsion sur le bouton
  //Serial.print(compteur_impulsion);
    if (compteur_impulsion == 1)                                     //5 Si le compteur d'impulsion est égale à 1 on affiche le premier écran
          {
  //-----Ecran n°1:-------------------------------

  //1ere ligne, watt entrant et watts sortant----
  lcd.setCursor(0, 0);               // 4 positionner le curseur sur la ligne 1 et à gauche
  lcd.print("In ");   // 4 ecrire "In " pour comprendre qu'il s'agit de la consommation
  lcd.print(w_instantane_in, 0);     // 4 puis écrire la valeur positive de la consommation au compteur EDF avec 2 chiffre derière la virgule
  lcd.setCursor(9, 0);               // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 8
  lcd.print(w_instantane_out, 0);     // 4 ecrire la valeur de w_instantane_out (c'est la surproduction) avec 2 chiffre derière la virgule



  //2eme ligne, Watt solaire et watts chauffe eau
  lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et à gauche
  lcd.print(w_Chauffe_Eau_1, 0);          // 4 puis écrire la valeur de la surproduction visible par EDF avec les compteurs electroniques (sans les virgules)
  lcd.setCursor(9, 1);              // 4 Rester sur la ligne 2 mais curseur position 8
  //lcd.print(w_Chauffe_Eau_2, 0);      // 4 puis écrire à la suite la valeur de la surproduction en Wh avec un chiffre derrière la virgule
          }
  //
   else if (compteur_impulsion == 2) //5 Sinon s'il est égale à 2 on affiche l'écran numéro 2
          {
          //Serial.print(compteur_impulsion);  
          // -----ECRAN N°2:-------------------------------
          //1ere ligne, kWh entrant et KkWh sortant--------
          lcd.setCursor(0, 0);            // 4 positionner le curseur sur la ligne 1 et à gauche
          lcd.print("2 ");                // 4 ecrire "2" pour comprendre que nous sommes sur l'écran n°2
          lcd.print(kwh_cumule_in,4);     // 4 puis écrire la valeur de la consommation en kWh avec 4 chiffres derrière la virgule
          lcd.setCursor(8, 0);            // 4 rester sur la ligne 1 mais positionner le curseur sur le caractère 9
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          lcd.print(kwh_cumule_out,4);    // 4 ecrire la valeur des Watts cumulé en kWh, c'est la valeur de la surproduction
  
          //2eme ligne, KWh solaire et kWh chauffe eau
          lcd.setCursor(2, 1);              // 4 positionner le curseur sur la ligne 2 et position 2
          lcd.print(kwh_Chauffe_Eau_1,4);         // 4 puis écrire la valeur de la production cumulée de mes panneaux solaire en kWh
          lcd.setCursor(8, 1);              // 4 rester sur la ligne 2 mais positionner le curseur en position 2
          lcd.print(" ");                 // 4 ecrire " " pour séparer les deux valeur de cette ligne
          //lcd.print(kwh_Chauffe_Eau_2,4);     // 4 puis écrire la consomation cumulée de mon chauffe eau en Kwh
          }
  
   else if (compteur_impulsion == 3)      // 5 si on a appuié 3 fois sur le bouton poussoir,
          {
           // Serial.print(compteur_impulsion);
          compteur_impulsion = 1;          // 5 alors on remet le compteur à 0 et on retrouve l'écran n°1
          }
          
  // olive add        
  if(boucle > 10){     //on test si la boucle est dupérieur a 10 on envoi les données
       
  Serial.print(w_instantane_in);
  Serial.print(";");
  Serial.print(w_instantane_out);
  Serial.print(";");
  Serial.print(w_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(kwh_cumule_in);
  Serial.print(";");
  Serial.print(kwh_cumule_out);
  Serial.print(";");
  Serial.print(kwh_Chauffe_Eau_1);
  Serial.print(";");
  Serial.print(intensite_led);
  Serial.print("\n");
  delay(500);
  boucle =0;// olive on remet la boucle a 0
  }// olive fin de conditions
  
  // Olive on incrémente la boucle
  boucle += 1;


}                                 // FIN DU PROGRAMME

Bonjour @Geangean,

Pour info je suis parti du même code de Barnabé, mais simplifié à outrance car ma pince est branchée sur un Wemos et du coup je n’ai que les volts captés.et rien d’autre que la pince.
J’ai ensuite adapté ce code allégé pour publier directement du MQTT et donc intégration directe dans Jeedom via le plugin jMqtt.
Avec un subscribe pour faire une action de remise à zéro des compteurs du code.

Pour l’instant pas très satisfait de ce que relève la pince ampère vs le linky. A chaque fois que j’ai un gros pic de consommation (chauffe ECS) je n’ai pas le même profil de courbe entre linky et pince.
(A noter que n’ayant pas d’autre pince ampère de mesure, je n’ai pas pu calibrer certaines variables laissées en l’état)
Dis-moi si pour toi les relevés sont identiques à l’occasion STP.
Courbes :

Ce sujet a été automatiquement fermé après 24 heures suivant le dernier commentaire. Aucune réponse n’est permise dorénavant.

Merci pour cette réouverture
@Geangean a tu pu tester le code donné ici :

?

Bonjour,
Oui je vais tester vos deux codes. Mais j’ai des problèmes de téléversement et je pense comprendre pourquoi : il s’agit d’un conflit entre le téléversement arduino et node-red. Il semble que seulement si j’arrête node-red je peux téléverser.
Si je fixe ça ainsi, je pourrais ensuite tester vos codes.
Merci

Je pensais à votre réponse, j’avais peur qu’en mettant un delay, je fausse les données des cumul en kWh !

La modification que je vous est donnnée intervient seulement sur les données transmises à MQTT le cumul réalisé dans votre boucle Void() n’en est pas modifié.
Cette condition ne fait que géré le temps entre deux transmissions de vos données sur le port série.

et oui c’est normal l’un et l’autre utilise le même port serie qui sert de programmation …