Skip to content
  • Aktuell
  • Tags
  • 0 Ungelesen 0
  • Kategorien
  • Unreplied
  • Beliebt
  • 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

  • Standard: (Kein Skin)
  • Kein Skin
Einklappen
ioBroker Logo
  1. ioBroker Community Home
  2. Deutsch
  3. Praktische Anwendungen (Showcase)
  4. [Tutorial] PZEM-004T 3 Phasen Überwachung

NEWS

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

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

  • Neues Video "KI im Smart Home" - ioBroker plus n8n
    BluefoxB
    Bluefox
    15
    1
    2.1k

[Tutorial] PZEM-004T 3 Phasen Überwachung

Geplant Angeheftet Gesperrt Verschoben Praktische Anwendungen (Showcase)
pzem-004t-v30monitoringüberwachungmessunghow-totutorial
283 Beiträge 37 Kommentatoren 78.9k Aufrufe 41 Watching
  • Älteste zuerst
  • Neuste zuerst
  • Meiste Stimmen
Antworten
  • In einem neuen Thema antworten
Anmelden zum Antworten
Dieses Thema wurde gelöscht. Nur Nutzer mit entsprechenden Rechten können es sehen.
  • B Beowolf

    @da-phreak

    Würde das auch mit einem Nano gehen? Ich habe noch dieses Neztwerkshield hier:

    https://forum.iobroker.net/assets/uploads/files/1572272769452-images.jpg

    Da passt direkt ein Nano drauf.

    D Offline
    D Offline
    da.phreak
    schrieb am zuletzt editiert von
    #164

    @beowolf Hi. Da wird der SRAM leider etwas knapp. Grad der Netzwerk-Teil braucht schon ein paar kb, so daß es schon 8kb sein müssen. Man könnte den Display und Input-Teil noch rausschmeißen, aber auch dann wird es knapp. Kannst aber auch einen ESP32 nehmen und einfach das WLAN nicht benutzen.

    B 1 Antwort Letzte Antwort
    0
    • D da.phreak

      @beowolf Hi. Da wird der SRAM leider etwas knapp. Grad der Netzwerk-Teil braucht schon ein paar kb, so daß es schon 8kb sein müssen. Man könnte den Display und Input-Teil noch rausschmeißen, aber auch dann wird es knapp. Kannst aber auch einen ESP32 nehmen und einfach das WLAN nicht benutzen.

      B Offline
      B Offline
      Beowolf
      schrieb am zuletzt editiert von
      #165

      @da-phreak

      Dann wäre das doch sehr gut, oder?

      https://german.alibaba.com/product-detail/wt32-eth01-wifi-bluetooth-rj45-gateway-two-in-one-embedded-ethernet-module-serial-port-transparent-transmission-62430552102.html

      Grüße
      Manfred

      Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

      D 1 Antwort Letzte Antwort
      0
      • B Beowolf

        @da-phreak

        Dann wäre das doch sehr gut, oder?

        https://german.alibaba.com/product-detail/wt32-eth01-wifi-bluetooth-rj45-gateway-two-in-one-embedded-ethernet-module-serial-port-transparent-transmission-62430552102.html

        Grüße
        Manfred

        D Offline
        D Offline
        da.phreak
        schrieb am zuletzt editiert von
        #166

        @beowolf Ich benutze die Ethernet.h library. Die unterstützt W5100, W5200 und W5500 chips. Auf dem Modul von alibaba ist wohl ein LAN8720a drauf. Out of the box also nein, müßte erst nachforschen, wie einfach sich das anpassen läßtm

        1 Antwort Letzte Antwort
        0
        • D da.phreak

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

          @da-phreak Wenn es fertig ist kannst du es ja gerne mal zeigen.

          Hi,

          sorry daß ich so lange nichts von mir hab hören lassen. Soweit funktioniert alles, das Gehäuse und die Firmware finden sich hier:

          https://github.com/technyon/pzemctl

          Die Readme ist noch nicht sehr weit, es steht erstmal nur drin, wie man kompiliert. Kommt dann noch.

          Folgende Hardware hab ich benutzt:

          • Arduino Mega 2560
          • W5500 Modul (https://de.aliexpress.com/item/32901601162.html?spm=a2g0s.9042311.0.0.27424c4djYuO1m)
          • SSD1306 Display (https://www.amazon.de/gp/product/B0777HHQDT/ref=ppx_yo_dt_b_asin_title_o00_s00?ie=UTF8&psc=1)
          • Taster (https://www.amazon.de/gp/product/B07DJ8QMB1/ref=ppx_yo_dt_b_asin_title_o08_s00?ie=UTF8&psc=1)
          • last but not least drei pzem004t Module

          Display und Taster sind optional, es läuft auch nur mit LAN. Mit Display kann man mit den Tastern zwischen den Phasen und unterschiedlichen Werten wechseln.

          Das W5500 Modul kommt an die SPI-Pins, zudem muß der Reset PIN mit PIN 53 auf dem Arduino verbunden werden. Das Display läuft dann am noch freien I2C-Port. Die Tasterpins sind 44 und 46, können aber in der Config.h konfiguriert werden.

          Die Konfiguration (IP-Einstellungen und MQTT-Server) werden im EEPROM hinterlegt. Dazu wird beim ersten Start der Setup-Modus initiiert, und ein Webserver wird geöffnet. Die IP-Adresse wird solange auf dem Display angezeigt. Ohne Display muß man die natürlich anders herausfinden (z. B. im Router gucken).

          Wie gesagt, mehr Doku kommt noch.

          20210307_213221.jpg

          18ba5881-3bdb-49de-a4be-9f1ae7f02571.jpeg

          20210325_203231.jpg

          Basti97B Offline
          Basti97B Offline
          Basti97
          Most Active
          schrieb am zuletzt editiert von
          #167

          @da-phreak Super Danke
          Ich bin in der letzten Zeit auch nicht weiter gekommen da ich leider keine Zeit hatte. Ich versuche in den nächsten Tagen mal wieder mich mit den PZEMs zu beschäftigen. Deine Variante ist eine super coole Variante die ich unbedingt mal ausprobieren muss.

          Iobroker läuft als VM auf Proxmoxserver x folgende Hersteller im Einsatz Sonoff, Gosund, Siemens x Aofo über Tasmota x Zigbee x das Smarthome wächst und wächst

          1 Antwort Letzte Antwort
          0
          • V Offline
            V Offline
            videopix
            schrieb am zuletzt editiert von
            #168

            Die Überwachung funktioniert bei mir einwandfrei. Allerdings hat eins der Module eine erhebliche Abweichung. Wenn ich mit der Herstellersoftware kalibrieren will, brauche ich ein Calibration Password. Wie lautet das? 0x3721 funktioniert nicht. Oder gibt es sonst eine Möglichkeit, die Messergebnisse anzupassen?

            1 Antwort Letzte Antwort
            0
            • ice77I Offline
              ice77I Offline
              ice77
              schrieb am zuletzt editiert von
              #169

              Hallo Leute,
              mal eine kurze Frage. Ich will in kürze die 3 PZEM 004 V3 an einem D1 Mini in Betrieb nehmen und habe gesehen dass hier die TX mit einer Diode bestückt wird. Nirgends wird aber der genaue Typ der Diode beschrieben. In der Elektronik Grabbelkiste hab ich Dioden des Typs ZPD 5,6 gefunden. Würden diese funktionieren? 5,6 deutet ja auch 5,6V hin. Passt das?

              Johannes BauerstatterJ B 2 Antworten Letzte Antwort
              0
              • ice77I ice77

                Hallo Leute,
                mal eine kurze Frage. Ich will in kürze die 3 PZEM 004 V3 an einem D1 Mini in Betrieb nehmen und habe gesehen dass hier die TX mit einer Diode bestückt wird. Nirgends wird aber der genaue Typ der Diode beschrieben. In der Elektronik Grabbelkiste hab ich Dioden des Typs ZPD 5,6 gefunden. Würden diese funktionieren? 5,6 deutet ja auch 5,6V hin. Passt das?

                Johannes BauerstatterJ Offline
                Johannes BauerstatterJ Offline
                Johannes Bauerstatter
                schrieb am zuletzt editiert von
                #170

                @ice77 ich benutze BAT43 Dioden von Ama...

                ice77I 1 Antwort Letzte Antwort
                0
                • Johannes BauerstatterJ Johannes Bauerstatter

                  @ice77 ich benutze BAT43 Dioden von Ama...

                  ice77I Offline
                  ice77I Offline
                  ice77
                  schrieb am zuletzt editiert von
                  #171

                  @johannes-bauerstatter
                  verstanden. Hast Du diese "bemessen" oder aus dem Bauch heraus ausgewählt? Wie bekäme ich heraus ob ggf. noch welche aus der "Grabbelkiste" funktionieren könnten? Auf was muss man achten?

                  Johannes BauerstatterJ 1 Antwort Letzte Antwort
                  0
                  • ice77I ice77

                    @johannes-bauerstatter
                    verstanden. Hast Du diese "bemessen" oder aus dem Bauch heraus ausgewählt? Wie bekäme ich heraus ob ggf. noch welche aus der "Grabbelkiste" funktionieren könnten? Auf was muss man achten?

                    Johannes BauerstatterJ Offline
                    Johannes BauerstatterJ Offline
                    Johannes Bauerstatter
                    schrieb am zuletzt editiert von
                    #172

                    @ice77 Sorry, aus dem Bauch. Ich würds einfach probieren da bei den 3,3V nicht viel passieren sollte außer dass es nicht funktioniert. Ob du das Risiko eingehen willst musst du selbst entscheiden außer es meldet sich noch ein Elektroniker der das besser beurteilen kann.

                    1 Antwort Letzte Antwort
                    0
                    • ice77I ice77

                      Hallo Leute,
                      mal eine kurze Frage. Ich will in kürze die 3 PZEM 004 V3 an einem D1 Mini in Betrieb nehmen und habe gesehen dass hier die TX mit einer Diode bestückt wird. Nirgends wird aber der genaue Typ der Diode beschrieben. In der Elektronik Grabbelkiste hab ich Dioden des Typs ZPD 5,6 gefunden. Würden diese funktionieren? 5,6 deutet ja auch 5,6V hin. Passt das?

                      B Offline
                      B Offline
                      Beowolf
                      schrieb am zuletzt editiert von
                      #173

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

                      Hallo Leute,
                      mal eine kurze Frage. Ich will in kürze die 3 PZEM 004 V3 an einem D1 Mini in Betrieb nehmen und habe gesehen dass hier die TX mit einer Diode bestückt wird. Nirgends wird aber der genaue Typ der Diode beschrieben. In der Elektronik Grabbelkiste hab ich Dioden des Typs ZPD 5,6 gefunden. Würden diese funktionieren? 5,6 deutet ja auch 5,6V hin. Passt das?

                      Hallo Ice,

                      schaue mal hier.

                      https://forum.iobroker.net/topic/42261/pzem-004t-3-phasen-überwachung-mit-espeasy-v2-0

                      Ich habe das mit einem Wemos d1 Mini mit der ESPeasy gemacht. Alles drann ohne Widerstand und Diode. Läuft ohne Probleme.

                      Klemm es doch einfach mal drann. Was soll schon passieren? Entweder es läuft oder eben nicht.

                      Grüße
                      Manfred

                      Die Natur braucht nicht unseren Schutz, sie braucht unsere Abwesenheit.

                      ice77I 1 Antwort Letzte Antwort
                      0
                      • B Beowolf

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

                        Hallo Leute,
                        mal eine kurze Frage. Ich will in kürze die 3 PZEM 004 V3 an einem D1 Mini in Betrieb nehmen und habe gesehen dass hier die TX mit einer Diode bestückt wird. Nirgends wird aber der genaue Typ der Diode beschrieben. In der Elektronik Grabbelkiste hab ich Dioden des Typs ZPD 5,6 gefunden. Würden diese funktionieren? 5,6 deutet ja auch 5,6V hin. Passt das?

                        Hallo Ice,

                        schaue mal hier.

                        https://forum.iobroker.net/topic/42261/pzem-004t-3-phasen-überwachung-mit-espeasy-v2-0

                        Ich habe das mit einem Wemos d1 Mini mit der ESPeasy gemacht. Alles drann ohne Widerstand und Diode. Läuft ohne Probleme.

                        Klemm es doch einfach mal drann. Was soll schon passieren? Entweder es läuft oder eben nicht.

                        Grüße
                        Manfred

                        ice77I Offline
                        ice77I Offline
                        ice77
                        schrieb am zuletzt editiert von
                        #174

                        @beowolf
                        ja passiweren wird da nicht viel - das stimmt schon. Ich wollte diese Lösung fertig machen und bei meinen Eltern installieren. Wenn das dann nicht stabil läuft ist es wieder mit langer Fahrerei verbunden und einem meckernden paps...
                        Ggf. versuch ich mal ein paar Dioden aus der Grabbelkiste. Wenns geht is gut, wenn nicht bestell ich die BAT43. Prinzipiell laufen tuts ja schon... nur obs dauerhaft läuft, das hab ich noch nicht probiert. Wollte halt wenn die "Fachleute" eine Diode auf die TX Leitung setzen... das auch so machen... weil auf "komische Fehler" wegen so etwas hatte ich einfach keine Lust.

                        Aber try & error geht natürlich auch.

                        1 Antwort Letzte Antwort
                        0
                        • F Offline
                          F Offline
                          frodo777
                          schrieb am zuletzt editiert von
                          #175

                          @HomeZecke
                          Ich habe dein Projekt erfolgreich nachgebaut , Danke für das Teilen deines Skripts. Läuft Super. Ich habe einen Datenpunt wo ich nichts mit anfangen kann
                          f9cc05f0-b7fd-43ee-ade2-f70267437260-image.png
                          Was bedeutet bei Energie/Verbrauch nan. Und Energie/Verbrauchs-Startwert ist das der Zählerstand bei Inbetriebnahme? Dann muss ich mir mit einen Blockly den aktuellen Zählerstand ausrechnen.

                          D HomeZeckeH 2 Antworten Letzte Antwort
                          0
                          • F frodo777

                            @HomeZecke
                            Ich habe dein Projekt erfolgreich nachgebaut , Danke für das Teilen deines Skripts. Läuft Super. Ich habe einen Datenpunt wo ich nichts mit anfangen kann
                            f9cc05f0-b7fd-43ee-ade2-f70267437260-image.png
                            Was bedeutet bei Energie/Verbrauch nan. Und Energie/Verbrauchs-Startwert ist das der Zählerstand bei Inbetriebnahme? Dann muss ich mir mit einen Blockly den aktuellen Zählerstand ausrechnen.

                            D Offline
                            D Offline
                            da.phreak
                            schrieb am zuletzt editiert von
                            #176

                            @frodo777

                            NaN = Not a number

                            Passiert z. B. wenn eine ungültige Rechenoperation ausgeführt wird, wie teilen durch 0.

                            1 Antwort Letzte Antwort
                            0
                            • F frodo777

                              @HomeZecke
                              Ich habe dein Projekt erfolgreich nachgebaut , Danke für das Teilen deines Skripts. Läuft Super. Ich habe einen Datenpunt wo ich nichts mit anfangen kann
                              f9cc05f0-b7fd-43ee-ade2-f70267437260-image.png
                              Was bedeutet bei Energie/Verbrauch nan. Und Energie/Verbrauchs-Startwert ist das der Zählerstand bei Inbetriebnahme? Dann muss ich mir mit einen Blockly den aktuellen Zählerstand ausrechnen.

                              HomeZeckeH Offline
                              HomeZeckeH Offline
                              HomeZecke
                              schrieb am zuletzt editiert von
                              #177

                              @frodo777

                              Hallo!

                              Der Verbrauch wird addiert aus den Werten VerbrauchL1, VerbrauchL2 Und VerbrauchL3. Dazu kommt noch der Verbrauchs-Startwert, um mit dem "richtigen" Zähler zu synchronisieren. Zeigen denn die 3 Verbrauchswerte Daten an?

                              Grüße...

                              F 1 Antwort Letzte Antwort
                              0
                              • HomeZeckeH HomeZecke

                                @frodo777

                                Hallo!

                                Der Verbrauch wird addiert aus den Werten VerbrauchL1, VerbrauchL2 Und VerbrauchL3. Dazu kommt noch der Verbrauchs-Startwert, um mit dem "richtigen" Zähler zu synchronisieren. Zeigen denn die 3 Verbrauchswerte Daten an?

                                Grüße...

                                F Offline
                                F Offline
                                frodo777
                                schrieb am zuletzt editiert von frodo777
                                #178

                                @homezecke Wird in deinem Skript mit Energie/Verbrauch-Startwert gerechnet oder muss ich mir den aktuellen Zählerstand selbst ausrechnen? Sonst funktioniert alles bestens. Der Fehler lag wohl an einer wackeligen Steckverbindung. Ich habe glaube ich noch einen Fehler gefunden
                                9f71cd04-e5e8-405b-84e5-7ea422aa9d24-image.png
                                müsste das nicht old_frequenz_pzem2 heißen?
                                Deine Visualisierung habe ich auch übernommen, sieht richtig gut aus. Wir hast du das mit dem Verbrauch Gestern und Heute gelöst. Könntest du das Skript teilen, du scheinst da mehr Ahnung zu haben als ich.
                                Grüße

                                F 1 Antwort Letzte Antwort
                                0
                                • F frodo777

                                  @homezecke Wird in deinem Skript mit Energie/Verbrauch-Startwert gerechnet oder muss ich mir den aktuellen Zählerstand selbst ausrechnen? Sonst funktioniert alles bestens. Der Fehler lag wohl an einer wackeligen Steckverbindung. Ich habe glaube ich noch einen Fehler gefunden
                                  9f71cd04-e5e8-405b-84e5-7ea422aa9d24-image.png
                                  müsste das nicht old_frequenz_pzem2 heißen?
                                  Deine Visualisierung habe ich auch übernommen, sieht richtig gut aus. Wir hast du das mit dem Verbrauch Gestern und Heute gelöst. Könntest du das Skript teilen, du scheinst da mehr Ahnung zu haben als ich.
                                  Grüße

                                  F Offline
                                  F Offline
                                  frodo777
                                  schrieb am zuletzt editiert von
                                  #179

                                  @frodo777 Ich beantworte mir die Frage mal selbst. Man muß bei der Eingabe des Zählerstands den Hacken bei Bestätigt machen dann funktioniert es auch. Nach langen probieren hab ich es heraus gefunden. Jetzt wird auch der aktuelle Zählerstand angezeigt. Das Skript für den Verbrauch Gestern und Heute hätte ich aber immer noch gern.
                                  Grüße...

                                  HomeZeckeH 1 Antwort Letzte Antwort
                                  0
                                  • F frodo777

                                    @frodo777 Ich beantworte mir die Frage mal selbst. Man muß bei der Eingabe des Zählerstands den Hacken bei Bestätigt machen dann funktioniert es auch. Nach langen probieren hab ich es heraus gefunden. Jetzt wird auch der aktuelle Zählerstand angezeigt. Das Skript für den Verbrauch Gestern und Heute hätte ich aber immer noch gern.
                                    Grüße...

                                    HomeZeckeH Offline
                                    HomeZeckeH Offline
                                    HomeZecke
                                    schrieb am zuletzt editiert von
                                    #180

                                    @frodo777 Hallo!

                                    Ja, hast Du richtig erkannt, ist ein kleiner BUG. Es muss natürlich "old_frequenz_pzem2" heißen. Copy & paste -Fehler...😁 Also vor dem compilieren noch einmal anpassen. Ist aber nicht sooo schlimm, da die Frequenzwerte der drei Phasen eh sehr eng bei einander liegen.

                                    Deiner bitte zum script kann ich entsprechen.☺ Musst Dich bitte allerdings noch ein paar Tage gedulden. Habe viel um die Ohren. Stelle es hier rein, sobald ich die Zeit dazu habe...

                                    Grüße...

                                    HomeZeckeH 1 Antwort Letzte Antwort
                                    0
                                    • HomeZeckeH HomeZecke

                                      @frodo777 Hallo!

                                      Ja, hast Du richtig erkannt, ist ein kleiner BUG. Es muss natürlich "old_frequenz_pzem2" heißen. Copy & paste -Fehler...😁 Also vor dem compilieren noch einmal anpassen. Ist aber nicht sooo schlimm, da die Frequenzwerte der drei Phasen eh sehr eng bei einander liegen.

                                      Deiner bitte zum script kann ich entsprechen.☺ Musst Dich bitte allerdings noch ein paar Tage gedulden. Habe viel um die Ohren. Stelle es hier rein, sobald ich die Zeit dazu habe...

                                      Grüße...

                                      HomeZeckeH Offline
                                      HomeZeckeH Offline
                                      HomeZecke
                                      schrieb am zuletzt editiert von
                                      #181

                                      Hallo,

                                      wie gewünscht mein script:

                                      /*
                                      ////////////////////////////////////////////////////////////////////////////////
                                      ////////////////////////////////////////////////////////////////////////////////
                                      
                                          Stromzählerscript für PZEM und IOBroker     von Homezecke
                                          ------------------------------------------------------------------------
                                      
                                      
                                      ////////////////////////////////////////////////////////////////////////////////
                                      ////////////////////////////////////////////////////////////////////////////////
                                      */
                                      
                                      
                                      //Initialisierungen-------------------------------------------------------------
                                      createState('StromVerbrauchGestern',0 ); 
                                      createState('StromVerbrauchHeute',0 );
                                      createState('StromKostenHeute',0 );
                                      
                                      createState('Energie.StromVerbrauchStunde',0 )
                                                                        
                                      var timer1 = schedule('1 00 * * *', function() {zaehler()} );
                                      var timer2 = schedule('*/60 * * * *',function() {stundenZaehler()} );  
                                      var tageszaehler = 0;
                                      var tagesDiff = 0;
                                      var stromLetzte = 0;
                                      var tarifEinheit = 27.54 // Kosten pro Einheit in cent angeben!
                                      
                                      
                                      tageszaehler = getState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/).val;
                                      tagesDiff    = getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val - tageszaehler;
                                      
                                      
                                      
                                      
                                      if (tageszaehler == 0)
                                      {
                                         tagesDiff =getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val ;   
                                      }
                                      
                                      
                                      //==============================================================================
                                      //Stromverbrauch -Stundenweise setzen (Stundenzähler)
                                      function stundenZaehler() {
                                      
                                          var diff
                                          var stromAktuell = getState('javascript.0.StromVerbrauchHeute').val;
                                      
                                         
                                          if (stromLetzte != 0)
                                          {
                                            if (stromLetzte < stromAktuell)
                                              {
                                                diff = stromAktuell - stromLetzte;   
                                              }
                                            else
                                              {
                                                diff = stromAktuell
                                              }     
                                          }
                                          else diff = 0;
                                          
                                          stromLetzte = stromAktuell;
                                          
                                      
                                      
                                          setState('Energie.StromVerbrauchStunde',diff);
                                      
                                      }
                                      
                                      //==============================================================================
                                      //Stromverbrauch -Gestern und Heute- setzen  (Tageszähler)
                                      function zaehler() {
                                       
                                        var gesamt = getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val;
                                      
                                        tageszaehler = getState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/).val;
                                        setState('javascript.0.StromVerbrauchGestern'/*StromVerbrauchGestern*/,tageszaehler);
                                        setState('javascript.0.StromKostenGestern',(tageszaehler * tarifEinheit) / 100);  
                                        setState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/,0)
                                        tagesDiff = gesamt;
                                        tageszaehler = 0;
                                       
                                      }
                                      
                                      
                                      //==============================================================================
                                      //Gesamtzählerstand ändert sich
                                      on({id: 'mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/, change: "ne"}, function (obj)
                                      
                                      {
                                          
                                          setState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/,obj.state.val - tagesDiff);
                                          setState('javascript.0.StromKostenHeute',((obj.state.val - tagesDiff) * tarifEinheit) / 100);
                                       
                                      });
                                      
                                      F 1 Antwort Letzte Antwort
                                      0
                                      • HomeZeckeH HomeZecke

                                        Hallo,

                                        wie gewünscht mein script:

                                        /*
                                        ////////////////////////////////////////////////////////////////////////////////
                                        ////////////////////////////////////////////////////////////////////////////////
                                        
                                            Stromzählerscript für PZEM und IOBroker     von Homezecke
                                            ------------------------------------------------------------------------
                                        
                                        
                                        ////////////////////////////////////////////////////////////////////////////////
                                        ////////////////////////////////////////////////////////////////////////////////
                                        */
                                        
                                        
                                        //Initialisierungen-------------------------------------------------------------
                                        createState('StromVerbrauchGestern',0 ); 
                                        createState('StromVerbrauchHeute',0 );
                                        createState('StromKostenHeute',0 );
                                        
                                        createState('Energie.StromVerbrauchStunde',0 )
                                                                          
                                        var timer1 = schedule('1 00 * * *', function() {zaehler()} );
                                        var timer2 = schedule('*/60 * * * *',function() {stundenZaehler()} );  
                                        var tageszaehler = 0;
                                        var tagesDiff = 0;
                                        var stromLetzte = 0;
                                        var tarifEinheit = 27.54 // Kosten pro Einheit in cent angeben!
                                        
                                        
                                        tageszaehler = getState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/).val;
                                        tagesDiff    = getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val - tageszaehler;
                                        
                                        
                                        
                                        
                                        if (tageszaehler == 0)
                                        {
                                           tagesDiff =getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val ;   
                                        }
                                        
                                        
                                        //==============================================================================
                                        //Stromverbrauch -Stundenweise setzen (Stundenzähler)
                                        function stundenZaehler() {
                                        
                                            var diff
                                            var stromAktuell = getState('javascript.0.StromVerbrauchHeute').val;
                                        
                                           
                                            if (stromLetzte != 0)
                                            {
                                              if (stromLetzte < stromAktuell)
                                                {
                                                  diff = stromAktuell - stromLetzte;   
                                                }
                                              else
                                                {
                                                  diff = stromAktuell
                                                }     
                                            }
                                            else diff = 0;
                                            
                                            stromLetzte = stromAktuell;
                                            
                                        
                                        
                                            setState('Energie.StromVerbrauchStunde',diff);
                                        
                                        }
                                        
                                        //==============================================================================
                                        //Stromverbrauch -Gestern und Heute- setzen  (Tageszähler)
                                        function zaehler() {
                                         
                                          var gesamt = getState('mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/).val;
                                        
                                          tageszaehler = getState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/).val;
                                          setState('javascript.0.StromVerbrauchGestern'/*StromVerbrauchGestern*/,tageszaehler);
                                          setState('javascript.0.StromKostenGestern',(tageszaehler * tarifEinheit) / 100);  
                                          setState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/,0)
                                          tagesDiff = gesamt;
                                          tageszaehler = 0;
                                         
                                        }
                                        
                                        
                                        //==============================================================================
                                        //Gesamtzählerstand ändert sich
                                        on({id: 'mqtt.0.Energie.Verbrauch'/*Energie/Verbrauch*/, change: "ne"}, function (obj)
                                        
                                        {
                                            
                                            setState('javascript.0.StromVerbrauchHeute'/*StromVerbrauchHeute*/,obj.state.val - tagesDiff);
                                            setState('javascript.0.StromKostenHeute',((obj.state.val - tagesDiff) * tarifEinheit) / 100);
                                         
                                        });
                                        
                                        F Offline
                                        F Offline
                                        frodo777
                                        schrieb am zuletzt editiert von
                                        #182

                                        @homezecke Danke für das Skript hat sofort funktioniert sehr schönes Projekt von Dir.
                                        L.G.

                                        1 Antwort Letzte Antwort
                                        0
                                        • HomeZeckeH HomeZecke

                                          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 Offline
                                          K Offline
                                          Kopterframe
                                          schrieb am zuletzt editiert von
                                          #183

                                          @homezecke
                                          Super Projekt, vielen Dank. Werde es auch nachbauen, mit nur einer Phase. Da nur eine vorhanden ist.
                                          Habe ich das richtig verstanden,
                                          PZEM1 RX - D1 Wemo und TX - D2 Wemo?
                                          Viele Grüße

                                          1 Antwort Letzte Antwort
                                          0
                                          Antworten
                                          • In einem neuen Thema antworten
                                          Anmelden zum Antworten
                                          • Älteste zuerst
                                          • Neuste zuerst
                                          • Meiste Stimmen


                                          Support us

                                          ioBroker
                                          Community Adapters
                                          Donate

                                          758

                                          Online

                                          32.4k

                                          Benutzer

                                          81.4k

                                          Themen

                                          1.3m

                                          Beiträge
                                          Community
                                          Impressum | Datenschutz-Bestimmungen | Nutzungsbedingungen
                                          ioBroker Community 2014-2025
                                          logo
                                          • Anmelden

                                          • Du hast noch kein Konto? Registrieren

                                          • Anmelden oder registrieren, um zu suchen
                                          • Erster Beitrag
                                            Letzter Beitrag
                                          0
                                          • Aktuell
                                          • Tags
                                          • Ungelesen 0
                                          • Kategorien
                                          • Unreplied
                                          • Beliebt
                                          • GitHub
                                          • Docu
                                          • Hilfe