[RÉSOLU] - Gestion de la consommation électrique


#1

Bonjour à tous

Je poste (encore) une demande à la communauté :slight_smile:
J’ai vu, ou cru voir, qu’il n’y avait pas de sujet comme celui la sur le forum !
Je pense que le sujet peut en intéresser quelques uns.

La demande :
A l’aide d’un petit “wattmètre” PZEM-004T :


Je souhaiterai connaître la consommation énergétique de mon local de travail (que je domotise petit à petit)

  • Voltage (je soupçonne l’edf de ne pas me délivrer 220/230V à tout heure :joy:)
  • Intensité
  • Puissance
  • Consommation

Les tests effectués :
Je vous passe les détails de branchements qui sont très bien expliqué dans le tuto

    • Je l’ai testé avec un Arduino Nano sur mon pc via IDE Arduino et le moniteur série en suivant ce tuto

Le code (de test) envoyé sur l’arduino est le suivant : (je vous le partage si vous en avez besoin)

#include <PZEM004T.h>

PZEM004T pzem(10,11);  // RX,TX
IPAddress ip(192,168,1,1);

void setup() {
  Serial.begin(9600);
  pzem.setAddress(ip);    
}

void loop() {
  Serial.println("");
   
   float v = pzem.voltage(ip);
  if(v >= 0.0){ Serial.print(v);Serial.print("V; "); }
   
  float i = pzem.current(ip);
  if(i >= 0.0){ Serial.print(i);Serial.print("A; "); }
   
  float p = pzem.power(ip);
  if(p >= 0.0){ Serial.print(p);Serial.print("W; "); }

  float e = pzem.energy(ip);
  if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); }  

  Serial.println();
}

Avec ce code j’obtiens le résultat suivant :
Capture%20PZEM004T%20PC

Donc pour l’instant je suis de mauvaise foie, EDF est dans les clous ! :
On voit que sur le moniteur série ça fonctionne très bien, je suis d’ailleurs surpris parce que j’ai pu l’utiliser avec plusieurs appareils et la consommation est très juste !

    • J’ai essayé d’adapter le code de mon capteur DHT22 qui renvoi des infos à Gladys avec celui du PZEMM-004T puisque ce n’est jamais qu’une remontée d’infos.

Ça donne ça : ET là ça se complique un peu

/***************************************************************
  ********* Déclaration des librairies et variables *************
  **************************************************************/
  
#include <PZEM004T.h>                                             // Inclusion de la librairie PZEM004T
#include <ArduinoJson.h>                                          // Inclusion de la librairies ArduinoJson.h

PZEM004T pzem(10,11);                                             // RX et TX connectés sur les pins 10 et 11
IPAddress ip(192,168,1,1);                                        // Permet de créer l'adresse ip du PZEM-004T

struct pzemData {                                                 // Création du type pzemdata pour stocker les mesures
  int id;                                                         // Création d'une variable int "id"
  float valeur;                                                   // Création d'un variable float "valeur"
};

int devicetype_id1 = 27;                                          // Id du devicetype "Volts" dans Gladys
int devicetype_id2 = 28;                                          // Id du devicetype "Ampères" dans Gladys
int devicetype_id3 = 29;                                          // Id du devicetype "Watts" dans Gladys
int devicetype_id4 = 30;                                          // Id du devicetype "Watts/Heure" dans Gladys

#define PZEMDATA_JSON_SIZE (JSON_OBJECT_SIZE(3))                  // Variable indiquant la taille du buffer

/***************************************************************
 **************** Début du programme Setup *********************
 **************************************************************/

void setup () {
  Serial.begin(9600);                                             // Ouverture du port série à 9600 bauds
  pzem.setAddress(ip);                                            // Initialisation de l'adresse ip de l'objet pzem
}

/***************************************************************
 **************** Début du programme Loop **********************
 **************************************************************/

