NEWS
[Tutorial] PZEM-004T 3 Phasen Überwachung
-
@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.
-
@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
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. -
NaN = Not a number
Passiert z. B. wenn eine ungültige Rechenoperation ausgeführt wird, wie teilen durch 0.
-
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...
-
@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
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 -
@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... -
@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...
-
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); });
-
@homezecke Danke für das Skript hat sofort funktioniert sehr schönes Projekt von Dir.
L.G. -
@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 -
Mir ist aufgefallen das die Werte Scheinleistung, Blindleistung und Wirkleistung nicht zusammen passen.
Scheinleistung ist ja Blindleistung und Scheinleistung zusammen gerechnet und wenn ich mir die Messwerte anschaue ergibt des irgendwie kein Sinn?
Bei eich auch so ?
-
-
@dolomiti ok Danke, bin schon lange raus aus dieser Thematik, hatte nur noch in Erinnerung das sich die Scheinleistung aus der Wirk- und Blindleistung zusammensetzt.
-
@marcuskl meinst du den Widerstand im PZEM zwischen optocopler und vcc?
Für was sind die Dioden?
Ich hab es mit einem PZEM 004t und einem esp8266 probiert, ich hab die dioden in alle möglichen Richtungen eingebaut in RX oder TX und auch mit der separaten Versorgung über den Widerstand auf RX. Das hat aber alles nicht funktioniert.Ich hab dann den esp über 5v und ground Versorgung und den Pzem über die selbe Versorgung und RX auf TX, TX auf RX und es funktioniert, jetzt hab ich einen 2 ten PZEM mit Adresse 2 parallel dazu angeschlossen. Jetzt bekomme ich von beiden die Werte.
Ich habe auch in der Tasmota Software auf PZEM016 RX gestellt obwohl ich einen PZEM04t habe, aber nur so funktioniert’s bei mir.
Habt ihr in IObroker einzelne datenpunkte für Spannung Leistung Amper usw? Ich weiß gerade nicht wie ich den einen großen datenpunkt auseinander bekomme dass ich ihn in Grafana verwenden kann. Muss ich da was in tasmota machen damit schon mehrere datenpunkte erzeugt werden?
{"Time":"2021-12-25T14:57:13","ENERGY":{"TotalStartTime":"2021-12-24T22:40:20","Total":0.000,"Yesterday":0.000,"Today":0.000,"Period":[ 0, 0],"Power":[ 0, 0],"ApparentPower":[ 0, 0],"ReactivePower":[ 0, 0],"Factor":[0.00,0.00],"Frequency":[50,50],"Voltage":[228,228],"Current":[0.000,0.000]}}
-
@helmutlinner Das ist JSON da wirst Du wohl ein script brauchen, um das auseinander zu nehmen. JSON.Parse macht das, etwa so :
var dec = JSON.parse(getState("adresse_zum_knoten").val);
Danach kannst Du über Properties von "dec" auf die Werte zugreifen, z. B.:
log(dec.ENERGY.Voltage[0]);
-
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: