NEWS
Shelly Pro 3EM saldierender Stromzähler in Blockly
-
Hallo IoBroker Community,
nutze schon seit einigen Jahren IoBroker aber habe eben erst festgestellt, dass ich bisher nicht im Forum angemeldet war und nur mitgelesen hab...
Nun zum Thema auf das ich nichts passendes gefunden habe oder die Suche falsch benutzt hab.
Es geht darum in IoBroker einen saldierenden Strom- (ich mag das Wort nicht also ->) Energiezähler mit den Zählwerken 1.8.0 (Verbrauch) und 2.8.0 (Einspeisung) zu erstellen. Bekanntlich kann das der Pro 3EM (immer noch) nicht.
Ich hab das in Blockly gemacht und das Skript war erstmal überraschend kurz aber habe dabei Ungenauigkeiten in kauf genommen.
Vielen Dank an der Stelle an @paul53 der sich dem Skript angenommen hat und ein Skript erstellt hat, dass mit dem vom Shelly Pro 3EM gelieferten Daten die bestmögliche Genauigkeit als Energie zählt. Das ursprünglich von mir erstellte Skript hab ich durch seines ersetzt.Vorgehen:
-
Voraussetzung, MQTT ist im Pro 3EM aktiviert und eine Shelly Instanz läuft.
-
Erstellen von eigenen Datenpunkten. Achtung, keine Punkte im Namen verwenden.
-
Nun das Skript in blockly.
Vorab werden Variablen benötigt. Hier im Skript "Bezugsenergie" "Einspeiseenergie" "delta_kWh"
Im Skript wird die Zeitspanne zwischen der Aktualisierung des Datenpunktes TotalActivePower des Pro 3EM "gemessen" und der Energieanteil für das kleine Zeitfenster in kWh berechnet und anschließende ja nach Vorzeichen dem Zählwerk 1.8.0 für Verbrauch oder dem Zählwerk 2.8.0 für Einspeisung addiert. Die Datenpunkte der Zählwerke werden immer auf die zweite Nachkommastelle gerundet.
Folgend das das Skript von @paul53 mit kleinen Anpassungen durch mich :
-
Um noch den Zählerstand des Zählwerks im Zählerschrank als Startwert zu definieren, muss der Wert einfach vor dem Start des Skriptes in die oben erstellten Datenpunkte eingetragen werden.
Das Skript läuft erst nun paar Tage aber stimmt soweit mit dem Stromzähler im Zählerschrank überein.
Werde das natürlich weiter beobachten.Grüße,
Schreedr -
-
@schreedr sagte: es wurde bereits an andere Stelle diskutiert
Man kann auch die Zeit-Differenz zwischen zwei Wertänderungen multiplizieren.
@schreedr sagte in Shelly Pro 3EM saldierender Stromzähler in Blockly:
Mein Pro 3EM liefert alle 3-5 Sekunden neue Werte. Das schwankt immer etwas. Um nicht eine schwankende Zeiteinheit zu haben muss die Abfrage im festen Rhythmus ablaufen.
Muss es nicht (siehe oben). Für zyklischen Ablauf im Hauptprogramm (also ständig) verwendet man kein Intervall, sondern einen Zeitplan.
-
@paul53 ja danke für die Funktion "letzte Änderung" bezüglich Zeitdifferenz . Wusste ich nicht dass es die so einfach gibt und dachte da muss ich selbst was bauen.
Aber das Runden würde ich nicht machen, zumindest nicht auf 2 Stellen. Denke die Energie spielt sich innerhalb ca. 5 Sekunden in kWh in der 4-7 Nachkommstelle ab. Oder hab ich das Skript nicht verstand?
Das mit dem Intervall ist vermutlich etwas ungenauer als ein Zeitplan oder? Aber danke für den Tipp, falls ich das wieder benötige mach ich das über Zeitplan. Zeitplan hab ich eigentlich auch bisher immer genutzt bei Lampen Pumpen usw...
Alles in allem finde ich deine gepostete Lösung eleganter und werde die in meinen ersten Post etwas verändert einfügen für diejenigen die nach so einem Skript in Verbindung mit dem Shelly Pro 3EM suchen. Wäre das OK für dich? -
@schreedr sagte: Aber das Runden würde ich nicht machen, zumindest nicht auf 2 Stellen
Die Rundung auf 10 Wh macht durchaus Sinn, denn es entspricht einer monetären Auflösung von ca. 0,3 Cent. Öfter muss sich der Energiewert im Datenpunkt nicht ändern. Während der Berechnung wird nicht gerundet, denn die Datenpunkte werden nur einmal bei Skriptstart eingelesen.
@schreedr sagte in Shelly Pro 3EM saldierender Stromzähler in Blockly:
Wäre das OK für dich?
Ja.
-
@paul53 sagte:
Die Rundung auf 10 Wh macht durchaus Sinn, denn es entspricht ein monetären Auflösung von ca. 0,3 Cent. Öfter muss sich der Energiewert im Datenpunkt nicht ändern. Während der Berechnung wird nicht gerundet, denn die Datenpunkte werden nur einmal bei Skriptstart eingelesen.
Ah, hab das jetzt erst verstanden mit den Variablen und dann in den Datenpunkt schreiben mit den zwei Nachkommastellen, macht Sinn
-
@schreedr sagte: finde ich deine gepostete Lösung eleganter
Noch eleganter mit nur einer Berechnung:
-
@schreedr
Wenn Javascript-Code, dann besser nicht den von Blockly generierten.const idBezug = '0_userdata.0.Energiezaehler.1:8:0_Verbrauch'; const idEinspeisung = '0_userdata.0.Energiezaehler.2:8:0_Einspeisung'; const idLeistung = 'shelly.1.shellypro3em#34987a4590cc#1.EM0.TotalActivePower'/*Total Power (active)*/; // Datenpunkt in Variable schreiben in kWh var Bezugsenergie = getState(idBezug).val; var Einspeiseenergie = getState(idEinspeisung).val; // Umrechnung TotalActivePower (W) in Energie on(idLeistung, function (dp) { // Berechnung der kWh für Zeit (ms) zwischen zwei Messwerten const delta_kWh = dp.oldState.val * (dp.state.lc - dp.oldState.lc) / 3600000000; if (delta_kWh < 0) { Einspeiseenergie -= delta_kWh; setState(idEinspeisung, Math.round(Einspeiseenergie * 100) / 100, true); } else { Bezugsenergie += delta_kWh; setState(idBezug, Math.round(Bezugsenergie * 100) / 100, true); } });
-
@schreedr sagte: Strom- (ich mag das Wort nicht also ->) Energiezähler
Ein Wärmemengenzähler ist auch ein Energiezähler.
-
@paul53 said in Shelly Pro 3EM saldierender Stromzähler in Blockly:
@schreedr
Wenn Javascript-Code, dann besser nicht den von Blockly generierten.Dachte man kann den Code in Blockly kopieren, aber das geht doch nicht. Dann muss ein interessiert sich das eben doch abbauen
-
@schreedr sagte: Dachte man kann den Code in Blockly kopieren
Kann man per Export im XML-Format.
-
Möchte mal Danke sagen für das tolle Script , funktioniert sehr gut auch mit dem normalen Shelly 3EM!
Läuft jetzt seit ein paar Tagen bei mir ohne Probleme und die Werte passen.
Hätte ich so nicht hinbekommen und den Rest wie Tages-/Monatsverbrauch usw kann man sich damit schön zusammenbasteln.
-
@paul53 @Schreedr Danke Euch beiden für das Skript. Ich habe den Pro EM seit ein paar Tagen im Einsatz und das Thema Saldierend/Nicht saldierend ist echt super verwirrend. Man liest an verschiedenen Stellen, dass der Pro saldiert, Aber leider nicht, dass er das bei TotalActiveEnergy eben nicht macht (oder nicht ordentlich).
-
@paul53
da ich ein eher Freund von javascript bin habe ich mir Dein Skript kopiert, leider kommt es zu zunehmenden Abweichungen zum echten Zählerstand.Wenn ich das mit der Funktion on() richtig verstanden habe wird bei jeder Änderung des Wertes von idLeistung die Berechnung ausgeführt. Abhilfe wäre vermutlich die Ausführung in einem Zeitplan (was ich sowieso bevorzugen würde), das habe ich aber nicht hinbekommen:
das Skript:
const idBezug = '0_userdata.0.Energiezaehler.1:8:0_Bezug'; const idEinspeisung = '0_userdata.0.Energiezaehler.2:8:0_Einspeisung'; const idLeistung = 'shelly.0.shellypro3em#3ce90e6ff170#1.EM0.TotalActivePower'/*Total Power (active)*/; function berechne_leistung() { // Datenpunkt in Variable schreiben in kWh var Bezugsenergie = getState(idBezug).val; var Einspeiseenergie = getState(idEinspeisung).val; log("Bezugsenergie = " + Bezugsenergie); log("Einspeiseenergie = " + Einspeiseenergie); // Umrechnung TotalActivePower (W) in Energie // Berechnung der kWh für Zeit (ms) zwischen zwei Messwerten var oldState_val = getState(idEinspeisung).val; var oldState_lc = getState(idEinspeisung).lc; // erzeugt einen Fehler log("oldState_val = " + oldState_val); log("oldState_lc = " + oldState_lc); var State_lc = idLeistung.State.lc; // an den Wert komme ich so nicht ran log("State = " + State_lc); const delta_kWh = oldState_val * (state_lc - oldState_lc) / 3600000000; log("delta_kWh = " + delta_kWh ); if (delta_kWh < 0) { Einspeiseenergie -= delta_kWh; setState(idEinspeisung, Math.round(Einspeiseenergie * 100) / 100, true); } else { Bezugsenergie += delta_kWh; setState(idBezug, Math.round(Bezugsenergie * 100) / 100, true); } }; // Leistung jede Minute berechnen schedule('* * * * *', berechne_leistung);
Das Log dazu:
19:21:23.923 info javascript.0 (16628) Start javascript script.js.4-Test.SH8_forum 19:21:23.941 info javascript.0 (16628) script.js.4-Test.SH8_forum: registered 0 subscriptions, 1 schedule, 0 messages, 0 logs and 0 file subscriptions 19:22:00.008 info javascript.0 (16628) script.js.4-Test.SH8_forum: Bezugsenergie = 5653.37 19:22:00.008 info javascript.0 (16628) script.js.4-Test.SH8_forum: Einspeiseenergie = 13161.52 19:22:00.009 info javascript.0 (16628) script.js.4-Test.SH8_forum: oldState_val = 13161.52 19:22:00.009 info javascript.0 (16628) script.js.4-Test.SH8_forum: oldState_lc = 1721910679501 19:22:00.010 error javascript.0 (16628) at Object.berechne_leistung (script.js.4-Test.SH8_forum:20:35)
MOD-EDIT: Code in code-tags gesetzt!
Kannst Du mir einen Tip geben, wie ich das per Zeitplan ausführen kann? Evtl. geht das ja auch ohne meine Umbauten
Ich würde es ja auch über das blockly-Skript versuchen, habe aber keinen Weg gefunden wo/wie ich es downloaden kann ... -
@fritz-0 Berechnet wird ja der Verbrauch anhand der saldierten aktuellen Leistung, bezogen auf die Zeit, in der die Leistung exakt so hoch ist. Wenn man das so macht, muss ja zwingend bei jeder Leistungsänderung eine Berechnung durchgeführt werden. Bei einem Zeitplan wird ja die aktuelle Leistung zum Zeitpunkt der Ausführung herangezogen, Werte zwischen den Zeitpunkten werden ignoriert. Korrigiert mich bitte, sollte ich falsch liegen, aber eine Berechnung des Verbrauch auf Basis der Leistung kann mit einem Zeitplan nicht funktionieren, bzw. muss falsche Werte liefern.
Abweichungen zum echten Zählerstand werden sich mit dem Shelly schon allein aufgrund der Messtoleranzen nicht vermeiden lassen. Ich würde eher mit einem Faktor bei der Berechnung arbeiten und versuchen mich so dem "gezählten" Verbrauch anzunähern. -
@frederik-buss
Hallo Frederik,ich habe das Skript jetzt mal einen Tag laufen lassen, das Ergebnis:
bei der Einspeisung gab es eine Abweichung von 0,53 kWh (und das wo ja nur einen Teil der Zeit eingespeist wurde)
der Zählerstand vom Verbrauch hat sich am Stromzähler nicht geändert, das Skipt hat aber einen Bezug von 0,48kWh berechnet.
Ich wüßte leider nicht, wie ein "Korrekturfaktor" da helfen könnte.
Zum Punkt Berechnung bei Leistungsänderung hatte ich diese Aussage von @paul53 vor Augen:
"Muss es nicht (siehe oben). Für zyklischen Ablauf im Hauptprogramm (also ständig) verwendet man kein Intervall, sondern einen Zeitplan."
deshalb kam ich auf die Idee mit dem scheduler.
Ich würde das Skript sonst auch gerne als blockly-Skript testen wollen, aber kenne den Weg nicht, wie ich es downloaden kann, ich habe nirgends einen Link dazu gesehen.
Das kannst Du mir sicher sagen?
Danke für Deine Unterstützung.
-
@fritz-0 Hier würden etwas mehr Infos helfen. Z.B.: Zeigt Dein Zähler Nachkommastellen an? Meiner tut das nicht, daher muss ich Abweichungen über mehrere Tage bewerten. Auch ich habe Abweichungen, die sind aber innerhalb der Messtoleranz des Shelly und lassen sich imo auch nur per Korrekturfaktor halbwegs gerade ziehen. Ausserdem sind Infos zu erwartetem Gesamtverbrauch und Gesamtertrag hilfreich.
Angenommen, Dein Zähler zeigt auch die Nachkommastellen an, tippe ich eher auch ein anderes Problem, weil Abweichungen von einer halben kWh pro Tag scheint mir zu hoch: Bist Du sicher, dass alle Stromwandler richtig herum eingebaut wurden? Sprich, die Richtung auf dem Pfeil der Wandler zeigen alle in dieselbe Richtung - von Stromnetz zu Hausnetz? -
@frederik-buss
ein paar Daten:- der Stromzähler ist ein "einfacher" 2-Richtungszähler.
- der Zählerstand wird mit einer Nachkommastelle angezeigt.
Die jährliche Einspeisung beträgt ca. 1,500 kWh, der Bezug beträgt < 1.000 kWh.
Ob die Stromwandler korrekt eingebaut sind kann ich nicht prüfen, dazu müsste ich im Schaltschrank Abdeckungen öffnen, als Elektro-Laie ist mir das zu gefährlich. Daher kann ich Deine Vermutung nicht überprüfen. Ich gehe aber vom korrekten Einbau aus, mein Elektriker ist erfahren, dem traue ich das schon zu.
Wenn er das nächste Mal vor Ort sein sollte werde ich ihn dazu ansprechen, aber das kann dauern, aktuell habe ich keinen Auftrag für ihn.Nachdem das Skript jetzt knapp 4 Tage läuft sind die Abweichungen schon deutlich:
- Bezug: Stromzähler keiner, Abweichung vom Skript 1,4 kWh
- Einspeisung: Abweichung vom Skript 1,55 kWh
-
@fritz-0 Bei den Werten gehe ich von aus, dass Du einen Stromspeicher verbaut hast. Falls Du das script 1:1 umgesetzt hast, bin ich mir sicher, dass der Fehler im Schaltschrank zu suchen ist. Abweichungen von 0,5kWh pro Tag sind zu hoch, zumal Auffällig ist, dass die Abweichungen von Bezug und Einspeisung in der selben Größenordnung sind. Zum Vergleich: Ich habe momentan wegen der Klimaanlage ca. 5.000-6.000 kWh Verbrauch pro Jahr hochgerechnet (Solar rausgerechnet) und seit 2 Wochen insgesamt < 0,2kWh Abweichungen. Es ist auch denkbar, dass der Shelly an der "falschen" Stelle sitzt - Messen sollte der direkt hinter dem Hausanschluss, vor allen Sicherungen/Verbrauchern/Akkus/Wechselrichtern etc.
Wie hoch ist der Stromverbrauch ohne Solar? Oder anders: wie hoch war der Verbrauch vor der Solaranlage? -
Wie hoch ist der Stromverbrauch ohne Solar? Oder anders: wie hoch war der Verbrauch vor der Solaranlage?
der lag bei ca. 4.000 kWh
Mit dem Speicher liegst Du richtig.
Was den Einbau an der korrekten Stelle angeht muss ich warten bis ich den Elektriker mal wieder im Keller habe
Ich denke, das ich da vorher nicht weiterkomme.
Erstmal vielen Dank für Deine Unterstützung.Wissen würde ich trotzdem, wie ich das Blockly-Skript runterladen kann. Das geht vermutlich ganz einfach, aber ich habe den Weg dazu noch nicht gefunden.
-
@fritz-0 Ich denke hier gibt es ein Missverständnis: Importieren und Exportieren geht im Javascript Adapter, wie von Pau beschrieben (oben rechts: Blöcke importieren/exportieren). Mit runterladen meinst Du vermutlich dass Du den hier gezeigten Code bei Dir importieren möchtest. Dazu muss ihn aber vorher jemand exportiert und hier bereit gestellt haben, was ich nicht sehe
Ich bin auch eher ein Freund davon die Scripte selbst nachzubauen, schon allein um alle Variablen/Verknüpfungen auswählen zu müssen, was die typischen Fehlerquellen deutlich reduziert.