Skip to content
  • Recent
  • Tags
  • 0 Unread 0
  • Categories
  • Unreplied
  • Popular
  • GitHub
  • Docu
  • Hilfe
Skins
  • Light
  • Brite
  • Cerulean
  • Cosmo
  • Flatly
  • Journal
  • Litera
  • Lumen
  • Lux
  • Materia
  • Minty
  • Morph
  • Pulse
  • Sandstone
  • Simplex
  • Sketchy
  • Spacelab
  • United
  • Yeti
  • Zephyr
  • Dark
  • Cyborg
  • Darkly
  • Quartz
  • Slate
  • Solar
  • Superhero
  • Vapor

  • Default (No Skin)
  • No Skin
Collapse
Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. [Tutorial] PZEM-004T 3 Phasen Überwachung

NEWS

  • Wartung am 15.11. – Forum ab 22:00 Uhr nicht erreichbar
    BluefoxB
    Bluefox
    12
    2
    263

  • UPDATE 31.10.: Amazon Alexa - ioBroker Skill läuft aus ?
    apollon77A
    apollon77
    48
    3
    8.0k

  • Monatsrückblick – September 2025
    BluefoxB
    Bluefox
    13
    1
    1.7k

[Tutorial] PZEM-004T 3 Phasen Überwachung

[Tutorial] PZEM-004T 3 Phasen Überwachung

Scheduled Pinned Locked Moved Praktische Anwendungen (Showcase)
pzem-004t-v30monitoringüberwachungmessunghow-totutorial
283 Posts 37 Posters 78.9k Views 41 Watching
  • Oldest to Newest
  • Newest to Oldest
  • Most Votes
Reply
  • Reply as topic
