NEWS
[Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana
-
@botto Fehlt da nicht dann die Modbus Verbindung zwischen beiden Wechselrichtern? Sonst bekommst du ja keien Daten vom 3phasigen... oder hattest du nur den falschen als Master ausgewählt? wenn ich das richtig verstanden habe sollte der Master Alle daten haben... ? Sonst fehlt dir ja auch die aktuelle Produktion z.B.
-
@boardy Moin Boardy.
Die Komponenten sind nun bei mir nach dem Muster oben verdrahtet. Somit ist der Master (SE5000H) mit dem SE10K über Modbus #2 verbunden. Beim SE10K geht der ebenfalls auf die Klemmen von #2; #1 ist beim SE10K nicht belegt.
Der SE5000H bekommt also auch Daten von diesem, als Slave bzw. Sekundärgerät konfiguriertem, Modbus Teilnehmer. Abfragen muss ich aktuell aber anscheinend beide WR, denn ich bekomme am SE5000H nicht alle Daten vom WR-SE10K und umgekehrt.
Ich Nutze bei beiden Modbus Instanzen (für die ersten Tests) den von @Foradh-0 geposteten Export.
Die VISU von SE in der App und im Onlineportal passen - es wird alles korrekt angezeigt, daher gehe ich davon aus das die Kommunikation generell passt. -
Hallo,
danke für die Anleitung, sie war ein guter Grundstein.
Ich bin jetzt an dem Punkt, dass die Daten in iobroker gelesen werden.
Im Gegensatz zur ürsprünglichen Anleitung kann man die Werte alle direkt in der modbus Konfiguration umrechnen lassen ohne extra Schritte per Skripte.
Mein aktuelles Setup:
iobroker v5.3.4
modbus 3.4.17
Solaredge SE10k 0004.0014.0228Meine Adressen sind zur basis 1, wenn eure zur Basis 0 sind, müssen die Adressen um 1 verringert werden. Also aus 40003 würde 40002.
_address name description unit type len factor offset formula role room poll wp cw isScale 40001 C_SunSpec_ID "Wert = ""SunS"" (0x53756e53). Identifiziert dies eindeutig als eine SunSpec Modbus-Karte" uint32be 2 1 0 true false false false 40003 C_SunSpec_DID Wert = 0x0001. Identifiziert dies eindeutig als einen SunSpec “Common Block“ uint16be 1 1 0 true false false false 40004 C_SunSpec_Länge 65 = Länge eines Blocks in 16-bit Registern uint16be 1 1 0 true false false false 40005 C_Hersteller "Bei SunSpec eingetragener Wert = ""SolarEdge""" string 16 1 0 true false false false 40021 C_Modell Spezifischer SolarEdge Wert string 16 1 0 true false false false 40045 C_Version Spezifischer SolarEdge Wert string 8 1 0 true false false false 40053 C_Seriennummer Eindeutiger SolarEdge Wert string 16 1 0 true false false false 40069 C_DeviceAddress MODBUS Unit ID uint16be 1 1 0 true false false false 40069 C_SunSpec_DID 101 = Einphasig, 102 = Spaltphase, 103 = Dreiphasig uint16be 1 1 0 true false false false 40072 I_AC_Strom AC-Gesamtstromwert A uint16be 1 1 0 x * Math.pow(10, sf['40076']) true false false false 40073 I_AC_StromA AC-Phase A (L1) Stromwert A uint16be 1 1 0 x * Math.pow(10, sf['40076']) true false false false 40074 I_AC_StromB AC-Phase B (L2) Stromwert A uint16be 1 1 0 x * Math.pow(10, sf['40076']) true false false false 40075 I_AC_StromC AC-Phase C (L3) Stromwert A uint16be 1 1 0 x * Math.pow(10, sf['40076']) true false false false 40076 I_AC_Strom_SF AC-Strom Skalierungsfaktor SF int16be 1 1 0 true false false true 40084 I_AC_Leistung AC-Leistungswert W uint16be 1 1 0 x * Math.pow(10, sf['40085']) true false false false 40085 I_AC_Leistung_SF AC-Leistung Skalierungsfaktor SF int16be 1 1 0 true false false true 40088 I_AC_VA Scheinleistung VA uint16be 1 1 0 x * Math.pow(10, sf['40089']) true false false false 40089 I_AC_VA_SF Scheinleistung Skalierungsfaktor SF int16be 1 1 0 true false false true 40090 I_AC_VAR Blindleistung VAR uint16be 1 1 0 x * Math.pow(10, sf['40091']) true false false false 40091 I_AC_VAR_SF Blindleistung Skalierungsfaktor SF int16be 1 1 0 true false false true 40092 I_AC_PF Leistungsfaktor % uint16be 1 1 0 x * Math.pow(10, sf['40093']) true false false false 40093 I_AC_PF_SF Leistungsfaktor Skalierungsfaktor SF int16be 1 1 0 true false false true 40094 I_AC_Energie_WH AC Gesamt-Energieproduktion kWh uint32be 2 1 0 x * Math.pow(10, sf['40096'] - 3) true false false false 40096 I_AC_Energie_WH_SF AC Gesamtenergie Skalierungsfaktor SF uint16be 1 1 0 true false false true 40097 I_DC_Strom DC-Stromwert A uint16be 1 1 0 x * Math.pow(10, sf['40098']) true false false false 40098 I_DC_Strom_SF DC-Strom Skalierungsfaktor SF int16be 1 1 0 true false false true 40099 I_DC_Spannung DC-Spannungswert V uint16be 1 1 0 x * Math.pow(10, sf['40100']) true false false false 40100 I_DC_Spannung_SF DC-Spannung Skalierungsfaktor SF int16be 1 1 0 true false false true 40101 I_DC_Leistung DC-Leistungswert W uint16be 1 1 0 x * Math.pow(10, sf['40102']) true false false false 40102 I_DC_Leistung_SF DC-Leistung Skalierungsfaktor SF int16be 1 1 0 true false false true 40104 I_Temp_Kühler Kühlkörpertemperatur °C uint16be 1 1 0 x * Math.pow(10, sf['40107']) true false false false 40107 I_Temp_SF Kühlkörpertemperatur Skalierungsfaktor SF int16be 1 1 0 true false false true 40108 I_Status Betriebszustand (1 = Aus, 2 = Schlafen (Automatisches Herunterfahren) – Nachtmodus, 3 = Aufwachen/Starten, 4 = Wechselrichter ist AN und wandelt Energie, 5 = Begrenzte Produktion, 6 = Herunterfahren, 7 = Fehler, 8 = Wartung/Setup) uint16be 1 1 0 true false false false 40109 I_Status_Anbieter Anbieter-spezifischer Betriebszustand sowie Fehlercodes: 1 = Aus, 2 = Schlafen (Automatisches Herunterfahren) – Nachtmodus, 3 = Aufwachen/Starten, 4 = Wechselrichter ist AN und wandelt Energie, 5 = Begrenzte Produktion, 6 = Herunterfahren, 7 = Fehler, 8 = Wartung/Setup uint16be 1 1 0 true false false false 40124 C_Manufacturer Meter manufacturer string 32 1 0 true false false false 40140 C_Model Meter model string 32 1 0 true false false false 40156 C_Option Export + Import, Production, consumption string 16 1 0 true false false false 40191 M_AC_Current AC Current (sum of active phases) A uint16be 1 1 0 x * Math.pow(10, sf['40195']) true false false false 40195 M_AC_Current_S F AC Current Scale Factor SF int16be 1 1 0 true false false true 40207 M_AC_Power Total Real Power (sum of active phases) W int16be 1 1 0 x * Math.pow(10, sf['40211']) true false false false 40211 M_AC_Power_SF AC Real Power Scale Factor SF int16be 1 1 0 true false false true 40227 M_Exported Total Exported Real Energy kWh uint32be 2 1 0 x * Math.pow(10, sf['40243'] - 3) true false false false 40235 M_Imported Total Imported Real Energy kWh uint32be 2 1 0 x * Math.pow(10, sf['40243'] - 3) true false false false 40243 M_Energy_W_SF Real Energy Scale Factor SF int16be 1 1 0 true false false true
Beste Grüße,
Joachim -
Ich habe nochmal eine Frage an die Experten:
- Ich berechnet mir jede Sekunde den internen Status, ob der Speicher geladen wird oder nicht - das funktioniert soweit.
- Nun möchte ich mir diesen internen Status gerne in einen Datunpunkt ausgeben lassen - aber nur dann, wenn der Status sich ändert (damit nicht ständig der Datenpunkt aktualisiert wird) - das funktioniert mit der unten angegeben Logik leider nicht.
Habt Ihr eine Idee, was ich falsch mache bzw. wie ich es ändern müsste, damit der Datenpunkt nur dann geschrieben wird, wenn sich der Status von wahr / falsch ändert?
Besten Dank!
-
internen Status, ob der Speicher geladen wird oder nicht
Dafür gibt es doch dieses Register !?
57734 Battery 1 Status Batterie Zustand (0 = Aus, 1 = Standby, 2 = Initialisierung, 3 = Laden, 4 = Entladen, 5 = Fehler, 6 = Leerlauf) uint32sw 2 1 0 value true false false false
-
@glasfaser sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Dafür gibt es doch dieses Register !?
Korrekt - vielleicht war mein Beispiel schlecht gewählt - diesen Status gibt es schon.
Mir geht es generell darum, wie man einen Status, der jede Sekunde via Variable berechnet wird, nur dann ausgibt und in einen Datenpunkt schreibt, wenn er den Zustand ändert?
-
@strobi sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
Mir geht es generell darum, wie man einen Status, der jede Sekunde via Variable berechnet wird, nur dann ausgibt und in einen Datenpunkt schreibt, wenn er den Zustand ändert?
ich weiß nicht was du mit berechnetem Status und dessen Zustand meinst.
aber üblicherweise kann man einen Wert in eine Variable schreiben und nach der erneuten Berechnung das Ergebnis mit dieser Variable vergleichen.
Nur wenn das unterschiedlich ist, wird dann geschrieben. -
Ich muss hier noch einmal das Thema des "Hausverbrauchs" aufgreifen.
Bei mir wir generell zu wenig Hausverbrauch angezeigt (Berechnung Hausverbrauch=I-AC_Power - M_AC_Power).
Die Werte für die Hausverbrauchsleistung stimmen mit denen im SE-Portal überein.
Mit steigender Moduleingangsleistung am Wechselrichter steigt auch meine Hausverbrauchsleistung obwohl die Lasten im Haus konstant sind.
Das kann doch nicht richtig sein?
Das Ganze ist auch 1:1 im SE-Monitoring Portal zu beobachten.Hat dieses Problem auch noch jemand beobachtet und vielleicht einen Tipp für mich?
Geprüft habe ich auch schon die Einbaurichtung der Stromwandler, da ich hier den Fehler vermutete. Aber Nachts, wenn keine Einspeisung vorliegt, sind richtigerweise die Leistungswerte auf allen drei Phasen negativ (Bezug) und der Bezug stimmt auch der Hausverbrauchsleistung überein.
Ich hatte auch schon gelesen, dass der WR die ID=1 haben muss. Bei mir hat er die ID=3. Kann das eventuell die Berechnung der Hausverbrauchsleistung beeinflussen? -
Hat denn keiner das gleiche Problem?
Ich habe schon in anderen Foren gelesen, dass ähnliche Probleme bestehen.
Leider hat auch Solaredge mir auf eine aufgegebene Fehlermeldung noch nicht geantwortet. -
Gelöst - ich habe heute mit Solaredge gechatet. Dabei hat sich herausgestellt, dass im Wechselrichter die falsche Wandlergröße durch den Installateur eingestellt wurde. Parametriert waren 50A-Wandler, eingebaut waren aber 70A-Wandler.
Inhaltlich ist damit das Ergebnis des höheren Hausverbrauchs bei steigender Modul-Einspeiseleistung auch nachvollziehbar, da der Hausverbrauch ja eine rein rechnerische Größe ist. -
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?
-
Hallo
also ich habe die 3 Wert übernommen, bei mir wie bei Batterieladestand 100% an, was auch gerade stimmt, der ist Voll.
Muss ich mal sehen, was später anzeigt, wenn dieser leer wird.
Batteriestatus ist bei mir eine 6, was bedeutet das?Batterieleistung macht der Modbus zu, spricht sagt das wäre eine falsche adresse... was kann ich machen?
-
@hardy_01 wie legt man die bitte an?
-
@longbow sagte in [Tutorial] SolarEdge -> Modbus -> ioBroker -> Grafana:
@tj1973
....Batteriestatus ist bei mir eine 6, was bedeutet das? ...Habe ich mal irgendwo aus einem Forum kopiert:
57734 Battery 1 Status
0 = Aus, 1 = Standby, 2 = Initialisierung, 3 = Laden, 4 = Entladen, 5 = Fehler, 6 = Leerlauf -
Hallo liebe Gemeinde,
also ich habe mit der Unterstützung von Herni alles prima zulaufen bekommen.
Jetzt habe ich aber mal einige Fragen, zu erst einmal hier meine Hardware:
- SolarEdge Wechselrichter SE8K
- LG Chem Resu 6,5 Batteriespeicher
- Zappi Ladebox
Ich lese die Daten der PV Anlage über den Modbus aus, das läuft super.
Nur hackt es bei der Auswertung, wenn die Anlage produziert, zeigt die Grafik dann minus an.
Hier muss das Script von Herni angepasst werde, nur ich bin wohl noch zu blöde dazu.
Hat das einer von Euch schon umgesetzt?Dann wäre ich neugierig, wie es läuft mit dem Auslesen und das grafisch umzusetzen mit dem Punkt, Wallbox.
Wie man das umsetzten könnte, finde die grafikisch die Lösung von Herni super, möchte es nur umsetzen, das es mit meinem
Geräten klappt.Ich bin was iobroker betrifft total Neuling, aber lerne täglich dazu
Ach und hab noch, das Script mit der Sonne, das passt um genau 2 Stunden nicht, wie kommt das zustandenß
-
Hallo,
ich wollte hier nochmal fragen, ob es jemanden mit Solaredge Wechselrichter und angeschlossener Batterie gibt, bei dem nachts abwechselnde I_AC_POWER Werte vorkommen (bei mir immer ~30Wh und 600Wh abwechselnd).Bei mir ist das jede Nacht, sobald die Batterie leer ist (also 10% Ladestand erreicht).
Hier ein Beispiel (habe den SE4000H Wechselrichter und eine LG Batterie) :
Die gelben Punkte sind der Ladestand der Batterie in %. Sobald der 10% erreicht geht es los.
Und hier noch ein Beispiel:
mal reingezoomt:
und noch weiter reingezoomt:
Das ganze hört auf, sobald es hell wird und die PV-Anlage etwas Strom produziert.
Da das so schwankt lässt sich das schlecht filtern. So zeigt mir iobroker nachts quasi an dass die PV-Anlage Strom erzeugt was Quatsch ist.
Bin ich echt der einzige mit dem Problem?
Könnt ihr mir bitte zeigen, wie der I_AC_POWER Wert nachts bei euch ist? Natürlich nur bei denen die eine Batterie haben. Zum Vergleich.
-
@cybtrash
Das kann ich bei mir nicht bestätigen. (SE10K-RWS + LG RESU 10)
Hast du die aktuelle Firmware für deinen Wechselrichter installiert. Ich kenne zumindest ein Problem bei meinem Wechselrichter mit dem Standby/Nachtmodus bei leerer Batterie...dies wurde allerdings per FirmwareUpdate behoben.
Dann hätte ich auch nochmal eine Frage...
Wie lasst ihr die Daten wie z.B. aktueller Verbrauch, Einspeisung, Batterie Ladeleistung etc. in Grafana anzeigen. Ist der einzige Weg diese Werte ebenfalls in die InfluxDB schreiben zu lassen um sie in Grafana dann als aktuellen Wert anzeigen zu lassen? Die Daten möchte ich ja eigentlich garnicht aufzeichnen sondern eben nur den aktuellen Wert in Grafana angezeigt bekommen.Beste Grüße
Foradh -
Hallo zusammen,
meine PV produziert jetzt seit 1,5 Tagen. Das Thema ist für mich also noch neu.
Hatte mir auf die Schnelle die modbus-Daten ausgelesen und historisiert. Danke für die Holding-Register!Eine Frage habe ich aber: Bekommt ihr in Grafana auch solche "Ausreißer" in den Morgen-/ Abendstunden dargestellt? Die Werte kommen so über den modbus-Adapter, es ist kein Grafana-Problem.
Die Daten werden sekündlich abgerufen und sind auf drei Minuten geglättet, aber das ist ja hier eher egal. Ohne Glättung sieht es genauso aus. Die grüne und die blaue Linie sind der 40084. Hatte den Wert noch einmal umbenannt, deshalb zwei Werte.
Die gelbe Linie ist 40207. Die sieht (erst einmal) gut aus.Danke für eure Ideen,
Tobias -
Nein, bekomme ich nicht. Ich takte auch im Abstand von 1s und mache dann eine Mittelwertbildung über 600s. Das passt dann relativ gut zur Solaredgeanzeige.
Falls es Dir hilft mein Script ... (habe ich so mit Blockly) umgesetzt ...
var iD, Liste1, Liste2, Liste3, Liste4, Liste5, Intervall; iD = 600; Liste1 = []; Liste2 = []; Liste3 = []; Liste4 = []; Liste5 = []; Intervall = setInterval(async function () { Liste1.push(getState("0_userdata.0.1_Netzbezug").val); if (Liste1.length >= parseFloat(iD) + 1) { setState("0_userdata.0.1_Netzbezug_D"/*1_Netzbezug_D*/, (parseFloat(Liste1.reduce(function(x, y) {return x + y;})) / iD), true); Liste1 = []; } Liste4.push(getState("0_userdata.0.4_Energieverbrauch").val); if (Liste4.length >= parseFloat(iD) + 1) { setState("0_userdata.0.4_Energieverbrauch_D"/*4_Energieverbrauch_D*/, (parseFloat(Liste4.reduce(function(x, y) {return x + y;})) / iD), true); Liste4 = []; } Liste2.push(getState("0_userdata.0.2_PV_Aktuell").val); if (Liste2.length >= parseFloat(iD) + 1) { setState("0_userdata.0.2_PV_Aktuell_D"/*2_PV_Aktuell_D*/, (parseFloat(Liste2.reduce(function(x, y) {return x + y;})) / iD), true); await wait(500); setState("0_userdata.0.5_PV_Frei_D"/*5_PV_Frei_D*/, (parseFloat(getState("0_userdata.0.2_PV_Aktuell_D").val) - getState("0_userdata.0.4_Energieverbrauch_D").val), true); Liste2 = []; } Liste3.push(getState("0_userdata.0.3_Batterie").val); if (Liste3.length >= parseFloat(iD) + 1) { setState("0_userdata.0.3_Batterie_D"/*3_Batterie_D*/, (parseFloat(Liste3.reduce(function(x, y) {return x + y;})) / iD), true); Liste3 = []; } Liste5.push(getState("0_userdata.0.2_PV_Aktuell").val); if (Liste5.length >= 86401) { setState("0_userdata.0.2_PV_Aktuell_S"/*2_PV_Aktuell_S*/, (parseFloat(Liste5.reduce(function(x, y) {return x + y;})) / 3600), true); Liste5 = []; } }, 1000);
-
@tobias
Das Problem hatte ich auch, du hast vermutlich vergessen den Skalierungsfaktor zu berücksichtigen, der Ändert sich im TagesverlaufGruß Markus