[NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Vous avez créé un script LUA dont vous êtes fier, un .sh génial, un programme Python hors du commun, un Tuto, c'est ici que vous pouvez les partager.
V1nz T3ch
Messages : 2
Inscription : 14 oct. 2019, 16:27

[NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Message par V1nz T3ch »

Voici une mise a jour de ce tutorial pour le PZEM 004T v.3.0
Bien que le prix sois moins intéressant que certaine prise qui supporte 16A que l’on peux trouver sur Ali express comme cette prise la a 7.5€

Ce tuto reste très intéressant pour un branchement dans le tableau électrique vu le PZEM0004T supporte jusqu’à 100A
PZEM004T v3.jpg
PZEM004T v3.jpg (1.24 Mio) Consulté 1729 fois
Liste de matériel à acheter
- 1 PZEM 004T v3.0 lien
- 1 NodeMCU lien
- 5 Câble pour breadboard femelle/femelle lien

Liste de matériel à récupérer
- Rallonge électrique (avec terre (conseillé))
- domino

Caractéristique technique du wattmètre PZEM004T v3
Paramètre électrique mesure :
• Voltage
• Intensité
• Puissance Instantané
• Énergie
• Fréquence (que sur la V3)
• Facteur de puissance (que sur la V3)

Communications en TTL avec le NodeMCU

Dans domoticz
Dans réglages / matériel crée un matériel ‘Compteur Elec’ de type Dummy
Image

Avec le nouveau matériel crée 5 capteurs virtuels
Image

-Tension
tension.PNG
tension.PNG (10.07 Kio) Consulté 1729 fois
-Ampère (monophasé)
intensite.PNG
intensite.PNG (11.09 Kio) Consulté 1729 fois
-Électricité (Instant+Compteur)
electricite.PNG
electricite.PNG (11.81 Kio) Consulté 1729 fois
-Fréquence
frequence.PNG
frequence.PNG (10.83 Kio) Consulté 1729 fois
-Facteur de puissance
facteurdepuissance.PNG
facteurdepuissance.PNG (11.31 Kio) Consulté 1729 fois


Allez dans Reglages / Dispositif et note les IDX des diffèrent capteur crée
tableau(02).jpg
tableau(02).jpg (106.62 Kio) Consulté 1729 fois


Dans Arduino IDE


Télécharger la librairie du PZEM 004T v3 en allons dans :
Croquis / Inclure une librairie / Gérer les bibliothèque
Rechercher pzem
bibliotheque.png
bibliotheque.png (29.85 Kio) Consulté 1729 fois
Et instaler le PZEM004Tv30


Modifier le sketch suivant avec vos paramètre et televersé le dans votre NodeMCU

Code : Tout sélectionner

/*
 PZEM004T v3.0 vers Domoticz GET 
*/

#include <ESP8266WiFi.h>
#include <SoftwareSerial.h> 
//#include <PZEM004T.h>
#include <PZEM004Tv30.h>

// initialisation du PZEM004T
#define PZEM_RX_PIN 4
#define PZEM_TX_PIN 5

SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial);


#define SLEEP_DELAY_IN_SECONDS 30
//parametre Wifi

const char* ssid     = "toto";
const char* password = "12345678";

// Paremetre Domoticz
const char* domoticz_server = "192.168.0.8"; //adresse IP de domoticz
String IDX_U     = "551"; //idx du capteur virtuels tension lidR%TVe1R9Su?V>j!lqvqM?9dJ 5%M+vC_(=-y>|FFQ&NSeB%-SU_bci%QNhoN
String IDX_I     = "552"; //idx du capteur virtuels intensite     
String IDX_W     = "553"; //idx du capteur virtuels puissance et energie
String IDX_F     = "554"; //idx du capteur virtuels puissance et energie
String IDX_PF     = "555"; //idx du capteur virtuels puissance et energie

WiFiClient domoticz_client;

int nbtent=0;


void setup(void) {
  Serial.begin(115200);
  
  // Connexion au WiFi
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    if (nbtent<10){
      nbtent++ ;   
      delay(1000);
      Serial.print(".");
    }
    else{
      Serial.println("Restet");
      ESP.deepSleep(2 * 1000000, WAKE_RF_DEFAULT);
    }    
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  //initialisation ttl avec PZEM004T
  //pzem.setAddress(ip);
  
}

void loop(void){    
  Serial.println("");  
  Serial.print("Custom Address:");
  Serial.println(pzem.readAddress(), HEX);

  float v = pzem.voltage();
  if (v < 0.0) v = 0.0;
  Serial.print(v);Serial.print("V; ");
  delay(10); 
  float i = pzem.current();
  if(i >= 0.0){ Serial.print(i);Serial.print("A; "); }
  delay(10);   
  float p = pzem.power();
  if(p >= 0.0){ Serial.print(p);Serial.print("W; "); }
  delay(10);   
  float e = pzem.energy();
  if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); }  
  float f = pzem.frequency();
  if(f >= 0.0){ Serial.print(f);Serial.print("Hz; "); }
  float pf = pzem.pf();
  if(pf >= 0.0){ Serial.print(pf);Serial.print("; "); }
  Serial.println();

  EnvoieDomoticz(IDX_U,String(v)); // tension
  EnvoieDomoticz(IDX_I,String(i)); // intensite
  EnvoieDomoticz(IDX_W,String(p)+ ";" +String(e)); // puissance
  EnvoieDomoticz(IDX_F,String(f)); // frequence
  EnvoieDomoticz(IDX_PF,String(pf)); // facteur de puissance
  
  delay(100);
    
  Serial.println("Pausse de "+String(SLEEP_DELAY_IN_SECONDS)+" secondes...");
  delay(SLEEP_DELAY_IN_SECONDS * 1000);
  }


