NEWS
[Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana
-
@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
-
Ich habe seit ein paar Tagen einen SolarEdge Wechselrichter, welchen ich mit Modus Modul auslesen kann. Das funktioniert auch sehr gut, allerdings komme ich etwas mit dem Hinweis aus dem zweiten Posts durcheinander. Dort steht:
Energiezähler
40206: Total Real Power (aktueller Netzbezug bzw. Einspeisung)
40226: Total Exported Real Energy (was ihr heute erzeugt habt)
40234: Total Imported Real Energy (was ihr heute aus dem Netz bezogen habt)Ich verstehe ich die Aussage (was ihr heute) nicht so richtig, bei mir werden die Einträge 40226 und 40234 immer erhöht, d.h. das ist die Zählung seit Einschalten des Wechselrichters. Wurde das irgendwann verändert oder war das schon immer so und die Aussage ist nur etwas verwirrend. Muss das nicht heißen, was ihr bis heute erzeugt habt.
-
Guten Morgen zusammen,
die Preiserhöhung vom Stromanbieter ist nun auch bei mir angekommen....
Gibt es eine Möglichkeit, dass man nun den neuen Strompreis sauber vom alten trennen kann für die Auswertung? Sonst werden die Dataen überschrieben?
Gleiches gilt auch für den Eigenverbrauch, da schlägt ja jetzt auch ein anderer Betrag durch. -
@zoxx said in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Guten Morgen zusammen,
die Preiserhöhung vom Stromanbieter ist nun auch bei mir angekommen....
Gibt es eine Möglichkeit, dass man nun den neuen Strompreis sauber vom alten trennen kann für die Auswertung? Sonst werden die Dataen überschrieben?
Gleiches gilt auch für den Eigenverbrauch, da schlägt ja jetzt auch ein anderer Betrag durch.niemand bisher die gleiche Problematik gehabt? Kann ich mir kaum vorstellen
-
@zoxx sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
niemand bisher die gleiche Problematik gehabt? Kann ich mir kaum vorstellen
Doch und am liebsten würde ich das mit Sourceanalytics machen. Aber das ist so buggy, dass man es nicht dafür verwenden kann. Sieht bei mir derzeit so aus:
Bzw. direkt im Sourceanalytics:
Hab keine Lösung dafür, leider.
-
@hennerich sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Doch und am liebsten würde ich das mit Sourceanalytics machen. Aber das ist so buggy, dass man es nicht dafür verwenden kann.
Warum? Was genau ist hier buggy?
Bei mir funktioniert die Aufzeichnung seit September eigentlich einwandfrei. -
@manfredh1 sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
@hennerich sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Doch und am liebsten würde ich das mit Sourceanalytics machen. Aber das ist so buggy, dass man es nicht dafür verwenden kann.
Warum? Was genau ist hier buggy?
Bei mir funktioniert die Aufzeichnung seit September eigentlich einwandfrei.Hey,
mein Sourceanalytics ist so konfiguriert:
Du siehst, dass ich nur eine Zeile ganz oben ergänz habe, in der ich meinen Strompreis (letztes Jahr) und dessen Grundgebühr eingetragen habe.
Daraus macht SA dann das hier im letzten Jahr:
Wenn wir das dann mal ausrechnen und dann auf Costs Cummulative schauen, fehlt dort schon mal die Grundgebühr.
Jetzt haben wir 2023:
Was soll ich denn jetzt von den Kosten halten? -
OK. Ich verwende bei mir keine Grundgebühr. Die wird bei mir dann nur beim Export ins Excel für weitere Auswertungen hinzugefügt.
Bei mir schaut das so aus und die Berechnungen stimmen sowohl für die Monate September - Dezember 2022 und auch seit Jahresbeginn.
Einziges Problem ist, dass die Berechnung falsch ist, sobald ich einen Einspeisetarif ändere. Dazu gibts in Github schon einen Eintrag. -
Hallo zusammen,
ich habe nun alles durchgelesen und habe da ganz schön Arbeit vor mir da ich gerade erst anfange.
Ich habe Aktuell einen SE25K, jetzt kommt noch ein zweiter SE25K und ein SE5000 hinzu mit der Erweiterung. Leider wurde von dem Installateur kein Modus Zähler für Bezug/Einspeisung Installiert.
Wenn ich das richtig Verstanden habe, kann man die Daten nur Auslesen wenn man einen Modus Zähler hat. Nun überlege ich mir einen Modbuszähler einzubauen um die Daten abzufragen.Alternativ könnte ich auch 4 Shelly3EM installieren, leider würden mir dann aber einige angaben vom SolarEdge Fehlen und es sind 4 Geräte und Abfragen.
Die Frage ist geht es auch mit dem "neuen" Modbus home Zähler mit Display oder geht es nur mit dem Energiezähler mit den Klemmen?
Noch eine Frage, für den Modbus, CatLeitung oder Telefonleitung?
Danke für eure Hilfe
-
@nobody-0 sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Wenn ich das richtig Verstanden habe, kann man die Daten nur Auslesen wenn man einen Modus Zähler hat. Nun überlege ich mir einen Modbuszähler einzubauen um die Daten abzufragen.
Alternativ könnte ich auch 4 Shelly3EM installieren, leider würden mir dann aber einige angaben vom SolarEdge Fehlen und es sind 4 Geräte und Abfragen.
Ich würde das nur mit SolarEdge Geräten machen, um wirklich voll kompatibel zu sein. Sicherlich gibt es auch andere Möglichkeiten, aber da hast du IMHO immer mit Spezialanpassungen zu kämpfen, für die du auch erstmal jemanden finden musst, der dir Hilfe geben kann.
@nobody-0 sagte
Die Frage ist geht es auch mit dem "neuen" Modbus home Zähler mit Display oder geht es nur mit dem Energiezähler mit den Klemmen?
Gute Frage. Ich habe nur den "klassischen" Zähler. WIrd sicherlich mit dem neuen Gerät ebenso funktionieren.
@nobody-0 sagte
Noch eine Frage, für den Modbus, CatLeitung oder Telefonleitung?
Ich hab ein kleines Stück Netzwerkkabel benutzt. Das lag halt noch rum. Hier wird dazu etwas gesagt.
Grüße
Henri