NEWS
[Tutorial] PZEM-004T 3 Phasen Überwachung
-
Warum nimmst Du nicht ESPeasy V2.0 ?
Hatte ich hier schon mal beschrieben:
https://forum.iobroker.net/topic/42261/pzem-004t-3-phasen-überwachung-mit-espeasy-v2-0
ioBroker bekommt die Daten passend dann per mqtt.
Alles einfach und läuft bei mir seit einem Jahr ohne Probleme.
Ich hatte ja auch schon weiter oben mal etwas geschrieben.
Ich habe das mit einem Wemos d1 Mini mit der ESPeasy gemacht. Alles drann ohne Widerstand und Diode. Läuft ohne Probleme.
Grüße
Manfred -
@helmutlinner Hallo, aller Anfang ist schwer, war bei mir auch so:
Zuerst richtest Du Dir im iobroker Datenpunkte ein, am besten unter dem Objektbaum 0_userdata.0... Dazu nimmst Du folgendes Script und lässt es einmal laufen, danach solltest Du die Datenpunkte sehen:
/* /* Strommessung */ var pfad = '0_userdata.0.Strom.hb.Status.', name_geraet = 'Pzem_hb', // zB Waschmaschine (Achtung keine Umlaute) beschreibung = 'Strommessung Home Base'; // zB // Energie createState(pfad + name_geraet + '.Zaehler.Energy_TotalStartTime', 0, { name: 'Energie Total StartTime', desc: 'xx', type: 'string', unit: '', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Energy_Total', 0, { name: 'Energie total', desc: 'xx', type: 'number', unit: 'kWh', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Energy_Yesterday', 0, { name: 'Energie gestern', desc: 'xx', type: 'number', unit: 'kWh', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Energy_Today', 0, { name: 'Energie heute', desc: 'xx', type: 'number', unit: 'kWh', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Period', 0, { name: 'Periode', desc: 'xx', type: 'number', unit: '', role: '', read: true, write: true }); // Leistung createState(pfad + name_geraet + '.Zaehler.Power_Ph1', 0, { name: 'Leistung Phase 1', desc: 'xx', type: 'number', unit: 'W', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Power_Ph2', 0, { name: 'Leistung Phase 2', desc: 'xx', type: 'number', unit: 'W', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Power_Ph3', 0, { name: 'Leistung Phase 3', desc: 'xx', type: 'number', unit: 'W', role: 'value.power', read: true, write: true }); // Scheinleistung createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph1', 0, { name: 'Scheinleistung Phase 1', desc: 'xx', type: 'number', unit: 'VA', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph2', 0, { name: 'Scheinleistung Phase 2', desc: 'xx', type: 'number', unit: 'VA', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ApparentPower_Ph3', 0, { name: 'Scheinleistung Phase 3', desc: 'xx', type: 'number', unit: 'VA', role: 'value.power', read: true, write: true }); // Blindleistung createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph1', 0, { name: 'Blindleistung Phase 1', desc: 'xx', type: 'number', unit: 'VAr', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph2', 0, { name: 'Blindleistung Phase 2', desc: 'xx', type: 'number', unit: 'VAr', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ReactivePower_Ph3', 0, { name: 'Blindleistung Phase 3', desc: 'xx', type: 'number', unit: 'VAr', role: 'value.power', read: true, write: true }); // Leistungsfaktor createState(pfad + name_geraet + '.Zaehler.Factor_Ph1', 0, { name: 'Leistungsfaktor Phase 1', desc: 'xx', type: 'number', unit: '', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Factor_Ph2', 0, { name: 'Leistungsfaktor Phase 2', desc: 'xx', type: 'number', unit: '', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Factor_Ph3', 0, { name: 'Leistungsfaktor Phase 3', desc: 'xx', type: 'number', unit: '', role: '', read: true, write: true }); // Frequenz createState(pfad + name_geraet + '.Zaehler.Frequency_Ph1', 0, { name: 'Frequenz Phase 1', desc: 'xx', type: 'number', unit: 'Hz', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Frequency_Ph2', 0, { name: 'Frequenz Phase 2', desc: 'xx', type: 'number', unit: 'Hz', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Frequency_Ph3', 0, { name: 'Frequenz Phase 3', desc: 'xx', type: 'number', unit: 'Hz', role: '', read: true, write: true }); // Volt createState(pfad + name_geraet + '.Zaehler.Voltage_Ph1', 0, { name: 'Spannung Phase 1', desc: 'xx', type: 'number', unit: 'V', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Voltage_Ph2', 0, { name: 'Spannung Phase 2', desc: 'xx', type: 'number', unit: 'V', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Voltage_Ph3', 0, { name: 'Spannung Phase 3', desc: 'xx', type: 'number', unit: 'V', role: '', read: true, write: true }); // Strom createState(pfad + name_geraet + '.Zaehler.Current_Ph1', 0, { name: 'Strom Phase 1', desc: 'xx', type: 'number', unit: 'A', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Current_Ph2', 0, { name: 'Strom Phase 2', desc: 'xx', type: 'number', unit: 'A', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Current_Ph3', 0, { name: 'Strom Phase 3', desc: 'xx', type: 'number', unit: 'A', role: '', read: true, write: true }); // Berechnete createState(pfad + name_geraet + '.Zaehler.Current', 0, { name: 'Strom gesamt', desc: 'xx', type: 'number', unit: 'A', role: 'value.power', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Power', 0, { name: 'Leistung gesamt', desc: 'xx', type: 'number', unit: 'W', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ApparentPower', 0, { name: 'Scheinleistung gesamt', desc: 'xx', type: 'number', unit: 'VA', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.ReactivePower', 0, { name: 'Blindleistung gesamt', desc: 'xx', type: 'number', unit: 'VAr', role: 'value.power.consumption', read: true, write: true }); // Zähler createState(pfad + name_geraet + '.Zaehler.Zaehler_actual', 0, { name: 'Zählerstand aktuell', desc: 'xx', type: 'number', unit: 'kWh', role: 'value.power.consumption', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_Korrektur', 0, { name: 'Zähler Korrektur (setzen)', desc: 'xx', type: 'number', unit: 'kWh', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_HT', 0, { name: 'Zählerstand Basiswert HT (setzen)', desc: 'xx', type: 'number', unit: 'kWh', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_NT', 0, { name: 'Zählerstand Basiswert NT (setzen)', desc: 'xx', type: 'number', unit: 'kWh', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_Basiswert', 0, { name: 'Zählerstand Basiswert (setzen oder Summe HT/NT)', desc: 'xx', type: 'number', unit: 'kWh', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_Basiswert_Datum', 0, { name: 'Zählerstand Basiswert Datum/Uhrzeit (setzen)', desc: 'xx', type: 'string', unit: '', role: '', read: true, write: true }); createState(pfad + name_geraet + '.Zaehler.Zaehler_Pzem_Lastchanged', 0, { name: 'Datum/Uhrzeit', desc: 'xx', type: 'string', unit: '', role: '', read: true, write: true });
Als nächstes brauchst Du ein Script, dass den MQTT-String parst (durchsucht) und die Daten auf einzlene Datenpunkte mapped, die wir vorher erzeugt haben.
on('mqtt.0.tele.stromhb.SENSOR', function(dp) { let tstrom = JSON.parse(dp.state.val); if(tstrom['Time']) { let val = tstrom['Time']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Pzem_Lastchanged', val, true); } let strom = JSON.parse(dp.state.val).ENERGY; if(strom['TotalStartTime']) { let val = strom['TotalStartTime']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_TotalStartTime', val, true); } if(strom['Total']) { let val = strom['Total']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Total', val, true); } if(strom['Yesterday']) { let val = strom['Yesterday']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Yesterday', val, true); } if(strom['Today']) { let val = strom['Today']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Today', val, true); } if(strom['Period']) { let val = strom['Period']; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Period', val, true); } if(strom['Power']) { let val = strom['Power'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph1', val, true); } if(strom['Power']) { let val = strom['Power'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph2', val, true); } if(strom['Power']) { let val = strom['Power'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph3', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph1', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph2', val, true); } if(strom['ApparentPower']) { let val = strom['ApparentPower'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph3', val, true); } if(strom['ReactivePower']) { let val = strom['ReactivePower'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph1', val, true); } if(strom['ReactivePower']) { let val = strom['ReactivePower'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph2', val, true); } if(strom['ReactivePower']) { let val = strom['ReactivePower'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph3', val, true); } if(strom['Factor']) { let val = strom['Factor'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph1', val, true); } if(strom['Factor']) { let val = strom['Factor'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph2', val, true); } if(strom['Factor']) { let val = strom['Factor'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Factor_Ph3', val, true); } if(strom['Frequency']) { let val = strom['Frequency'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph1', val, true); } if(strom['Frequency']) { let val = strom['Frequency'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph2', val, true); } if(strom['Frequency']) { let val = strom['Frequency'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Frequency_Ph3', val, true); } if(strom['Voltage']) { let val = strom['Voltage'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph1', val, true); } if(strom['Voltage']) { let val = strom['Voltage'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph2', val, true); } if(strom['Voltage']) { let val = strom['Voltage'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Voltage_Ph3', val, true); } if(strom['Current']) { let val = strom['Current'][0]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph1', val, true); } if(strom['Current']) { let val = strom['Current'][1]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph2', val, true); } if(strom['Current']) { let val = strom['Current'][2]; setState('0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph3', val, true); } setTimeout(function() { // Code, der erst nach 5 Sekunden ausgeführt wird setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_HT").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_NT").val), true); setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Current_Ph3").val), true); setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Power_Ph3").val), true); setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ReactivePower_Ph3").val), true); setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph1").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph2").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.ApparentPower_Ph3").val), true); // setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_actual", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Korrektur").val), true); setState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_actual", (getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Basiswert").val + getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Energy_Total").val - getState("0_userdata.0.Strom.hb.Status.Pzem_hb.Zaehler.Zaehler_Korrektur").val), true); }, 5000); });
Bei mir heißt der Knoten im MQTT-Adapter stromhb, das musst Du natürlich anpassen. Das Script muss dann dauernd laufen.
Am Ende werdne noch einige Berechnungen vorgenommen, ignoriere das erst mal.Viel Erfolg
-
Hallo
Kann mir mal jemand helfen. Irgendwie stecke ich fest. Habe alle drei Module laut Plan verdrahtet. Kann auch jedes Modul einzel auslesen. Leider gehen 3 zusammen nicht. Habe versucht über Tasmota die Adresse der Module zuschreiben. Ohne Erfolg. Die Software für Windows bekomme ich nicht zum laufen. Egal ob mit win 7 oder 10. Kommt immer ein Fehler wenn ich die run über Admin Starte. Gibt es noch ne andere Software für das schreiben der Adresse oder mach ich irgendwo einen Fehler. Danke
Gruß Bernd -
@berti69 said in [Tutorial] PZEM-004T 3 Phasen Überwachung:
Gibt es noch ne andere Software für das schreiben der Adresse
Esphome Das passende snippet dafür steht in der Dokumentation der pzemac (für v3) Komponente.
Vielleicht hilft dir dann im Anschluss auch gleich (das meist sehr aussagekräftig) logging weiter um eventuelle Probleme mit dem pzem004t zu identifizieren -
Hallo Bernd
Ich kann Dir gerne sagen wie ich es ohne Kopfschmerzen gelöst habe:
Verkable immer nur ein einzelnes PZEM an den esp8266 und setze die ID. Gib jedem Gerät eine unterschiedliche ID. Ich habe dazu ESPeasy genutzt, welches ich hier auch anhängen kann, wenn ich das binary noch finde.
Wenn die unterschiedlichen IDs gesetzt wurden, kannst Du alle PZEMs an den ESP hängen und entsprechend konfigurieren.
Das funktioniert 100%. Die einzige Stolperstelle ist, dass immer nur ein einzelner PZEM angehängt sein darf, wenn die ID geschrieben wird.
Falls es nicht klappt... sag bescheid und ich helf dir gern.
LG
PS: ID setzten unter PZEM mode -> program adress
Hier das Binary welches sicher funktioniert:
ESP_Easy_mega_20210114_energy_ESP8266_4M1M.zipHier kannst Du die ID setzen:
-
Danke Euch beiden für die Hilfe. Habe es hinbekommen. Entweder habe ich das irgendwo überlesen oder es ist für Andere selbstverständlich. Ich mußte die isAnalogLibrary.ocx in die Windows Registry eintragen und installieren. Jetzt geht die Messung.
Danke -
@berti69 said in [Tutorial] PZEM-004T 3 Phasen Überwachung:
isAnalogLibrary.ocx in die Windows Registry eintragen und installieren
Hallo...
Hab so meine probleme hiermit. was meinst du damit in die registry eintragen und installieren. bekomme es nicht zum laufen... -
Super Projekt
hat jemand eine Idee warum mein PZEM mir 250V anzeigt und nicht 230V
Danke
-
Foto von Anschluß? Mal mit einem Multimeter gemessen? Hast Du nur den einen? Defekt?
So ist eine Aussage etwas schwierig.
-
Ich habe nochmal eine Frage hier zu welche Diode habt ihr genommen. Ich hoffe das ich das hier nicht überlesen habe .)
-
Guten Tag
Hat jemand eine Idee, warum mir nur die Spannung und die Frequenz angezeit wird? Die Werte für Strom, Leistung usw. bleiben bei Null, obwohl ein Heizlüfter mit 2000 Watt angeschlossen ist!
Ich habe 2 PZEM-004T V3. Einen mit Gehäuse, der andere ohne. Dazu einen geschlossenen und einen geteilten Stromwandler. Ich habe es mit einem Arduino Uno, einem Arduino Nano, mit einem Wemos D1 mini und Tasmota und auch esp easy versucht. Beim Wemus mit und ohne Pegelwandler. Das Ergebniss ist immer gleich. Strom bleibt auf 0,00 A!
Es können doch nicht beide PZEM defekt sein!edition
-
@edition
Ohne Anschlußplan oder ein Bild vom Anschluß ist das etwas schwer zu sagen. -
Im Moment hängt der PZEM am Arduino Nano. +5V ist an 5V, Masse an GND, RX und TX an D12 bzw. D13. Der geteilte Stromwandler hängt am Netzkabel des Heizlüfters, Netzkabel des PZEM ist Phasenrichtig an der gleichen Steckdose eingesteckt. Alle 30 sec blinken die RX/TX LED´s des PZEM kurz auf. Dann wird im Seriellen Monitor der Arduino IDE ein neuer Wertesatz angezeigt.
09:45:07.865 -> Custom Address:1 09:45:07.985 -> Voltage: 234.30V 09:45:07.985 -> Current: 0.00A 09:45:07.985 -> Power: 0.00W 09:45:07.985 -> Energy: 0.001kWh 09:45:07.985 -> Frequency: 50.0Hz 09:45:07.985 -> PF: 0.00
Der Heizlüfter ist gerade aus. Wenn ich ihn einschalte, ändert sich an den Werten nichts!
-
@edition sagte in [Tutorial] PZEM-004T 3 Phasen Überwachung:
Der geteilte Stromwandler hängt am Netzkabel des Heizlüfters
Sitzt der Stromwandler um die komplette Leitung oder nur um eine Ader?
-
Der Stromwandler umschließt die ganze Leitung.
-
@edition
Dann kann es nicht funktionieren.Du kannst Dir das so vorstellen, als ob der Stromwandler gleichzeitig das misst was "rein und wieder raus geht". Das ist eben "Null".
Zur Veranschaulichung ist es einfacher sich das mit Gleichstrom vorzustellen. Dort fliesst ja auch der Strom vom Pluspol durch z.B. einer LED wieder zurück zum Minuspol. Wenn ich jetzt bei Leitungen gleichzeitig durch einen Stromwandler lege heben sich die Ströme auf.
Die Erklärung ist jetzt sehr, sehr einfach gehalten.
Der Stromwandler darf nur eine der beiden Adern die in der Leitung zum Heizlüfter geht messen, dann sollte es auch gehen. Natürlich nicht den Schutzleiter nehmen. Meistens sind die Farben "braun, blau und gelb/grün". Entweder den braunen oder den blauen nehmen.
Wenn ich das so lese, wäre es glaube ich besser, wenn Du die Finger von 230 Volt Leitungen lassen würdest.
-
Hmm, das erschließt sich sogar mir als Schlosser! Dann werde ich mir mal ein "Zwischenkabel" basteln, um nur die Phase zu messen.
Danke für den Tip!
edition
-
@edition
Bitte sei aber vorsichtig. Bei 230 Volt ist "basteln" nicht wirklich sinnvoll. -
Ist schon klar! Basteln ist vielleicht der falsche Ausdruck. Das 230 Volt lebensgefährlich sein können, weiß ich schon. Ich drehe nicht das Haus, wenn ich eine Glühlampe wechseln will!
-
@edition
Und? War das der Fehler?