int EnvoieDomoticz(String IDX, String Svalue) {
  domoticz_client.connect(domoticz_server, 8080);
  delay(500);

  int Resultat=0 ;
  int NbTentEnvoie=0;
  
  String deel1 = "GET /json.htm?type=command&param=udevice&idx="+IDX+"&nvalue=0&svalue=";
  String deel3 = " HTTP/1.1\r\nHost: www.local.lan\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n";  
  String dataInput = String(deel1 + Svalue + deel3);
  while (Resultat!=1) {
    if (NbTentEnvoie<10){
      NbTentEnvoie++ ;
      Serial.print("_");
      domoticz_client.println(dataInput);
      delay(500);
      // Si le serveur repond lire toute les lignes
      while(domoticz_client.available()){
        String line = domoticz_client.readStringUntil('\r');
        if (line.lastIndexOf("status")>0 and line.lastIndexOf("OK")>0){
          Serial.println("Status OK");
          Resultat = 1 ;
        }
      }
    }
  else{
      Serial.println("Restet");
      ESP.deepSleep(2 * 1000000, WAKE_RF_DEFAULT);
    }  
    
  }  
  // deconexion
  domoticz_client.println("Connection: close");
  domoticz_client.println();  
  return(Resultat);
}
Branché le Ndembu au PZEM 004Tv30 comme sur le schéma ci-dessous

Image

Et voilà Apres le branchement vous devriez obtenir de belle courbe
indicateur.PNG
indicateur.PNG (66.89 Kio) Consulté 1729 fois
Domoticzcourbe.png
Domoticzcourbe.png (495.41 Kio) Consulté 1729 fois
Dernière modification par V1nz T3ch le 06 août 2022, 20:06, modifié 4 fois.
Keros
Messages : 6638
Inscription : 23 juil. 2019, 20:57