Log in to reply
This topic has been deleted. Only users with topic management privileges can see it.
  • E elektrickser.de

    @HomeZecke

    Tolle Arbeit mit deiner Visu. Könntest du diese zur Verfügung stellen? Ich würde diese gerne in meiner Visu nutzen.

    Gruß Elektrickser

    HomeZeckeH Offline
    HomeZeckeH Offline
    HomeZecke
    wrote on last edited by
    #41

    @elektrickser-de sagte in [Tutorial] PZEM-004T 3 Phasen Überwachung:

    @HomeZecke

    Tolle Arbeit mit deiner Visu. Könntest du diese zur Verfügung stellen? Ich würde diese gerne in meiner Visu nutzen.

    Gruß Elektrickser

    Klar, gerne.

    strom_view.txt

    Grüße...

    M 1 Reply Last reply
    1
    • HomeZeckeH Offline
      HomeZeckeH Offline
      HomeZecke
      wrote on last edited by
      #42

      Hallo,

      da es Nachfragen wegen der von mir erstellten Firmware gab, habe ich sie hier veröffentlicht. Folgendes gibt es zu beachten:

      1. Ich hafte nicht für Schäden die durch Benutzung meiner Software entstehen könnten! Nutzung auf eigene Gefahr!
      2. Ich biete nur bedingt support! (Je nach Laune und Zeit😁 )
      3. Veränderungen am Quellcode können gerne vorgenommen und hier veröffentlicht werden

      Kurzanleitung:

      Es gibt keine Konfigurationsmöglichkeit. Die Daten für das eigene Netzwerk müssen im Quellcode angegeben werden. Benötigt werden die SSID das Passwort und die IP des MQTT Brokers. Eine neue Firmware kann über OTA geflasht werden, um den Wemos nicht immer wieder ausbauen zu müssen. Über "http://pzem-webupdate.local/update" sollte das gehen.
      Angeschlossen werden die RX und TX Anschlüsse der PZEMs an folgende Pins (Wemos mini!):
      PZEM 1 D1,D2
      PZEM 2 D4,D3
      PZEM 3 D5,D6
      An D7 kann eine Status LED angeschlossen werden. Die signalisiert den Verbindungsaufbau zum Wlan und bzw Broker.

      Nach dem Flashen und Starten gibt es unter IOBroker MQTT den neuen Datenpunkt "ENERGIE" Dort gibt es dann alle Daten zu jeder Phase und die Gesamtwerte. Die einzigen Werte die man ändern kann sind "PZEM-Reset" und "Verbrauchs-Startwert"

      PZEM-Reset : Wird dieser auf true gesetzt, wird der Energiezähler aller 3 PZEM-Module auf 0 gesetzt.
      Verbrauchs-Startwert: Hier kann der aktuelle Zählerstand des "echten" Hausstromzählers angegeben werden. Damit kann man den Datenpunkt "PZEM-Verbrauch" mit dem Hauszähler synchronisieren.

      Viel Spaß!

      //####################################################################################
      //####################################################################################
      //
      //    PZEM Energiemessgeräterfassung mit WEMOS  von HomeZecke   v1.1 stand 30.03.2020
      //    --------------------------------------------------------------------------
      //     v 1.0      Testphase first release 			          -05.03.2020
      //     v 1.1      Zählerstartwert kann festgelegt werden 		  -30.03.2020			
      //				 
      //     ToDo:      Online Config für Wlan / MQTT usw. hinzuf.
      //
      //     	
      //			  
      //####################################################################################
      //####################################################################################
      
      #include <Arduino.h>
      #include <ESP8266WiFi.h>
      #include <WiFiClient.h>
      #include <ESP8266WebServer.h>
      #include <ESP8266mDNS.h>
      #include <ESP8266HTTPUpdateServer.h>
      #include <Ticker.h>
      #include <PubSubClient.h>
      #include <PZEM004Tv30.h>
      
      //Hier die persönlichen Daten eintragen!
      //---------------------------------------------
      const char* SSID = "WLAN-SSID";
      const char* PSK =  "PASSWORT";
      const char* MQTTserver = "192.168.0.0";
      const uint16_t port = 1883;
      //---------------------------------------------
      const char* version = "Version 1.1";
      const char* host = "PZEM-webupdate";
      const int STATUS_LED = 13;  //D7 (Wemos D1 Mini)
      
      float start_verbrauch = 0;
      float diff_verbrauch = 0;
      float old_spannung_pzem1;
      float old_frequenz_pzem1;
      float old_stromstaerke_pzem1;
      float old_verbrauch_pzem1;
      float old_leistung_pzem1;
      float old_pf_pzem1;
      float old_spannung_pzem2;
      float old_frequenz_pzem2;
      float old_stromstaerke_pzem2;
      float old_verbrauch_pzem2;
      float old_leistung_pzem2;
      float old_pf_pzem2;
      float old_spannung_pzem3;
      float old_frequenz_pzem3;
      float old_stromstaerke_pzem3;
      float old_verbrauch_pzem3;
      float old_leistung_pzem3;
      float old_pf_pzem3;
      float old_spannung_gesamt;
      float old_stromstaerke_gesamt;
      float old_leistung_gesamt;
      float old_verbrauch_gesamt;
      float old_frequenz_gesamt;
      float old_pf_gesamt;
      float old_PZEM_verbrauch;
      
      
      //---functions / callbacks
      void MQTTcallback(char* topic, byte* payload, unsigned int length);
      void pzem_reset();
      void pzem_read();
      void set_counter(float counterStart);
      
      
      //-Klassen definieren
      ESP8266WebServer httpServer(80);
      ESP8266HTTPUpdateServer httpUpdater;
      
      WiFiClient MY_NETClient_1;
      PubSubClient MQTTClient(MY_NETClient_1);
      
      Ticker myTimer1(pzem_read,5000); //Wie oft sollen die Daten aktualisiert werden? (alle 5 Sek.)
      
      PZEM004Tv30 pzem_1(5, 4);    //D1,D2  Wemos D1 Mini L1
      PZEM004Tv30 pzem_2(2, 0);    //D4,D3                             L2
      PZEM004Tv30 pzem_3(14, 12);  //D5,D6                             L3 
      
      
      //=======================================================================================================================
      //MQTT CallBack
      //=======================================================================================================================
      void MQTTcallback(char* topic, byte* payload, unsigned int length)
      {
       
        char my_payload[length+1];  // nen string machen, länge eins mehr wegen nullterminierung
        float counter_start;
        
        Serial.print(topic);
        Serial.print(" : ");
        
        // Topic PZEMreset----------------------------------------------------------------------------------------
        if (strcmp(topic,"Energie/PZEM-Reset") == 0 )
            {
              
                for (unsigned int i = 0; i < length; i++)  // jedes einzelne byte in einen buchstaben umwandeln
                  {              
                     my_payload[i] = (char)payload[i];   // (char)100 wäre zb ein "d"
                  };
      
                my_payload[length] = '\0';              // nullterminierung
                Serial.println(my_payload);
                
                if (strcmp(my_payload,"true") == 0)
                  {
                      pzem_reset();                //Energie an den PZEM's resetten
                  }
              
            }
      
        // Topic Verbrauchs-Startwert------------------------------------------------------------------------------
        if (strcmp(topic,"Energie/Verbrauchs-Startwert") == 0 )
            {
              
                for (unsigned int i = 0; i < length; i++)  // jedes einzelne byte in einen buchstaben umwandeln
                  {              
                     my_payload[i] = (char)payload[i];   // (char)100 wäre zb ein "d"
                  };
      
                my_payload[length] = '\0';              // nullterminierung
                Serial.println(my_payload);
                counter_start = atof(my_payload);    // nen float aus der payload machen
                
                if (counter_start != start_verbrauch)
                  {
                    start_verbrauch = counter_start;
                    set_counter(counter_start); // func set_couter zum setzen aufrufen
                  }
      
               
      
              
            }      
      
      }
      
      //=======================================================================================================================
      //WLan -Verbindung aufbauen
      //=======================================================================================================================
      void initWiFi()
      {
      
          Serial.println("");
          Serial.print("Wifi connect...");
          WiFi.begin(SSID, PSK);
      
          while (WiFi.status() != WL_CONNECTED)
            {
              digitalWrite(STATUS_LED,!digitalRead(STATUS_LED));
              Serial.print(".");   
              delay(700);
            };
      
          Serial.print("Verbunden!");
          WiFi.mode(WIFI_STA);
      
      }
      
      
      
      //=======================================================================================================================
      //MQTT -Verbindung aufbauen
      //=======================================================================================================================
      void initMQTT(){
      
         
          MQTTClient.setServer(MQTTserver,port);
          MQTTClient.setCallback(MQTTcallback);
      
          Serial.println("");
          Serial.print("MQTT verbinden...");
      
          //--Verbindungsloop
          while( !MQTTClient.connect("Energie_PZEM") ) 
            {
              digitalWrite(STATUS_LED,!digitalRead(STATUS_LED));
              Serial.print("*");  
              delay(100);
            };
      
          digitalWrite(STATUS_LED,false);   
          Serial.print("MQTT ist verbunden!"); 
      
          //--Topics abbonieren---------------------------------------------------- 
          if (MQTTClient.subscribe("Energie/PZEM-Reset"))
            {
                  Serial.println("MQTT : Energie: Reset aboniert"); 
            };
      
          if (MQTTClient.subscribe("Energie/Verbrauchs-Startwert"))
            {
                  Serial.println("MQTT : Energie/Verbrauchs-Startwert aboniert"); 
            }; 
      }
      
      
      
      //=======================================================================================================================
      //PZEM Module auslesen und publishen
      //=======================================================================================================================
      void pzem_read(){
      
        float spannung_gesamt;
        float stromstaerke_gesamt;
        float leistung_gesamt;
        float verbrauch_gesamt;
        float frequenz_gesamt;
        float pf_gesamt;
        float PZEM_verbrauch = 0;
      
        float spannung_pzem1 = pzem_1.voltage();
      	float stromstaerke_pzem1 = pzem_1.current();
      	float leistung_pzem1 = pzem_1.power();
      	float verbrauch_pzem1 = pzem_1.energy();
      	float frequenz_pzem1 = pzem_1.frequency();
      	float pf_pzem1 = pzem_1.pf();
      	
      	float spannung_pzem2 = pzem_2.voltage();
      	float stromstaerke_pzem2 = pzem_2.current();
      	float leistung_pzem2 = pzem_2.power();
      	float verbrauch_pzem2 = pzem_2.energy();
      	float frequenz_pzem2 = pzem_2.frequency();
      	float pf_pzem2 = pzem_2.pf();
      	
      	float spannung_pzem3 = pzem_3.voltage();
      	float stromstaerke_pzem3 = pzem_3.current();
      	float leistung_pzem3 = pzem_3.power();
      	float verbrauch_pzem3 = pzem_3.energy();
      	float frequenz_pzem3 = pzem_3.frequency();
      	float pf_pzem3 = pzem_3.pf();	
      
       // char* Temp_String = "           ";
        char Temp_String[12];
      
        if(!isnan(spannung_pzem1) && old_spannung_pzem1 != spannung_pzem1)
          { 
            dtostrf(spannung_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/SpannungL1", Temp_String);
            old_spannung_pzem1 = spannung_pzem1;
          }
      
        if(!isnan(spannung_pzem2) && old_spannung_pzem2 != spannung_pzem2)
          { 
            dtostrf(spannung_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/SpannungL2", Temp_String);
            old_spannung_pzem2 = spannung_pzem2;
          }
      
        if(!isnan(spannung_pzem3) && old_spannung_pzem3 != spannung_pzem3)
          { 
            dtostrf(spannung_pzem3,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L3/SpannungL3", Temp_String);
            old_spannung_pzem3 = spannung_pzem3;
          }
      
        if(!isnan(stromstaerke_pzem1) && old_stromstaerke_pzem1 != stromstaerke_pzem1)
          { 
            dtostrf(stromstaerke_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/StromstaerkeL1", Temp_String);
            old_stromstaerke_pzem1 = stromstaerke_pzem1;
          }
      
        if(!isnan(stromstaerke_pzem2) && old_stromstaerke_pzem2 != stromstaerke_pzem2)
          { 
            dtostrf(stromstaerke_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/StromstaerkeL2", Temp_String);
            old_stromstaerke_pzem2 = stromstaerke_pzem2;
          }
      
        if(!isnan(stromstaerke_pzem3) && old_stromstaerke_pzem3 != stromstaerke_pzem3)
          { 
            dtostrf(stromstaerke_pzem3,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L3/StromstaerkeL3", Temp_String);
            old_stromstaerke_pzem3 = stromstaerke_pzem3;
          }
      
        if(!isnan(leistung_pzem1) && old_leistung_pzem1 != leistung_pzem1)
          { 
            dtostrf(leistung_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/LeistungL1", Temp_String);
            old_leistung_pzem1 = leistung_pzem1;
          }
      
        if(!isnan(leistung_pzem2) && old_leistung_pzem2 != leistung_pzem2)
          { 
            dtostrf(leistung_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/LeistungL2", Temp_String);
            old_leistung_pzem2 = leistung_pzem2;
          }
      
        if(!isnan(leistung_pzem3) && old_leistung_pzem3 != leistung_pzem3)
          { 
            dtostrf(leistung_pzem3,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L3/LeistungL3", Temp_String);
            old_leistung_pzem3 = leistung_pzem3;
          }
      
        if(!isnan(verbrauch_pzem1) && old_verbrauch_pzem1 != verbrauch_pzem1)
          { 
            dtostrf(verbrauch_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/VerbrauchL1", Temp_String);
            old_verbrauch_pzem1 = verbrauch_pzem1;
          }
      
        if(!isnan(verbrauch_pzem2) && old_verbrauch_pzem2 != verbrauch_pzem2)
          { 
            dtostrf(verbrauch_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/VerbrauchL2", Temp_String);
            old_verbrauch_pzem2 = verbrauch_pzem2;
          }
      
        if(!isnan(verbrauch_pzem3) && old_verbrauch_pzem3 != verbrauch_pzem3)
          { 
            dtostrf(verbrauch_pzem3,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L3/VerbrauchL3", Temp_String);
            old_verbrauch_pzem3 = verbrauch_pzem3;
          }
      
        if(!isnan(frequenz_pzem1) && old_frequenz_pzem1 != frequenz_pzem1)
          { 
            dtostrf(frequenz_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/FrequenzL1", Temp_String);
            old_frequenz_pzem1 = frequenz_pzem1;
          } 
      
        if(!isnan(frequenz_pzem2) && old_frequenz_pzem1 != frequenz_pzem2)
          { 
            dtostrf(frequenz_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/FrequenzL2", Temp_String);
            old_frequenz_pzem2 = frequenz_pzem2;
          } 
      
        if(!isnan(frequenz_pzem3) && old_frequenz_pzem3 != frequenz_pzem3)
          { 
            dtostrf(frequenz_pzem3,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L3/FrequenzL3", Temp_String);
            old_frequenz_pzem3 = frequenz_pzem3;
          } 
      
       if(!isnan(pf_pzem1) && old_pf_pzem1 != pf_pzem1)
          { 
            dtostrf(pf_pzem1,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L1/PowerFactorL1", Temp_String);
            old_pf_pzem1 = pf_pzem1;
          }  
      
       if(!isnan(pf_pzem2) && old_pf_pzem2 != pf_pzem2)
          { 
            dtostrf(pf_pzem2,5 , 2, Temp_String);
            MQTTClient.publish ("Energie/L2/PowerFactorL2", Temp_String);
            old_pf_pzem2 = pf_pzem2;
          }   
      
       if(!isnan(pf_pzem3) && old_pf_pzem3 != pf_pzem3)
        { 
          dtostrf(pf_pzem3,5 , 2, Temp_String);
          MQTTClient.publish ("Energie/L3/PowerFactorL3", Temp_String);
          old_pf_pzem3 = pf_pzem3;
        }
      
      
       if(!isnan(spannung_pzem1) && !isnan(spannung_pzem2) && !isnan(spannung_pzem3))
        {
          spannung_gesamt = (spannung_pzem1 + spannung_pzem2 + spannung_pzem3) / 3   ;
        }
       else
        {
          spannung_gesamt = 0;
        }
           
       
       if(!isnan(stromstaerke_pzem1) && !isnan(stromstaerke_pzem2) && !isnan(stromstaerke_pzem3))
        {
          stromstaerke_gesamt = stromstaerke_pzem1 + stromstaerke_pzem2 + stromstaerke_pzem3 ;
        }
       else
        {
          stromstaerke_gesamt = 0;
        } 
      
       if(!isnan(leistung_pzem1) && !isnan(leistung_pzem2) && !isnan(leistung_pzem3))
        {
          leistung_gesamt = leistung_pzem1 + leistung_pzem2 + leistung_pzem3 ;
        }
       else
        {
          leistung_gesamt = 0;
        } 
      
       if(!isnan(verbrauch_pzem1) && !isnan(verbrauch_pzem2) && !isnan(verbrauch_pzem3))
        {
          verbrauch_gesamt = verbrauch_pzem1 + verbrauch_pzem2 + verbrauch_pzem3 ;
          PZEM_verbrauch   = verbrauch_gesamt;
          verbrauch_gesamt = start_verbrauch + verbrauch_gesamt - diff_verbrauch;
        }
       else
        {
          verbrauch_gesamt = 0;
        }
      
       if(!isnan(frequenz_pzem1) && !isnan(frequenz_pzem2) && !isnan(frequenz_pzem3))
        {
          frequenz_gesamt = (frequenz_pzem1 + frequenz_pzem2 + frequenz_pzem3) / 3;
        }
       else
        {
          frequenz_gesamt = 0;
        } 
      
       if(!isnan(pf_pzem1) && !isnan(pf_pzem2) && !isnan(pf_pzem3))
        {
          pf_gesamt = (pf_pzem1 + pf_pzem2 + pf_pzem3) / 3 ;
        }
       else
        {
          pf_gesamt = 0;
        }    
      
        if (old_spannung_gesamt != spannung_gesamt)
          {
            dtostrf(spannung_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/Spannung",Temp_String);  
            old_spannung_gesamt = spannung_gesamt;
          }
      
        if (old_stromstaerke_gesamt != stromstaerke_gesamt)
          {
            dtostrf(stromstaerke_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/Stromstaerke",Temp_String);
            old_stromstaerke_gesamt = stromstaerke_gesamt;  
          }
        
        if (old_leistung_gesamt != leistung_gesamt)
          {
            dtostrf(leistung_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/Leistung",Temp_String);    
            old_leistung_gesamt = leistung_gesamt;  
          }
      
        if (old_verbrauch_gesamt != verbrauch_gesamt)
          {
            dtostrf(verbrauch_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/Verbrauch",Temp_String); 
            old_verbrauch_gesamt = verbrauch_gesamt;     
          } 
      
        if (old_frequenz_gesamt != frequenz_gesamt)
          {
            dtostrf(frequenz_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/Frequenz",Temp_String);
            old_frequenz_gesamt = frequenz_gesamt;      
          } 
       
        if (old_pf_gesamt != pf_gesamt)
          {
            dtostrf(pf_gesamt,5 , 2, Temp_String);
            MQTTClient.publish("Energie/PowerFactor",Temp_String); 
            old_pf_gesamt = pf_gesamt;     
          } 
      
        if (old_PZEM_verbrauch != PZEM_verbrauch)
        {
            dtostrf(PZEM_verbrauch,5 , 2, Temp_String);
            MQTTClient.publish("Energie/PZEM-Verbrauch",Temp_String); 
            old_PZEM_verbrauch = PZEM_verbrauch; 
        }
           
      
        digitalWrite(STATUS_LED,true);
        delay(50);
        digitalWrite(STATUS_LED,false);  
      
      };
      
      
      
      //=======================================================================================================================
      //Energieverbrauch in pzem Modulen zurücksetzen
      //=======================================================================================================================
      void pzem_reset()
      {
      
        myTimer1.pause();
        Serial.println("Energieverbrauch wird zurückgesetzt..!");
        
        pzem_1.resetEnergy();
      	pzem_2.resetEnergy();
      	pzem_3.resetEnergy();
        delay(1000);
        
        MQTTClient.publish("Energie/PZEM-Reset","false");
        myTimer1.resume();
      	
      }
      
      
      //=======================================================================================================================
      //Startwert für Verbrauchszähler setzen
      //=======================================================================================================================
      void set_counter(float counterStart){
      
        myTimer1.pause();
        
        float verbrauch_pzem1 = pzem_1.energy();
        float verbrauch_pzem2 = pzem_2.energy();
        float verbrauch_pzem3 = pzem_3.energy();
      
        float verbrauch_gesamt = verbrauch_pzem1 + verbrauch_pzem2 + verbrauch_pzem3;
        diff_verbrauch = verbrauch_gesamt;
      
        myTimer1.resume();
      
      
      
      }
      
      // #####################################################################################################
      // #####################################################################################################
      // Die SETUP Routine
      // #####################################################################################################
      // #####################################################################################################
      void setup()
      {
      
        pinMode(STATUS_LED,OUTPUT);
        digitalWrite(STATUS_LED,LOW);
        
        Serial.begin(9600);
        delay(100);
        Serial.println("");
        Serial.println("PZEM 3-Phasen-Reader");  
        
        Serial.println(version);
        Serial.println("");
      
        initWiFi();
        initMQTT();
      
        MQTTClient.publish("Energie/Info",version);
      
      
        //--OTA Over the Air update einrichten
        MDNS.begin(host);
        httpUpdater.setup(&httpServer);
        httpServer.begin();
        MDNS.addService("http", "tcp", 80);
        Serial.printf("HTTPUpdateServer ready! Open http://%s.local/update in your browser\n", host);
        
       
        //--Timer für PZEM lesen und senden starten
        myTimer1.start();
       
      }
      
      
      // #####################################################################################################
      // #####################################################################################################
      // Die Haupt-  LOOP Routine
      // #####################################################################################################
      // #####################################################################################################
      void loop(){
      
        //--Wifi verloren? dann neu aufbauen
        if (WiFi.status() != WL_CONNECTED)
          {
            initWiFi();
          };
      
        //--MQTT Verbindung verloren? dann neu aufbauen
        if (MQTTClient.state() != MQTT_CONNECTED) 
          {
            initMQTT();
          };
      
        MQTTClient.loop();
        httpServer.handleClient();
        MDNS.update();
        myTimer1.update();
      
      
        delay(10);
      
      
      
      }
      
      K 1 Reply Last reply
      3
      • S Offline
        S Offline
        spaceduck
        wrote on last edited by
        #43

        Hallo,

        bei mir wirft der Compiler einen Fehler bei: Ticker myTimer1(pzem_read,5000);
        Frage: Welche ticker.h lib verwendest Du? Die mit dem ESP8266 Boardverwalter Paket mitkommt oder was anderes?

        Danke...

        HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

        NinjaTurtle85N 1 Reply Last reply
        0
        • HomeZeckeH Offline
          HomeZeckeH Offline
          HomeZecke
          wrote on last edited by
          #44

          Hallo,

          [https://github.com/sstaub/Ticker]

          und bei der PZEM Lib benutze ich die neuere Lib
          [https://github.com/mandulaj/PZEM-004T-v30],
          da ich V3 Module benutze. Für alte PZEM-Module kann (muss?) auch eine alte Lib benutzt werden.

          Grüße..

          1 Reply Last reply
          0
          • HomeZeckeH HomeZecke

            @elektrickser-de sagte in [Tutorial] PZEM-004T 3 Phasen Überwachung:

            @HomeZecke

            Tolle Arbeit mit deiner Visu. Könntest du diese zur Verfügung stellen? Ich würde diese gerne in meiner Visu nutzen.

            Gruß Elektrickser

            Klar, gerne.

            strom_view.txt

            Grüße...

            M Offline
            M Offline
            manrum1
            wrote on last edited by manrum1
            #45

            @HomeZecke Zu deiner strom_view.txt: Ich kann den code nicht importieren, darf ich fragen welche Oberfläche du für deinen IOBroker nutzt?

            HomeZeckeH 1 Reply Last reply
            0
            • M manrum1

              @HomeZecke Zu deiner strom_view.txt: Ich kann den code nicht importieren, darf ich fragen welche Oberfläche du für deinen IOBroker nutzt?

              HomeZeckeH Offline
              HomeZeckeH Offline
              HomeZecke
              wrote on last edited by
              #46

              Geht bei mir mit Chrome Browser auf PC, FullyKiosk und der Android Vis-App. Habe bei mir das ganze noch einmal test-weise importiert - geht. Nur das Hintergrundbild fehlt. Habe ich nicht mitgeliefert.

              Grüße...

              1 Reply Last reply
              0
              • SBorgS Offline
                SBorgS Offline
                SBorg
                Forum Testing Most Active
                wrote on last edited by
                #47

                Jepp, eben probiert. Funktioniert (die Navileiste unten geht natürlich auch nicht 😁 )

                Du importierst es aber auch wirklich als VIEW, nicht als Widget?

                LG SBorg ( SBorg auf GitHub)
                Projekte: Lebensmittelwarnung.de | WLAN-Wetterstation | PimpMyStation

                1 Reply Last reply
                0
                • S Offline
                  S Offline
                  spaceduck
                  wrote on last edited by spaceduck
                  #48

                  Ich hab den Code noch etwas angepasst weil ich bei meinem mqtt Server eine Passwortabfrage eingerichtet habe, also vielleicht hilft es jemanden:

                  const char* mqttUser = "user";
                  const char* mqttPassword = "password";
                  
                  // while( !MQTTClient.connect("Energie_PZEM") ) 
                  while( !MQTTClient.connect("Energie_PZEM", mqttUser, mqttPassword)) 
                  

                  HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

                  1 Reply Last reply
                  0
                  • S spaceduck

                    Hallo,

                    bei mir wirft der Compiler einen Fehler bei: Ticker myTimer1(pzem_read,5000);
                    Frage: Welche ticker.h lib verwendest Du? Die mit dem ESP8266 Boardverwalter Paket mitkommt oder was anderes?

                    Danke...

                    NinjaTurtle85N Offline
                    NinjaTurtle85N Offline
                    NinjaTurtle85
                    wrote on last edited by NinjaTurtle85
                    #49

                    @spaceduck konntest du den Fehler beseitigen? Ich habe die Lib`s von HomeZecke installiert der fehler kommt trotzdem.

                    Ich habe jetzt gesehen das mein Arduino: No Matching function for call to Ticker::Ticker(void (&) (), int) auswirft.
                    Kann mir jemand helfen?

                    S 1 Reply Last reply
                    0
                    • NinjaTurtle85N NinjaTurtle85

                      @spaceduck konntest du den Fehler beseitigen? Ich habe die Lib`s von HomeZecke installiert der fehler kommt trotzdem.

                      Ich habe jetzt gesehen das mein Arduino: No Matching function for call to Ticker::Ticker(void (&) (), int) auswirft.
                      Kann mir jemand helfen?

                      S Offline
                      S Offline
                      spaceduck
                      wrote on last edited by spaceduck
                      #50

                      @NinjaTurtle85
                      ja, ich konnte es wie folgt lösen: kopiere die Ticker.h und Ticker.cpp von hier: https://github.com/sstaub/Ticker

                      in Dein Sketchverzeichnis. Dann änderst du die include Anweisung von

                      #include <Ticker.h>
                      in
                      #include "Ticker.h"

                      Hintergrund: Die ESP8266 Unterstützung bringt eine eigene Ticker Lib mit, ich konnte den Compiler aber nicht überreden die alternative Lib zu verwenden. Wenn die jedoch direkt im Sketch liegt und mit " " eingebunden wird, dann wird sie auch verwendet.

                      Gib Bescheid ob es funktioniert.

                      HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

                      HomeZeckeH NinjaTurtle85N 2 Replies Last reply
                      0
                      • S spaceduck

                        @NinjaTurtle85
                        ja, ich konnte es wie folgt lösen: kopiere die Ticker.h und Ticker.cpp von hier: https://github.com/sstaub/Ticker

                        in Dein Sketchverzeichnis. Dann änderst du die include Anweisung von

                        #include <Ticker.h>
                        in
                        #include "Ticker.h"

                        Hintergrund: Die ESP8266 Unterstützung bringt eine eigene Ticker Lib mit, ich konnte den Compiler aber nicht überreden die alternative Lib zu verwenden. Wenn die jedoch direkt im Sketch liegt und mit " " eingebunden wird, dann wird sie auch verwendet.

                        Gib Bescheid ob es funktioniert.

                        HomeZeckeH Offline
                        HomeZeckeH Offline
                        HomeZecke
                        wrote on last edited by
                        #51

                        Sorry, habe das nur mit platformio probiert. Da gab es keine Probleme. Kann man eh nur empfehlen.

                        Grüße....

                        S 1 Reply Last reply
                        0
                        • HomeZeckeH HomeZecke

                          Sorry, habe das nur mit platformio probiert. Da gab es keine Probleme. Kann man eh nur empfehlen.

                          Grüße....

                          S Offline
                          S Offline
                          spaceduck
                          wrote on last edited by
                          #52

                          @HomeZecke PlatformIO kannte ich noch garnicht, hab es gerade mal installiert - schaut gut aus!
                          Danke für den Tipp!

                          HP Gen8 16GB / Ubuntu Server 20.04 LTS - Nein, ein Server braucht keine GUI…;-)

                          1 Reply Last reply
                          0
                          • S spaceduck

                            @NinjaTurtle85
                            ja, ich konnte es wie folgt lösen: kopiere die Ticker.h und Ticker.cpp von hier: https://github.com/sstaub/Ticker

                            in Dein Sketchverzeichnis. Dann änderst du die include Anweisung von

                            #include <Ticker.h>
                            in
                            #include "Ticker.h"

                            Hintergrund: Die ESP8266 Unterstützung bringt eine eigene Ticker Lib mit, ich konnte den Compiler aber nicht überreden die alternative Lib zu verwenden. Wenn die jedoch direkt im Sketch liegt und mit " " eingebunden wird, dann wird sie auch verwendet.

                            Gib Bescheid ob es funktioniert.

                            NinjaTurtle85N Offline
                            NinjaTurtle85N Offline
                            NinjaTurtle85
                            wrote on last edited by
                            #53

                            @spaceduck SUPER! Das hat schonmal geklappt Danke!
                            Wenn Du mir jetzt noch sagen könntets wo Ich deinen Code zum Anmelden mit Benutzer und Passwort angeben musst bist Du mein Held 😁 👍

                            HomeZeckeH 1 Reply Last reply
                            0
                            • NinjaTurtle85N NinjaTurtle85

                              @spaceduck SUPER! Das hat schonmal geklappt Danke!
                              Wenn Du mir jetzt noch sagen könntets wo Ich deinen Code zum Anmelden mit Benutzer und Passwort angeben musst bist Du mein Held 😁 👍

                              HomeZeckeH Offline
                              HomeZeckeH Offline
                              HomeZecke
                              wrote on last edited by
                              #54

                              @NinjaTurtle85 Morgens,
                              Du musst in Funktion initMQTT die Änderungen eintragen.

                              Grüße...

                              1 Reply Last reply
                              1
                              • NinjaTurtle85N Offline
                                NinjaTurtle85N Offline
                                NinjaTurtle85
                                wrote on last edited by
                                #55

                                So, gestern habe Ich alles Anklemmen lassen und läuft soweit auch stabil.
                                Nur aktualliesiert sich mein L3 nur sporadisch somit fallen die Gesamten Daten der Addierten Datenpunkte auf Null. Kennt jemand das Phänomen? Der PZEM von L3 blinkt auch anders als L1 und L2.

                                HomeZeckeH 1 Reply Last reply
                                0
                                • NinjaTurtle85N NinjaTurtle85

                                  So, gestern habe Ich alles Anklemmen lassen und läuft soweit auch stabil.
                                  Nur aktualliesiert sich mein L3 nur sporadisch somit fallen die Gesamten Daten der Addierten Datenpunkte auf Null. Kennt jemand das Phänomen? Der PZEM von L3 blinkt auch anders als L1 und L2.

                                  HomeZeckeH Offline
                                  HomeZeckeH Offline
                                  HomeZecke
                                  wrote on last edited by
                                  #56

                                  @NinjaTurtle85 tausch doch testweise mal die Anschlüsse auf einen anderen deiner pzems um zu sehen ob der pzem ne macke hat.

                                  NinjaTurtle85N 1 Reply Last reply
                                  0
                                  • HomeZeckeH HomeZecke

                                    @NinjaTurtle85 tausch doch testweise mal die Anschlüsse auf einen anderen deiner pzems um zu sehen ob der pzem ne macke hat.

                                    NinjaTurtle85N Offline
                                    NinjaTurtle85N Offline
                                    NinjaTurtle85
                                    wrote on last edited by
                                    #57

                                    @HomeZecke Das hatte ich schon probiert, immer L3 blinkt doppelt.
                                    Aber ich habe jetzt im Hutschienennetzteil die spannung etwas unter 5V gedreht, jetzt läuft es.
                                    Danke Euch für die ganze Hilfe! 👍

                                    Johannes BauerstatterJ 1 Reply Last reply
                                    0
                                    • NinjaTurtle85N NinjaTurtle85

                                      @HomeZecke Das hatte ich schon probiert, immer L3 blinkt doppelt.
                                      Aber ich habe jetzt im Hutschienennetzteil die spannung etwas unter 5V gedreht, jetzt läuft es.
                                      Danke Euch für die ganze Hilfe! 👍

                                      Johannes BauerstatterJ Offline
                                      Johannes BauerstatterJ Offline
                                      Johannes Bauerstatter
                                      wrote on last edited by Johannes Bauerstatter
                                      #58

                                      Hallo, vielen dank für die schönen Anleitungen. Hab es jetzt auch mittels Tasmota ans Laufen gebracht. Kann mir bitte noch jemand sagen, wie ich jetzt ordentliche Datenpunkte bekomme:

                                      ef94272d-d1eb-4c9d-91ba-0d9fab137668-image.png

                                      {"Time":"2020-06-19T16:32:13","ENERGY":{"TotalStartTime":"2020-06-19T14:52:20","Total":0.242,"Yesterday":0.000,"Today":0.242,"Period":15,"Power":[196,7,5],"ApparentPower":[248,21,12],"ReactivePower":[153,20,11],"Factor":[0.79,0.34,0.42],"Frequency":[50,50,50],"Voltage":[233,234,234],"Current":[1.068,0.092,0.053]}}
                                      

                                      Wie kann den String in einen Datenpunkt umwandeln? Ich benötige eigentlich nur die Summe der ApparentPower. Brauche ich dafür eine Skript oder kann ich da was direkt bei Tasmota einstellen?

                                      Vielen Dank für Hilfestellungen.

                                      Edit: Konnte es mittels Sonoff - Adapter lösen.

                                      1 Reply Last reply
                                      0
                                      • HomeZeckeH HomeZecke

                                        So...

                                        für alle die auch an einer Realisierung interessiert sind möchte ich meine Erfahrung nach erfolgreicher Umsetzung mitteilen.

                                        • Ich rate zu PZEM-Modulen mit Split-Core-Messwandlern. Die haben den Vorteil, dass die Hauptdrähte der Verteileung nicht abgeklemmt werden müssen. Außerdem verhindert man dadurch, dass gefährliche Spannungen (@marcuskl - Danke für diesen wichtigen Hinweis!) an den Messwandlern wenn diese erst bei fertiger Installation um die Drähte gelegt werden. Einen Nachteil gibt es jedoch. Die Rastnase und das Gelenk brechen leicht ab. Bei mir ist bei einem die Rastnase und bei einem das Gelenk abgerissen. Das ist jedoch mit einem Kabelbinder in Sekunden gefixt! Im Gegenteil, ein Messwandler konnte ich sogar nur so um den doch sehr starken Draht kriegen. Die PZEM-Modulen mit Split-Core-Messwandlern kriegt man im Moment für unter 10 Euro sogar bei den "Wilden Weibern"

                                        • Die Drähte an den Messwandlern habe ich test-weise auf 100 cm verlängert. Ich konnte keine Messabweichungen feststellen. Das sollte für die meisten Anwendungsfälle reichen.

                                        • Ich habe für die Befestigung der Module auf der Hutschiene Feuchtraum-Installationsdosen aus dem Baumarkt "bei dem es immer was tun gibt" genommen. Es gibt dort welche da passt der PZEM rein als ob es dafür gemacht wurde! Und kosten nur ein paar cent das Stück. Zwei Löcher hinten reingebohrt und mit Kabelbinder an die Hutschiene- Fertig!

                                        • Wie im Tutorial beschrieben, ist jedes PZEM-Modul an die zu messende Phase anzuschließen. Aber auch der zur Phase gehörende Nullleiter ist zu nutzen. Ich weiß nicht ob es sonst zu Messfehlern kommen kann, aber der FI-Schalter könnte auslösen, wenn ein "falscher" nicht zur jeweiligen Phase gehörender Nullleiter benutzt wird.

                                        • Ich habe mir eine eigene Firmware für den Wemos geschrieben, da ich bis jetzt ohne Tasmota-Adapter in IOBroker ausgekommen bin und jetzt nur für die Strommessung keinen installieren wollte. Der Wemos mini hat genug Pin-Eingänge um 3 PZEM's zu betreiben. Das ganze geht bei mir über SoftwareSeriel. Damit kann jeder Serielle Ausgang der PZEM's direkt an den Wemos angeschlossen und ausgewertet werden.
                                          Mir missfiel das Master/Slave-system und das damit nötige Port-Ändern in der Tasmota-Version. Außerdem brauche ich dadurch keine zus. Dioden und Widerstände.

                                        • DAS WICHTIGSTE! Hochspannung! Ich weiß es nervt. Aber im Installationsschrank sind 3Phasen Wechselstrom. Zwischen den Phasen liegen 400 V Spannung! Wenn man nicht weiß, was man da tut, oder sich auch nur ein wenig unsicher ist. Unbedingt sein lassen! Auch der Hinweis ist nötig, dass man das als Leihe gar nicht darf. Und zugelassen ist der Eibau der PZEM's in den Verteilerkasten sicher auch nicht.

                                        Wen das dann alles nicht abhalten kann, so kann es dann in Vis aussehen:
                                        pzem.jpg

                                        Grüße...

                                        R Offline
                                        R Offline
                                        ReverZ
                                        wrote on last edited by ReverZ
                                        #59

                                        @HomeZecke said in [Tutorial] PZEM-004T 3 Phasen Überwachung:

                                        Wie im Tutorial beschrieben, ist jedes PZEM-Modul an die zu messende Phase anzuschließen. Aber auch der zur Phase gehörende Nullleiter ist zu nutzen. Ich weiß nicht ob es sonst zu Messfehlern kommen kann, aber der FI-Schalter könnte auslösen, wenn ein "falscher" nicht zur jeweiligen Phase gehörender Nullleiter benutzt wird.

                                        Muss wirklich jedes PZEM-004T-Modul mit der Phase verbunden werden, die es messen soll?
                                        Was ist der Hintergrund davon? Geht es nur darum die leicht unterschiedliche "230V" Netzspannung zu erfassen um die Leistungsberechnung genauer zu machen?

                                        OpenSourceNomadO 1 Reply Last reply
                                        0
                                        • R ReverZ

                                          @HomeZecke said in [Tutorial] PZEM-004T 3 Phasen Überwachung:

                                          Wie im Tutorial beschrieben, ist jedes PZEM-Modul an die zu messende Phase anzuschließen. Aber auch der zur Phase gehörende Nullleiter ist zu nutzen. Ich weiß nicht ob es sonst zu Messfehlern kommen kann, aber der FI-Schalter könnte auslösen, wenn ein "falscher" nicht zur jeweiligen Phase gehörender Nullleiter benutzt wird.

                                          Muss wirklich jedes PZEM-004T-Modul mit der Phase verbunden werden, die es messen soll?
                                          Was ist der Hintergrund davon? Geht es nur darum die leicht unterschiedliche "230V" Netzspannung zu erfassen um die Leistungsberechnung genauer zu machen?

                                          OpenSourceNomadO Offline
                                          OpenSourceNomadO Offline
                                          OpenSourceNomad
                                          Most Active
                                          wrote on last edited by OpenSourceNomad
                                          #60

                                          @ReverZ said in [Tutorial] PZEM-004T 3 Phasen Überwachung:

                                          Geht es nur darum die leicht unterschiedliche "230V" Netzspannung zu erfassen

                                          "nur" ist gut 😉

                                          75516f62-8385-4f60-b3ec-6ff3f431224d-image.png

                                          Der pzem004t wird aber wohl ohne AC power einfach rein gar nicht's messen 😉

                                          Hier gibt's ein paar weiterführende Info's zur Gerätschaft (pzem004t v3)

                                          Wenn du "nur" die Stromstärke messen willst (und auf den æchten Stromverbrauch, Spannung, Frequenz und Leistungsfaktor verzichten kannst) reicht natürlich eine einfache CT-Clamp aus.
                                          a760ed60-69ef-4a7e-9328-7bde9d3681eb-image.png

                                          „Das Widerlegen von Schwachsinn erfordert eine Größenordnung mehr Energie als dessen Produktion.“ - Alberto Brandolini (Bullshit-Asymmetrie-Prinzip)

                                          R 1 Reply Last reply
                                          0
                                          Reply
                                          • Reply as topic
                                          Log in to reply
                                          • Oldest to Newest
                                          • Newest to Oldest
                                          • Most Votes


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          140

                                          Online

                                          32.4k

                                          Users

                                          81.3k

                                          Topics

                                          1.3m

                                          Posts
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Login

                                          • Don't have an account? Register

                                          • Login or register to search.
                                          • First post
                                            Last post
                                          0
                                          • Recent
                                          • Tags
                                          • Unread 0
                                          • Categories
                                          • Unreplied
                                          • Popular
                                          • GitHub
                                          • Docu
                                          • Hilfe