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.