Re: [NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Message par Keros »

Merci pour cette mise à jour.

En hébergeant les images à l'extérieur du forum, il y a de fort risques qu'elles ne soient plus disponibles dans quelque temps comme ici, ou encore . Est-ce que tu peux éditer ton message et utiliser l'onglet Fichiers joints en dessous de la zone d'écriture des messages pour enregistrer les éléments sur le serveur du forum. Merci
Comment bien utiliser le forum : Poser une question, Mettre un script, un fichier, une image ou des logs
Mes petits guides : Débuter en programmation, Le débogage, Le choix de matériel, Les sauvegardes
Ma présentation - Mes Tutos
cle
Messages : 2
Inscription : 23 août 2020, 08:45

Re: [NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Message par cle »

Bonjour

Bravo et Merci pour cet excellent poste qui fonctionne très bien :)
J'ai apporté de légères améliorations :
  • En cas d'erreur Réseau j'ai remplacer la mise en veille (qui ne marchait pas) par un reset
  • J'ai traité le cas d'erreur de lecture du capteur
  • J'ai aussi traité le cas ou le compteur d'énergie arrive a sa valeur max en le réinitialisant à 0
Enfin dernier point quand on configure le compteur d'énergie dans Domoticz, il vaut mieux utiliser un type "Electrique (instantané +compteur)" plutôt que "Utilisation (éléctrique)"
Capture d’écran 2023-01-08 185834.jpg
Capture d’écran 2023-01-08 185834.jpg (16.36 Kio) Consulté 1289 fois

Code : Tout sélectionner

/*
 PZEM004T v3.0 vers Domoticz GET 
*/

#include <ESP8266WiFi.h>
#include <SoftwareSerial.h> 
//#include <PZEM004T.h>
#include <PZEM004Tv30.h>

// initialisation du PZEM004T
#define PZEM_RX_PIN 4
#define PZEM_TX_PIN 5

SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial);


#define SLEEP_DELAY_IN_SECONDS 30
//parametre Wifi

const char* ssid     = "Reseau";
const char* password = "124567890";

// Paremetre Domoticz
const char* domoticz_server = "192.168.0.x"; //adresse IP de domoticz
String IDX_U     = "313"; //idx du capteur virtuels tension 
String IDX_I     = "314"; //idx du capteur virtuels intensite     
String IDX_W     = "318"; //idx du capteur virtuels puissance et energie
String IDX_F     = "316"; //idx du capteur virtuels puissance et energie
String IDX_PF    = "317"; //idx du capteur virtuels puissance et energie

WiFiClient domoticz_client;

int nbtent=0;


void setup(void) {
  Serial.begin(115200);
  
  // Connexion au WiFi
  delay(10);

  // We start by connecting to a WiFi network
  Serial.println();
  Serial.print("Connecting to ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    if (nbtent<10){
      nbtent++ ;   
      delay(1000);
      Serial.print(".");
    }
    else{
      Serial.println("Reset");
      //ESP.deepSleep(2 * 1000000, WAKE_RF_DEFAULT);
      delay(60000);
      ESP.reset();  // reset
    }    
  }

  Serial.println("");
  Serial.println("WiFi connected");  
  Serial.println("IP address: ");
  Serial.println(WiFi.localIP());

  //initialisation ttl avec PZEM004T
  //pzem.setAddress(ip);
  
}

void loop(void){    
  Serial.println("");  
  Serial.print("Custom Address:");
  Serial.println(pzem.readAddress(), HEX);

  float v = pzem.voltage();
  if (v < 0.0) v = 0.0;
  Serial.print(v);Serial.print("V; ");
  delay(10); 
  float i = pzem.current();
  if(i >= 0.0){ Serial.print(i);Serial.print("A; "); }
  delay(10);   
  float p = pzem.power();
  if(p >= 0.0){ Serial.print(p);Serial.print("W; "); }
  delay(10);   
  float e = pzem.energy();
  if(e >= 0.0){ Serial.print(e);Serial.print("Wh; "); }  
  float f = pzem.frequency();
  if(f >= 0.0){ Serial.print(f);Serial.print("Hz; "); }
  float pf = pzem.pf();
  if(pf >= 0.0){ Serial.print(pf);Serial.print("; "); }
  Serial.println();
  if(e >= 9999.00) {pzem.resetEnergy();}                                                   // reset du compteur de Kwh
  if (isnan(v) || isnan(i) || isnan(p)|| isnan(e) || isnan(f)|| isnan(pf) ){  // erreur de lecture du capteur
    Serial.println("Erreur de lecture capteur!");
  } else  {
    EnvoieDomoticz(IDX_U,String(v)); // tension
    EnvoieDomoticz(IDX_I,String(i)); // intensite
    EnvoieDomoticz(IDX_W,String(p)+ ";" +String(e)); // puissance
    EnvoieDomoticz(IDX_F,String(f)); // frequence
    EnvoieDomoticz(IDX_PF,String(pf)); // facteur de puissance
  }
  delay(100);
    
  Serial.println("Pause de "+String(SLEEP_DELAY_IN_SECONDS)+" secondes...");
  delay(SLEEP_DELAY_IN_SECONDS * 1000);
  }