void loop ()  {

  delay(1000);                                                    // Délai de 1 seconde entre les 4 mesures

  pzemData dataV;                                                 // Objet pour l'enregistrement de la tension
  pzemData dataA;                                                 // Objet pour l'enregistrement de l'intensité
  pzemData dataW;                                                 // Objet pour l'enregistrement de la puissance
  pzemData dataWh;                                                // Objet pour l'enregistrement de la consommation
  
  float v = pzem.voltage(ip);                                     // Associe la variable float "v" au Voltage
  
  float a = pzem.current(ip);                                     // Associe la variable float "a" au Courant
  
  float w = pzem.power(ip);                                       // Associe la variable float "w" a la Puissance
  
  float wh = pzem.energy(ip);                                     // Associe la variable float "wh" a la Consommation


/***************************************************************
 ****** Arrêt du programme et renvoie un message d'erreur ******
 ********** si le PZEM-004T ne renvoie aucunes mesure **********
 **************************************************************/

  if (isnan(v) || isnan(a) || isnan(w) || isnan(wh)) {            // Si "v", "a", "w", "wh" ne sont pas des nombres
    Serial.println("Echec de lecture !");                         // alors s'affiche un message d'erreur "Echec de lecture" 
  }
  else {                                                          // Sinon on affiche les messages JSON
    
/**************************************************************** 
 ****************** Message JSON Voltage ************************
 ***************************************************************/
 
    dataV.id = devicetype_id1;                                    // Si l'id de dataV est egale au devicetype Volts
    dataV.valeur = v;                                             // et que la valeur de dataV est egale au Voltage
    serialize(dataV);                                             // alors on converti l'objet dataV 

/**************************************************************** 
 ****************** Message JSON Courant ************************
 ***************************************************************/

    dataA.id = devicetype_id2;                                    // Si l'id de dataA est egale au devicetype Ampères
    dataA.valeur = a;                                             // et que la valeur de dataA est egale au Ampères
    serialize(dataA);                                             // alors on converti l'objet dataA

/**************************************************************** 
 ***************** Message JSON Puissance ***********************
 ***************************************************************/
    
    dataW.id = devicetype_id3;                                    // Si l'id de dataW est egale au devicetype Watts
    dataW.valeur = w;                                             // et que la valeur de dataW est egale au Watts
    serialize(dataW);                                             // alors on converti l'objet dataW

/**************************************************************** 
 ****************** Message JSON Consommation *******************
 ***************************************************************/
    
    dataWh.id = devicetype_id4;                                   // Si l'id de dataWh est egale au devicetype Watts/Heure
    dataWh.valeur = wh;                                           // et que la valeur de dataWh est egale au Watts/Heure
    serialize(dataWh);                                            // alors on converti l'objet dataWh 
  }
}

/**************************************************************** 
 ************ Lancement du programme de conversion **************
 ***************************************************************/

void serialize(pzemData &data)                                
{
  StaticJsonBuffer<PZEMDATA_JSON_SIZE> jsonBuffer;                // Permet de réserver la mémoire nécessaire au tampon
  JsonObject& json_pzem = jsonBuffer.createObject();              // Création d'un objet json_pzem de type JsonObject
                                                                  // Enregistre dans le tampon JsonBuffer le code Json
  json_pzem["devicetype"] = data.id;                              // Si le devicetype de json_pzem = à celui de Gladys
  json_pzem["value"] = data.valeur;                               // et que la valeur = aux bonnes valeurs
  json_pzem.printTo(Serial);                                      // alors on envoie les résultats sur le port série
  Serial.println("");                                             // Permet de séparer les JSON
}

Dans le moniteur série, avec ce code, j’obtiens ce résultat :

Capture%20PZEM004T%20PC

PROBLÈME ! :joy:
Je connecte mon Arduino au pi, je configure son port, je créer un device “Gestion de la consommation” et je fais 4 devicetypes :

  • Tension
  • Intensité
  • Puissance
  • Consommation

Je reboot pour être sur que ça prend bien en charge !
Quand j’arrive sur ma page des périphériques, je vois ça ! :cold_sweat::cold_sweat:

pzem004T

Et les logs me disent :

0|gladys   | Received data from Arduino {"devicetype":31,"value":-1}
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Received data from Arduino {"devicetype":32,"value":-1}
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Received data from Arduino {"devicetype":33,"value":-1}
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Received data from Arduino {"devicetype":34,"value":-1}
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Event : create : new Event with code : devicetype-new-value
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.
0|gladys   | Scenario : Trigger : New event : devicetype-new-value
0|gladys   | Scenario : Trigger : Found 0 launchers with code devicetype-new-value.

La valeur reste bloqué sur -1 indéfiniment !

Sur le github de la librairie PZEM-004T il y a un tableau de conversion que je ne comprend pas trop

J’ai donc deux conclusions :

  • Soit l’EDF me vole beaucoup beaucoup de courant (0,1% de chances)
  • Soit j’ai merdé quelques part (99,9% de chances)

Plus sérieusement j’accepterai volontiers votre aide, je suis certain que mon erreur est bidon, mais je ne trouve pas d’où elle vient…
Merci à vous :wink:


#2

Vraiment désolé je viens de trouver mon erreur…
Quel boulet…
Pour remédier à cela dans la journée je vous ferai un tuto pour ceux que ça intéresse :slight_smile: