NEWS
FRONIUS Adapter Entwicklung eingestellt?
-
Hallo,
für mich ist das Thema iobroker komplett neu.
Vor kurzem wurde meine PV-Anlage mit 2 Fronius WR, Smartmeter TS 65A3 und einer BYD HVS 10,2 in Betrieb genommen. Nun möchte ich gerne das ganze natürlich auch auswerten und bin bei meiner Suche auf den iobroker und den Fronius Adapter gestoßen. Die Installation und die die Einrichtung haben auch funktioniert.Nun erschlägt mich jedoch die Flut der ausgegebenen Daten. Ich möchte nun langsam damit starten und für den Anfang die Werte für Netzbezug, PV- Produktion, Verbrauch, Einspeisung, Batterie Ent- / Ladung und Batterieladestand nutzen.
Welche Werte nutze ich dafür?
Ich habe den Thread komplett durchgelesen, wie auch die Dokumentation von Fronius zur Api- Schnittstelle. Aber als Neuling steige ich da noch nicht durch.
Vielen Dank schonmal.
-
@io2023
Das hängt jetzt davon ab, ob die die Version 1.x oder die Version 2.01 installiert hast.
Aber suche nach folgenden Namen:
P_AKKU ...... Lade/Entlade-Leistung (Ladung ist negativ)
P_GRID ....... Bezug/Lieferung ins GRID (Bezug ist positiv)
P_LOAD ..... Verbrauch (im Haus)
P_PV ........... Leistung von der PV
SOC ............ Ladestand der Batteriein Version 1.x unter Fronius.0.powerflow
ab Version 2.x unter Fronius.0.siteDer SOC liegt unter dem Inverter-Folder
Version 1.x .... fronius.0.powerflow.inverter1.SOC
Version 2.x ..... fronius.0.inverter.1.SOCHängt aber wahrscheinlich auch davon ab, ob Du den Fronius-Smartmeter hast (wie ich)
Bei anderer Konfiguration könnte es anders sein, aber die kenne ich nicht. -
-
SoC = state of charge
-
Danke für die schnelle Antwort.
Ich habe gerade mal auf die Version 2.01 aktualisiert. Mit P_LOAD habe ich eine größere Abweichung zur Anzeige im Solarweb.An was kann das liegen?
Das Smartmeter ist von Fronius.
Kann ich den Ordner Powerflow dann löschen?
-
@io2023 Das Solarweb hängt gewöhnlich um einige Minuten hinterher. Also wenn du die DP`s vergleichen willst, dann mit dem WR eigenen Webinterface - da sollte es Deckungsgleich sein. Das Solarweb ist keine gute Referenz - schon gar nicht, wenn du auch noch ein Auge auf die Erträge haben willst.
-
Hallo zusammen,
ich bin nun schon echt lange am Lesen, was das Thema Solaarweb/Fronius usw angeht. Im IOB habe ich die beiden adapter auch schon am laufen. und teilweise monitore ich die Werte auch schon per DB und Grafana.
Bei mir läuft eine 15KW-Anlage, mit folgenden Komponenten:
Fronius Symo GEN24 10.0
Fronius Symo 5.0-3-M
Batterie: BYD Premium HVS/M 13,8kwh
Fronius Smart Meter (RTU)Für mich ein paar Verständnisfragen:
Wie bekomme ich die Gesamtwerte beider WR ohne Solarweb-Adapter ausgelesen, da es ja zwei unterschiedliche IPs sind?
Geht das nur über MODBUS?
Wenn ja, was benötige ich da für Hardware?Grüße und Danke schon einmal im Vorraus.
Jörg
-
@jjphoenix79
Mach einfach zwei Instanzen auf, jeweils mit den IPs der WR. -
Dazu gab es mal einen Feature request (https://github.com/iobroker-community-adapters/ioBroker.fronius/issues/63)
@nkleber hat dazu geantwortet:
One instance shall always relate to 1 IP address. Multiple inverters with 1 datamanager are working properly.
Ergo wenn du einen DataManager hast sollte diese beide WR erkennen.
Wenn du 2 DataManager hast, dann brauchst du 2 Instanzen.Falls weitere Fragen existieren oder Diskussionbedraf, bitte ping @nkleber direkt an. Ich kann hier leider nicht mehr beigtragen da ich zur Zeot mnicht mal einen Fronius besitzt bzw. drauf ZUgriff habe.
McM1957
-
@jb_sullivan
Danke für den Hinweis. Jetzt passen die Werte auch. -
@strobelix
Vielen Dank für deine Hilfe.
Jetzt funktioniert alles perfekt. -
@mcm57
So, unsere Anlage ist nun auch wieder am öffentlichen Netz und ich kann ich weiter mit dem Thema beschäftigen.Nach langem hin und her, auch mit dem Fronius Support, sehe ich die Geräte im Solar web wieder.
Leider finde ich im IOB des Fronius Smartmeters nicht alle Werte, die ich gerne auslesen/monitoren möchte.
zum Beispiel, was gerade verbraucht wird oder was produziert wird. Schön wäre es wirklich aus einer Datenquelle alles zu bekommen.
-
@jjphoenix79 Die Daten kannst du nur aus der differenz zwischen WR und Smartmeter rechnen. Diese werden nicht über die API zur verfügung gestellt. Das Solarweb portal berechnet diese Daten auch selbst
gruß Norbert
-
-
@nkleber said in FRONIUS Adapter Entwicklung eingestellt?:
@jjphoenix79 Die Daten kannst du nur aus der differenz zwischen WR und Smartmeter rechnen. Diese werden nicht über die API zur verfügung gestellt. Das Solarweb portal berechnet diese Daten auch selbst
gruß Norbert
@da_woody said in FRONIUS Adapter Entwicklung eingestellt?:
Ok, danke euch beider erstmal. Da ich mich auch parallel noch mit dem Modbus beschäftige, warte ich hiermit noch etwas.
Möchte gern ohne Cloud, die entsprechenden Daten meiner beider WR ink des SM haben, wenn das denn damit geht.
-
@jjphoenix79 Die Berechnungen machste dann einfach im iobroker selber, ist kinderleicht.
-
Gibt es in der neuen 2er API eigentlich einen Datenpunkt mit dem aktuellen Tagesverbrauch (Energie) ? Ich konnte nichts finden. Falls nicht, wie könnte man diesem am besten selbst berechnen?
Gruss
Alen -
@alen hab nix gesehen aber ich erfasse alles selber.
ich mach das so:
Ich machd as mit nem Array aus Sensoren,. ist aber analog zu einzelwerten:
hier:
"Fronius","WH","javascript.0.Zaehler.PVZaehlerFronius_abs","TDWMY"TWDMY heißt täglich wöchentlich usw... wenn Interesse am ganzen script besteht melde dich
on({id: "fronius.0.inverter.1.TOTAL_ENERGY", change: 'ne'}, function (obj) { //schedule("* * * * *", function () { setState("javascript.0.Verbrauch.Fronius_daily_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_daily_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_weekly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_weekly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_monthly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_monthly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_yearly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_yearly_last").val)*1000)/1000, true); });
schedule("57 23 * * *", function () { for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('D') ){ var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily',verbrauch, true); //Summe des Tages setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_last', letzter, true); //letzter Zählerstand setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_actual', 0, true); // } }
function intervallVerbrauch(totalAct, totalLast){ var consumption = Math.round ((totalAct - totalLast)*100)/100; totalLast = Math.round (totalAct*100)/100; return [consumption, totalLast]; }
-
@jmeister79 sagte in FRONIUS Adapter Entwicklung eingestellt?:
TWDMY heißt täglich wöchentlich usw... wenn Interesse am ganzen script besteht melde dich
hätte Interesse
-
Bitte.
Ist auf meine Bedürfnisse angepasst sollte aber grundsätzlich so funktionieren.Es werden am Anfang für jeden Sensor die benötigten Punkte angelegt und in History aktiviert.
ps.: Kommentieren war noch nie mein Ding
var hist = { "history.0": { "enabled": true, "changesOnly": true, "debounce": 10000, "maxLength": 360, "retention": 31536000 } }; //Sensor Array aller erfassten Geräte (Diese sind ebreits vorhanden) // "Name","Einheit","Quelle","MDW" //T:today //m: minutelly //D: Daily //W: Weekly //M: Monthly //Y: Yearly var ArrayOfSensors = [ "Stromzaehler","kWh","javascript.0.Zaehler.StromZaehler_abs","TmDWMY", // "javascript.0.Zaehler.StromZaehler_abs" "TauchpumpeSicker","kWh","fritzdect.0.DECT_xxxxxxxx.energy","mDW", "TauchpumpeRegen","kWh","fritzdect.0.DECT_xxxxxxxx.energy","mDW", "TauchpumpeLager","kWh","fritzdect.0.DECT_xxxxxxxx.energy","mDW", "TauchpumpeHeiz","kWh","fritzdect.0.DECT_xxxxxxxx","mDW", "TauchpumpeWerkstatt","kWh","fritzdect.0.DECT_xxxxxxxx.energy","mDW", "Entfeuchter","kWh","zigbee.0.xxxxxxxx.consumption","TmDW", "Gaszaehler","m³","javascript.0.Zaehler.GasZaehler_abs","TmDWMY", // "javascript.0.Zaehler.GasZaehler_abs" "Heizung","kWh","ems-esp.0.heatSources.energyMonitoring.consumption","DW", "Brennerstarts","","ems-esp.0.heatSources.numberOfStarts","TDW", "Photovoltaik","kWH","javascript.0.Zaehler.PVZaehler_abs","TmDWMY", "Fronius","WH","javascript.0.Zaehler.PVZaehlerFronius_abs","TDWMY" ]; var historyObjArray = []; //Alle Datenpunkte kreieren for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every second if (ArrayOfSensors[n+3].includes('T') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_actual', 0.0, {name: "diff today"+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); } if (ArrayOfSensors[n+3].includes('m') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s', 0.0, {name: "diff last 10min "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s_last', 0.0, {name: "abs last 10 min "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); historyObjArray.push('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s'); //Ins History Array } if (ArrayOfSensors[n+3].includes('D') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily', 0.0, {name: "diff last day "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_last', 0.0, {name: "abs last day "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); historyObjArray.push('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily');//Ins History Array } if (ArrayOfSensors[n+3].includes('W') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly', 0.0, {name: "diff last week "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly_last', 0.0, {name: "abs last Week "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly_actual', 0.0, {name: "abs last Week "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); historyObjArray.push('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly');//Ins History Array } if (ArrayOfSensors[n+3].includes('M') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly', 0.0, {name: "diff last month "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly_last', 0.0, {name: "abs last month "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly_actual', 0.0, {name: "abs last Week "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); historyObjArray.push('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly');//Ins History Array } if (ArrayOfSensors[n+3].includes('Y') ){ createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly', 0.0, {name: "diff last year "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly_last', 0.0, {name: "abs last year "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); createState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly_actual', 0.0, {name: "diff actual yeat "+ArrayOfSensors[n], type: 'number', unit: ArrayOfSensors[n+1]}); historyObjArray.push('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly');//Ins History Array } } //History aktivieren für daily, weekly, monthly, yearly for (var n = 0; n < historyObjArray.length; n++) { // for every second // log (historyObjArray[n]); sendTo('history.0', 'enableHistory', { id: historyObjArray[n], options: { changesOnly: true, debounce: 0, retention: 0, maxLength: 960, changesMinDelta: 0, aliasId: '' } }, function (result) { if (result.error) { console.log(result.error); } if (result.success) { // successfully enabled } }); } //erfassen der Sensorwerte auf today und actual year //diese sensoren sollen immer live werte zeigen, dafür war das "T" gedacht //Diese Kolelgen müssen manuell programmeirt werden, da ich noch nicht weiß wie ich aus einem array triggern kann. evtl mit concat im on? //Hier evtl auf alle 10s umsteigen? on({id: "javascript.0.Zaehler.StromZaehler_abs", change: 'ne'}, function (obj) { setState("javascript.0.Verbrauch.Stromzaehler_daily_actual", Math.round ((getState("javascript.0.Zaehler.StromZaehler_abs").val - getState("javascript.0.Verbrauch.Stromzaehler_daily_last").val)*100)/100, true); setState("javascript.0.Verbrauch.Stromzaehler_weekly_actual", Math.round ((getState("javascript.0.Zaehler.StromZaehler_abs").val - getState("javascript.0.Verbrauch.Stromzaehler_weekly_last").val)*100)/100, true); setState("javascript.0.Verbrauch.Stromzaehler_yearly_actual", Math.round ((getState("javascript.0.Zaehler.StromZaehler_abs").val - getState("javascript.0.Verbrauch.Stromzaehler_yearly_last").val)*100)/100, true); }); on({id: "javascript.0.Zaehler.GasZaehler_abs", change: 'ne'}, function (obj) { setState("javascript.0.Verbrauch.Gaszaehler_daily_actual", Math.round ((getState("javascript.0.Zaehler.GasZaehler_abs").val - getState("javascript.0.Verbrauch.Gaszaehler_daily_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Gaszaehler_weekly_actual", Math.round ((getState("javascript.0.Zaehler.GasZaehler_abs").val - getState("javascript.0.Verbrauch.Gaszaehler_weekly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Gaszaehler_yearly_actual", Math.round ((getState("javascript.0.Zaehler.GasZaehler_abs").val - getState("javascript.0.Verbrauch.Gaszaehler_yearly_last").val)*1000)/1000, true); }); on({id: "javascript.0.Zaehler.PVZaehler_abs", change: 'ne'}, function (obj) { setState("javascript.0.Verbrauch.Photovoltaik_daily_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehler_abs").val - getState("javascript.0.Verbrauch.Photovoltaik_daily_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Photovoltaik_weekly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehler_abs").val - getState("javascript.0.Verbrauch.Photovoltaik_weekly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Photovoltaik_monthly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehler_abs").val - getState("javascript.0.Verbrauch.Photovoltaik_monthly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Photovoltaik_yearly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehler_abs").val - getState("javascript.0.Verbrauch.Photovoltaik_yearly_last").val)*1000)/1000, true); }); on({id: "fronius.0.inverter.1.TOTAL_ENERGY", change: 'ne'}, function (obj) { //schedule("* * * * *", function () { setState("javascript.0.Verbrauch.Fronius_daily_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_daily_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_weekly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_weekly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_monthly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_monthly_last").val)*1000)/1000, true); setState("javascript.0.Verbrauch.Fronius_yearly_actual", Math.round ((getState("javascript.0.Zaehler.PVZaehlerFronius_abs").val - getState("javascript.0.Verbrauch.Fronius_yearly_last").val)*1000)/1000, true); }); //600s Erfassung schedule("*/10 * * * *", function () { for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('m') ){ var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s',verbrauch, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_600s_last', letzter, true); } } }); //24h erfassung schedule("57 23 * * *", function () { for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('D') ){ var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily',verbrauch, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_last', letzter, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_daily_actual', 0, true); } } var WirkGrad = 0; var Zustandszahl = getState("javascript.0.Parameter.ZustandszahlGas").val; var HeizLeistung = getState("javascript.0.Heizung.Verbrauch.actualPower.Yesterday").val; var GasVerbrauch = Math.round ((getState("javascript.0.Zaehler.GasZaehler_abs").val - getState("javascript.0.Gaszaehler_Daily_last").val)*1000)/1000 WirkGrad = HeizLeistung / (GasVerbrauch * Zustandszahl); setState("javascript.0.Gas.errWirkungsgrad", WirkGrad); }); //Wöchentlich Montags 00:00 schedule("0 0 * * 1", function () { for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('W') ){ //nur wenn wöchentlich aktiviert ist var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly',verbrauch, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly_last', letzter, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_weekly_actual', 0, true); } } }); //Monatlich 01. 00:00 schedule("1 0 1 * *", function () { for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('M') ){ //nur wenn Monatlich aktiviert ist var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly',verbrauch, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_monthly_last', letzter, true); } } }); //Jährlich an neujahr 00:01 schedule("1 0 1 1 *", function () { log('los gehts'); for (var n = 0; n < ArrayOfSensors.length; n+=4) { // for every third if (ArrayOfSensors[n+3].includes('Y') ){ //nur wenn wöchentlich aktiviert ist var actvalue = getState(ArrayOfSensors[n+2]).val; var lastvalue = getState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly_last').val; var [verbrauch, letzter] = intervallVerbrauch(actvalue, lastvalue); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly',verbrauch, true); setState('javascript.0.Verbrauch.'+ArrayOfSensors[n]+'_yearly_last', letzter, true); log(ArrayOfSensors[n]) } } }); function intervallVerbrauch(totalAct, totalLast){ var consumption = Math.round ((totalAct - totalLast)*100)/100; totalLast = Math.round (totalAct*100)/100; return [consumption, totalLast]; }