int EnvoieDomoticz(String IDX, String Svalue) {
  domoticz_client.connect(domoticz_server, 8080);
  delay(500);

  int Resultat=0 ;
  int NbTentEnvoie=0;
  
  String deel1 = "GET /json.htm?type=command&param=udevice&idx="+IDX+"&nvalue=0&svalue=";
  String deel3 = " HTTP/1.1\r\nHost: www.local.lan\r\nConnection: keep-alive\r\nAccept: */*\r\n\r\n";  
  String dataInput = String(deel1 + Svalue + deel3);
  while (Resultat!=1) {
    if (NbTentEnvoie<10){
      NbTentEnvoie++ ;
      Serial.print("_");
      domoticz_client.println(dataInput);
      delay(500);
      // Si le serveur repond lire toute les lignes
      while(domoticz_client.available()){
        String line = domoticz_client.readStringUntil('\r');
        if (line.lastIndexOf("status")>0 and line.lastIndexOf("OK")>0){
          Serial.println("Status OK");
          Resultat = 1 ;
        }
      }
    }
  else{
      Serial.println("Reset");
      delay(60000);
      ESP.reset();  //reset
      // ESP.deepSleep(2 * 1000000, WAKE_RF_DEFAULT);
    }  
    
  }  
  // deconexion
  domoticz_client.println("Connection: close");
  domoticz_client.println();  
  return(Resultat);
}


higgins91
Messages : 668
Inscription : 17 nov. 2016, 11:06

