NEWS
[Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana
-
Beim Entladen passt es wieder. Es ist so, dass der Hybrid WR beim Laden keinen Drehstrom anzeigt, insofern nicht noch ins Netz gespeist wird. Wie ist das denn bei Anderen, die einen Hybrid WR haben?
-
Keiner eine Idee oder einen Hinweis?
-
@juri88 sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Ich habe 2 WR von SE. Einen "Slave" und einen "Master". Also einen 3 Phasen WR (SE7K) und einen SE10K RWS (Hybrid). An dem Hybrid WR hängt ein BYD Akku.
Hey, ich habe ein ähnliches System - SE9K WR (3-phasig) und SE5000H WR (1-phasig) mit LG-Speicher. Der SE5000H ist der Master, der SE9K ist Slave.
Wie komme ich jetzt auf den richtigen Hausverbrauch. In meiner Naivität (lassen wir mach Wandlungsverluste außen vor. damit ich muss ich wahrscheinlich einfach leben)dachte ich mir folgendes, was aber nicht richtig zu sein scheint.
Ich rechnen einfach die Leistung (AC) des SE7K (1.380 W) + Leistung (AC) des SE10K (0 Watt) + die Leistung des SE10K, die in den Akku geht, müsste eigentlich DC sein (3.500 Watt) zusammen.Bis hier hin mache ich das selbe - das ist bei mir der PV-Ertrag - also das, was die Sonne aktuell liefert (in Deinen Worten - die PV Leistung)
(ziehe Netzbezug ab und rechne Export drauf) und habe dann meine PV Leistung. In dem Fall also 4.880 Watt Erzeugung. Davon ziehe ich dann die Ladeleistung (AKKU) ab und haben den Hausverbrauch, wenn über das Netz nichts läuft.
Hier ist Dein Fehler. Von dem oben genannten PV-Ertrag ziehst Du nun die Werte des Energiezählers ab (Einspeisung ist positiv, Bezug ist negativ), um Deinen Stromverbrauch im Haus zu ermitteln.
Zahlenbeispiel:
WR1 liefert 2500W
WR2 liefert 0W, läd aber mit 2000W den Speicher
Wenn Du jetzt 0W Hausverbrauch hättest, würdest Du am Energiezähler 2500W Einspeisung sehen.
Hast Du 500W Hausverbrauch, siehst Du von den 2500W des WR1 nur 2000W am Energiezähler - der Rest geht im Haus drauf - das ist dann Dein Hausverbrauch.Ich hoffe, ich habe er verständlich erklärt.
Viele Grüße,
Strobi -
@smidl hast du das Problem in den Griff bekommen?
Stehe vor der gleichen Problematik
-
@smidl sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Vielen Dank für das super Tutorial. Bei mir hat soweit alles funktioniert.
Ich habe den WR SolarEdge SE10K - RWS und den BYD LVS 8.0 Speicher.
Ein Problem bei der Kombination ist der Wert für die aktuelle PV-Leistung vom Dach. Der sollte in der Nacht ja bei ~0W stehen. Tut er aber nicht sondern liefert mir den Wert (annähernd) meines Hausverbrauches, welcher ja nachts aus dem Speicher entladen wird.
Den Wert sollte es doch aber geben? Zumindest im Portal oder in der mySolarEdge App ist der Wert ja bekannt.
Hat jemand von euch eine Idee, wie ich den Wert raus bekomme?
Das gleiche Problem habe ich beim Laden des Speichers. Einen zuverlässigen Wert für 40083_I_AC_Leistung bekomme ich erst, sobald der Speicher voll ist.
Ich könnte das ja auch berechnen, indem ich die Lade-/Entlade-Leistung abhängig vom 57734_Battery Register mit einbeziehe, nur ist das ja nicht gerade gewollt.Hat jemand das selbe Problem?
Hast du das Problem lösen können? Stehe vor der gleichen Problematik
-
Ich bin begeistert. Endlich ein super Tutorial für SE und Modbus. Besteht irgendwie die Chance das ganze auch für nen Modbus Proxy umzusetzen? Ich tue mich da gerade schwer. Ziel: OpenWB und Victron Batterie WR sollen auf den Modbus Stream des SE Zählers zugreifen können. Hintergrund: Die OpenWB fragt aktuell per Modbus den Solaredge Modbus Zähler ab. Diese Daten ruft der Victron Batterie Wechselrichter (MP2) über MQTT von der openWB ab und regelt entsprechend die Ein- bzw. Ausspeiseleistung der Batterie. Das (schwierige )Ziel natürlich: 0 Einspeisung.
Wie man auf der Grafik sieht, klappt das bei schnellen, starken Lastanstiegen so gut wie nie. -
Ich verwende das Register 57716 Batterie und aus meiner Sicht geht das nur so, weil das Gleichungssystem sich sonst nicht eindeutig lösen lässt.
-
Hallo zusammen,
beim Werte umrechnen für Wert "40084: AC-Leistungswert" mit dem Skalierungsfaktor (Skript im zweiten Post) erhalte ich lediglich als Werte "(null) W" für die neuerzeugte Variable 'PVLeistungAktuell'
Die Register habe ich durchprobiert, sprich, + und - 1 von 40083 bzw 40083
Mein Log sagt zeigt auch keine fehler - jemand eine Idee woran es liegen könnte?
Viele Grüße
-
@strobi danke für deine Nachricht. Ich stehe wohl auf dem Schlauch, denn ich kann meinen Fehler nicht erkennen.
In meine o.g. Beispiel habe ich folgende Wert:
WR1 (Hybrid) = 0 Watt AC aber 3.500 Watt DC --> Ladung Akku
WR 2 (Slave) = 1.380 Watt
Netz (du nennst es Energiezähler) = 0 WattIch habe jetzt eigentlich deine Rechnung auf gemacht.
Leistung WR1 + Leistung WR 2 = 4.880 Watt
Das wäre also die Gesamtleistung der PV Anlage. Um jetzt meinen Hausverbrauch zu errechnen, den bekommt ja nicht als Wert, nehme ich jetzt folgende Formal.
Leistung PV Anlage (4.880 Watt) -Ladeleistung Akku (3.500 Watt) (beim Entladen "+") = 1.380 Watt
Von diesem Wert ziehe ich nun die Netzeinspeisung ab oder addiere einen Netzbezug hinzu. In dem o.g. Fall 0 Watt. Somit habe ich nach 1.380 Watt Verbrauch, 3.500 Watt gehen in den Akku und 4.880 Watt werden Solar erzeugt.
Nur leider stimmen die Werte nicht. In Wahrheit liegt der Erzeugung bei nur ca. 4.120 Watt und der Verbrauch bei ca. 620 Watt.
Und das verstehe ich nicht. Wenn du jetzt noch einen Fehler siehst, sag es mir bitte.
-
@juri88 Du kannst doch die Daten vom Akku auslesen, bei mir geht der Wechselrichter, an dem der Akku angeklemmt ist in - Leistung.
-
@grave-digger Ja, die Leistung des Akku habe ich. Habe ich ich ja auch berücksichtigt. —> Momentane Batterieleistung
-
@juri88 ich habe einen WR SE5000H an einem String und der Akku (LG Resus H10) (Master) der zweite ist ein WR SE4000H (Slave) am zweiten String. Wenn der Akku geladen wird, arbeitet der SE5000 im Minus Bereich, um die maximale Ladeleistung von 5000 W zu schaffen. Ich rechne mir die gesamt AC- Leistung aus abzüglich der Einspeisung und addiere den Bezug, ergibt verbrauch Haus. Läuft bei mir seit Anfang 2020 ohne Probleme. Wenn wieder mal die Sonne scheinen sollte, mache ich dir mal einen Screenshot von meiner Vis
-
@grave-digger Ich habe es mal in einer Grafik zusammen gefasst
Das sind die Werte, die ich gerade aus dem IOB bekomme.
Hier die Abweichungen:
Netz: IOB ca(0W) SE ca(0W)
PV Erzeugung: IOB(2.11 KW + 4.49 KW = 6,6 KW) SE-Plattform (5,6 KW)
Hausverbrauch: IOB rechnerisch (2,11KW, PV-Erzeugung abzgl. Akku) SE-Plattform (1 KW)Ich habe also 1 KW Differenz. Die habe ich bei der Erzeugung mehr und damit rechnerisch beim Hausverbrauch auch. Also muss der Fehler bei den Werten sein, die ich aus dem IOB ziehe. Ich habe das Problem nur, wenn der Akku lädt. Bei mir zeigt der Hybrid WR keinen negativ Werte an, wie bei dir. Die AC-Leistung geht lediglich auf 0 zurück. Das Problem ist, dass ich keinen Werte dafür habe, was der Hybrid WR von seinem DC in den AKKU schiebt und was er in AC umwandelt. Das selbe in grün beim Slave. Aber ihr habt das scheinbar gelöst. Heute ist es bei uns ganz gut sonnig (Taunus), vielleicht kannst du mal ein paar Screenshots senden. Bin für jede Hilfe mehr als dankbar.
-
@juri88 Hallo Juri, hier der versprochene Screenshot
1 ist bei mir der SE5000 (Master) wie zu sehen geht der in den - Bereich
2 ist der SE4000 (Slave)Das mit dem - kann ich mir zurzeit nur so erklären. Ich habe einen Hochvolt Akku 400 V DC dieser hängt am SE5000 damit der Akku mit voller Leistung geladen wird nimmt der SE5000 230 V AC und wandelt diesen in 400 V DC das ist das Minus. Du hast bestimmt einen anderen Akku.
Zeichne bitte mal die DC Werte beider WR's auf. Normalerweise müssten diese immer im + Bereich sein.
Da könnte man vom DC die Ladeleistung Akku und die Einspeisung abziehen, das müsste eigentlich den Verbrauch Haus ergeben.
Ich habe damals die AC, DC und Akkuwerte in einer Datenbank geloggt, um nachzuvollziehen wie ich rechnen muss. -
Ich hab mich mal versucht die Solaredge visualisierung aus der App in Grafana nachzubauen - vielleicht gehts hier ein paar Leuten ähnlich.
Ich habe dazu das plotly panel plugin verwendet (Achtung da gibts 3 verschiedene - nur eins funktioniert wirklich (https://grafana.com/grafana/plugins/nline-plotlyjs-panel/).
Die Werte basieren auf der gesamten Vorarbeit von @hennerich - ich habe nur den Gesamtverbrauch noch im iobroker per Skript berechnet.
Json anbei:
{ "id": 34, "gridPos": { "x": 12, "y": 3, "w": 7, "h": 8 }, "type": "nline-plotlyjs-panel", "title": "PV Tagesübersicht", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "options": { "data": [ { "hoverinfo": "y", "type": "bar" }, { "hoverinfo": "y", "type": "bar" }, { "hoverinfo": "y", "type": "bar" }, { "hoverinfo": "y", "type": "bar" } ], "layout": "", "config": "", "script": "//let aArray = data.series[0].fields[0].values.buffer; //Timestamp von Wert 1\nlet arrayeig = data.series[0].fields[1].values.buffer; //Wert 1 zb Eigenverbrauch\n//let xArray = data.series[1].fields[0].values.buffer; //Timestamp von Wert 2\nlet arrayexp = data.series[1].fields[1].values.buffer; //Wert 2 zb Export\n\nlet arrayerz = data.series[2].fields[1].values.buffer;\n\nlet arrayimp = data.series[3].fields[1].values.buffer;\nlet arrayges = data.series[4].fields[1].values.buffer;\n\n//Letzten Wert in Datenbank herausfinden (Höchster Wert des Tages)\nlet werteig=arrayeig[arrayeig.length-1]\nwerteig = werteig.toFixed(2); //Runden auf 2 Nachkommastellen\nlet wertexp=arrayexp[arrayexp.length-1]\nwertexp = wertexp.toFixed(2); //Runden auf 2 Nachkommastellen\nlet werterz=arrayerz[arrayerz.length-1]\nwerterz = werterz.toFixed(2); //Runden auf 2 Nachkommastellen\nlet wertimp=arrayimp[arrayimp.length-1]\nwertimp = wertimp.toFixed(2); //Runden auf 2 Nachkommastellen\nlet wertges=arrayges[arrayges.length-1]\nwertges = wertges.toFixed(2); //Runden auf 2 Nachkommastellen\n\n//prozente ausrechnen und auf 2 stellen runden\nlet perceig = ((werteig/werterz)*100).toFixed(1)\nlet percexp = ((wertexp/werterz)*100).toFixed(1)\nlet percprod = ((werteig/wertges)*100).toFixed(1)\nlet percimp = ((wertimp/wertges)*100).toFixed(1)\n\n/* (debug - test)\nconsole.log(lastaItem) \nconsole.log(lastbItem)\nconsole.log(lastxItem)\nconsole.log(lastyItem)\n*/\n\n//let valueerzeugung = [werteig, wertexp, werteig ,wertimp] // Letzte Werte aus array in daten für grafik übergeben \n//let beschreibung = ['Eigenverbrauch', 'Export', \"Eigenverbrauch\", \"Import\"]\n//var ultimateColors = [ 'rgb(5, 131, 70)','rgb(32, 100, 65)','rgb(31, 96, 196)', 'rgb(242, 73, 92)']; //Farben für Eigenverbrauch/Export\n\n\nvar data = [\n/*\n {\n y: valueerzeugung,\n x: [1,1,2,2],\n //name: \"Eigenverbrauch\",\n type:'bar',\n textposition: 'auto',\n //hoverinfo: 'label+percent+value',\n //textinfo: 'percent+value',\n marker: {\n color: ultimateColors\n },\n*/ \n {\n y: [werteig],\n x: [1],\n name: \"Eigenverbrauch\",\n text: \"Eigenverbrauch \" + werteig +\" kWh \" + perceig + \"%\",\n type:'bar',\n textposition: 'auto',\n marker: {\n color: 'rgb(5, 131, 70)',\n hoverinfo: wertimp,\n showlegend: false\n }\n },\n {\n y: [wertexp],\n x: [1],\n name: \"Export\",\n text: \"Export \" + wertexp +\" kWh \" + percexp + \"%\",\n type:'bar',\n textposition: 'auto',\n marker: {\n color: 'rgb(32, 100, 65)',\n hoverinfo: wertimp,\n showlegend: false\n },\n },\n {\n y: [werteig],\n x: [2],\n name: \"PV Produktion\",\n text: \"PV \"+ werteig +\" kWh \" + percprod + \"%\",\n type:'bar',\n textposition: 'auto',\n marker: {\n color: 'rgb(31, 96, 196)',\n hoverinfo: wertimp,\n showlegend: false\n },\n },\n {\n y: [wertimp],\n x: [2],\n name: \"Import\",\n text: \"Import \" + wertimp +\" kWh \" + percimp + \"%\",\n type:'bar',\n textposition: 'auto',\n marker: {\n color: 'rgb(242, 73, 92)',\n hoverinfo: wertimp,\n showlegend: false\n },\n }\n];\n \nvar layout = {\n barmode:'stack',\n\n margin: {\"t\": 0, \"b\": 0, \"l\": 0, \"r\": 0},\n\n showlegend: false,\n //legend: {\"orientation\": \"h\"},\n\n annotations: [\n {\n font: {\n //size: 15,\n color: '#ffffff'\n },\n x: 1,\n y: -0.5,\n xref: 'x',\n yref: 'y',\n text: \"Produktion \" + werterz + \" kWh\",\n showarrow: false,\n //arrowhead: 7,\n //ax: 0,\n //ay: -40\n },\n {\n font: {\n //size: 15,\n color: '#ffffff'\n },\n x: 2,\n y: -0.5,\n xref: 'x',\n yref: 'y',\n text: \"Verbrauch \" + wertges + \" kWh\",\n showarrow: false,\n //arrowhead: 7,\n //ax: 0,\n //ay: -40\n }\n\n ],\n xaxis: {\n\n showgrid: false,\n zeroline: false,\n showline: false,\n showticklabels: false,\n //mirror: 'ticks',\n //gridcolor: '#bdbdbd',\n //gridwidth: 2,\n //zerolinecolor: '#969696',\n //zerolinewidth: 4,\n //linecolor: '#636363',\n //linewidth: 6\n\n },\n\n yaxis: {\n\n showgrid: false,\n zeroline: true,\n showline: false,\n showticklabels: false,\n //mirror: 'ticks',\n //gridcolor: '#bdbdbd',\n //gridwidth: 2,\n zerolinecolor: '#ffffff',\n //zerolinewidth: 4,\n //linecolor: '#636363',\n //linewidth: 6\n }\n\n};\n\nvar config = {responsive: true};\n\nreturn {data, layout};", "onclick": "// console.log(data);\n// window.updateVariables({query:{'var-project':'test'}, partial: true})" }, "targets": [ { "alias": "Eigenverbrauch", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "groupBy": [ { "params": [ "10m" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "measurement": "0_userdata.0.Solar_vars.PV_Eigenverbrauch", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"0_userdata.0.Solar_vars.PV_Eigenverbrauch\" WHERE $timeFilter GROUP BY time(10m) fill(previous)", "rawQuery": false, "refId": "A", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "Export", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "groupBy": [ { "params": [ "10m" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "0_userdata.0.Solar_vars.PV_Exportiere_Energie", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"0_userdata.0.Solar_vars.PV_Eigenverbrauch\" WHERE $timeFilter GROUP BY time(10m) fill(previous)", "rawQuery": false, "refId": "B", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "Erzeugung", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "groupBy": [ { "params": [ "10m" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "0_userdata.0.Solar_vars.PV_Erzeugte_Energie", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"0_userdata.0.Solar_vars.PV_Eigenverbrauch\" WHERE $timeFilter GROUP BY time(10m) fill(previous)", "rawQuery": false, "refId": "C", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "Import", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "groupBy": [ { "params": [ "10m" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "0_userdata.0.Solar_vars.PV_Importierte_Energie", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"0_userdata.0.Solar_vars.PV_Eigenverbrauch\" WHERE $timeFilter GROUP BY time(10m) fill(previous)", "rawQuery": false, "refId": "D", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] }, { "alias": "Gesamt", "datasource": { "type": "influxdb", "uid": "hYAYl-zRz" }, "groupBy": [ { "params": [ "10m" ], "type": "time" }, { "params": [ "previous" ], "type": "fill" } ], "hide": false, "measurement": "0_userdata.0.Solar_vars.PV_Gesamtverbrauch", "orderByTime": "ASC", "policy": "default", "query": "SELECT last(\"value\") FROM \"0_userdata.0.Solar_vars.PV_Eigenverbrauch\" WHERE $timeFilter GROUP BY time(10m) fill(previous)", "rawQuery": false, "refId": "E", "resultFormat": "time_series", "select": [ [ { "params": [ "value" ], "type": "field" }, { "params": [], "type": "mean" } ] ], "tags": [] } ] }
Falls hier jemand ist der js wirklich kann - ich bräuchte da Hilfe um den Fehler abzufangen wenn einer der Werte noch 0 ist.
-
@zimbombo sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Ich hab mich mal versucht die Solaredge visualisierung aus der App in Grafana nachzubauen - vielleicht gehts hier ein paar Leuten ähnlich.
Also ich hab keine Ahnung, wie das mit dem Plugin funktioniert.
Wo gehört das Json hin ? -
@manfredh-1 sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Wo gehört das Json hin ?
Dummy Panel erstellen ... zu Json wechseln , dann den Code austauschen ...
https://community.grafana.com/t/how-to-import-a-panel-using-its-json-data/29715
-
@hennerich
Hi
kannst du mir helfen es besser zu verstehenm, wie man herausfindet, dass man base 0 oder base 1 benutzen muss, woran sieht man das
ist das am Wechselricher, oder besser gefragt wann hat man MODBUS PLC Adress (base 1) oder MODBUS Protocol Adresse (base 0) ??
Wenn ich das "Holding-Register 40021 C_Model" auslese und ich bekomme die richtigen Daten, heisst das, dass ich Base 1 habe, RIchtig?Bedeutet es, dass ich nun alle Register die ich will von Base 1 auslesen muss???
So was von S...., sorry kompliziert !
Danke für dein Hilfe und guten Rutsch!sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Auf der Seite 15 unten findet ihr aber noch eine weitere, wichtige Information, die ich bei mir leider überlesen (bzw. nicht verstanden hatte):
The base Register Common Block is set to 40001 (MODBUS PLC address [base 1]) or 40000 (MODBUS Protocol Address [base 0]).*In meinem Fall wird base 0 verwende*t (fragt mich nicht warum und wieso) und das bedeutet, dass alle in der Doku stehenden Adressen um eins reduziert werden müssen.
Beispiel:
ID 40094 ist die gesamte, produzierte Energie in Wh und die muss dann im Modbus ioBroker die ID 40093 sein. -
@peppi
Hey, genau so hab ich das germacht. Hab mir irgendeinen unverwechselbaren Wert gesucht (ich meine, dass war das Modell) und mit der Base nimmst du alle anderen Werte. -
danke