Re: [NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Message par higgins91 »

merci pour cette présentation du projet, j'ai commandé mon module que j'ai reçu hier, j'ai testé ce soir en retrant du boulot et j'ai mes premières remontées d'info dans Dz.
J'ai revu le code pour réutiliser les fonctions que j'utilise dans mes autres wemos et je trouvais la fonction d'envoi à Dz bien compliquée... De même j'ai supprimé des variables (IDX par exemple) car 1 variable utilisée que 1x ça n'a pas grand intérêt !
Et mis les débug en français :mrgreen:

Code : Tout sélectionner

/*
 PZEM004T v3.0 vers Domoticz GET 
*/


//WIFI
#include <ESP8266WiFi.h>
#include <ESP8266HTTPClient.h>
#include <WiFiClient.h>
WiFiClient domoticz_client;

// PZEM004T
#include <SoftwareSerial.h> 
//#include <PZEM004T.h>
#include <PZEM004Tv30.h>
#define PZEM_RX_PIN 4
#define PZEM_TX_PIN 5
SoftwareSerial pzemSWSerial(PZEM_RX_PIN, PZEM_TX_PIN);
PZEM004Tv30 pzem(pzemSWSerial);
#define SLEEP_DELAY_IN_SECONDS 15

// parametre Wifi
const char* ssid     = "nom";
const char* password = "mdp";
HTTPClient http;

int nbtent=0;

void setup(void) {
  Serial.begin(115200);
  Serial.println("Initialisation...");

   // séquence de connexion au wifi  
  Serial.println();
  Serial.print("Connexion au réseau wifi : ");
  Serial.println(ssid);

  WiFi.begin(ssid, password);

  while (WiFi.status() != WL_CONNECTED) {
    if (nbtent<10){
      nbtent++ ;   
      delay(1000);
      Serial.print(".");
    }
    else{
      Serial.println("Echec de connection reset du wemos");
      delay(1000);
      ESP.reset();  // reset
    }    
  }

  Serial.println("");
  Serial.println("WiFi connecté");  
  Serial.println("Address IP: ");
  Serial.println(WiFi.localIP());

  
}

void loop(void){    

  float v = pzem.voltage();
  if (v < 0.0) v = 0.0;
  Serial.print("Tension (V) =");
  Serial.println(v);
  delay(10); 
  float i = pzem.current();
  if(i >= 0.0){ 
    Serial.print("Intensité (A) =");
    Serial.print(i);}
  delay(10);   
  float p = pzem.power();
  if(p >= 0.0){ 
    Serial.print("Puissance (W) =");
    Serial.print(p); }
  delay(10);   
  float e = pzem.energy();
  if(e >= 0.0){ 
    Serial.print("Consommation (Wh) =");
    Serial.print(e);}  
  float f = pzem.frequency();
  if(f >= 0.0){ 
    Serial.print("Fréquence (Hz) =");
    Serial.print(f);}
  float pf = pzem.pf();
  if(pf >= 0.0){ 
    Serial.print("Facteur de puissance; ");
    Serial.print(pf);}
  Serial.println();
  if(e >= 9999.00) {pzem.resetEnergy();}  // reset du compteur de Kwh
  if (isnan(v) || isnan(i) || isnan(p)|| isnan(e) || isnan(f)|| isnan(pf) ){  // erreur de lecture du capteur
    Serial.println("Erreur de lecture capteur!");
  } else  {

    //init URL tension
    String url = "/json.htm?type=command&param=udevice&idx=243&nvalue=0&svalue=";
    url += String(v);
    //envoi la tension à Dz
    sendDomoticz(url);
    //EnvoieDomoticz(IDX_U,String(v)); // tension

    //init URL intensité
    url = "/json.htm?type=command&param=udevice&idx=244&nvalue=0&svalue=";
    url += String(i);
    //envoi la tension à Dz
    sendDomoticz(url);
    //EnvoieDomoticz(IDX_I,String(i)); // intensite

    //init URL puissance
    url = "/json.htm?type=command&param=udevice&idx=248&nvalue=0&svalue=";
    url += String(p);
    url += ";";
    url += String(e);
    sendDomoticz(url);
    //EnvoieDomoticz(IDX_W,String(p)+ ";" +String(e)); // puissance

    //init URL fréquence
    url = "/json.htm?type=command&param=udevice&idx=246&nvalue=0&svalue=";
    url += String(f);
    //envoi la tension à Dz
    sendDomoticz(url);    
    //EnvoieDomoticz(IDX_F,String(f)); // frequence

    //init URL facteur de puissance
    url = "/json.htm?type=command&param=udevice&idx=247&nvalue=0&svalue=";
    url += String(pf);
    //envoi la tension à Dz
    sendDomoticz(url);    
    //EnvoieDomoticz(IDX_PF,String(pf)); // facteur de puissance
  }
  Serial.println("Pause de "+String(SLEEP_DELAY_IN_SECONDS)+" secondes...");
  delay(SLEEP_DELAY_IN_SECONDS * 1000);
  }

void sendDomoticz(String url) {
  url = "http://0.0.0.0:8080" +url;
  //Serial.print("Requesting URL: ");
  //Serial.println(url);
  http.begin(domoticz_client, url);
  int httpCode = http.GET();
  if (httpCode) {
    if (httpCode == 200) {
      String payload = http.getString();
     }
  }
  http.end();
}
C'est dommage car j'ai acheté ce module pour surveiller la charge de ma voiture et j'ai pas eu le temps de l'installer pour tester cette nuit...
Dz version : 2023.2
Rpi 4 avec dongle téléinfo, RFXCom, sondes 1-wire et GPIO
TurboX
Messages : 83
Inscription : 25 oct. 2019, 13:10

Re: [NodeMCU] Un wattmètre wifi connecté à Domoticz pour environ 10€ avec le PZEM004T v3.0

Message par TurboX »

Merci pour le partage.

Si j'avais eu cela à l'époque je me serais lancé avec un NodeMCU.
Dans mon cas j'utilise des PZEM V3.0 avec des arduino nano avec MySensors, j'avais du adapter du code arduino car les tutos/codes étaient avec l'ancienne version du PZEM.
Si cela intéresse quelqu'un je peux éventuellement partager le code.
Répondre