[98_fronius.pm] Fronius API Modul - Weiterentwicklung

Begonnen von fichtennadel, 27 Mai 2024, 23:05:40

Vorheriges Thema - Nächstes Thema

fichtennadel

Hier der Vollständigkeit halber nochmal der Punkt aus dem anderen Thread:

Leider liefern GEN24/Tauro keine Werte aus der ArchiveData Gruppe, Zitat aus der Fronius Doku: "GEN24/Tauro does not provide access to history data" (Kapitel 5.1.1)

Betroffen sind diese Readings des Moduls:
ArchiveData_EnergyReal_WAC_Minus_Absolute
ArchiveData_EnergyReal_WAC_Plus_Absolute
ArchiveData_EnergyReal_WAC_Sum_Produced
ArchiveData_PowerReal_PAC_Sum
MPPT1_DC_A
MPPT1_DC_V
MPPT1_DC_W
MPPT2_DC_A
MPPT2_DC_V
MPPT2_DC_W
RasPi 2 B | JeeLink Classic [4x 30.3144it, 2x 30.3147it] | CUL 433 a-culfw V 1.04.01 [ IT-1500, ITM-100, Somfy Telis 1 RTS, BelFox ] | TCM ESP3 [ FSB61, FSB61NP, FT55, FMH4S, AP221 ] | Fronius | Modbus/TCP (Stiebel Eltron WP) | HTTPMOD (go-e)

Hadl

#121
Hallo zusammen,
ich hab nun folgendes Setup
1. Wechselrichter mit Battery und Primärzähler am Einspeisepunkt
2. Wechselrichter (neu) der ins Hausnetz einspeißt.

Ich hab nun das Phänomen, das der Verbrauch des Hauses, also das Reading PowerFlow_Site_P_Load viel zu hoch ist, wenn der zweite Wechselrichter produziert.
Ich hätte eigentlich erwartet, das dieser Wert sogar negativ ist, wenn der zweite Wechselrichter mehr produziert als das Haus konsumiert.
Dadurch gehen bei mir einige Automatisierung nichtmehr, da kein PV Überschuss mehr vorhanden scheint, wenn das Haus soviel verbraucht. Im SolarWeb wirds aber richtig angezeigt.

Kann es sein das das Modul ein Problem hat, wenn der Verbrauch des Hauses niedriger ist, als die Einspeisung weiterer Wechselrichter?

Hadl

Edit: Der wechselrichter produziert natürlich!

fichtennadel

Die Werte kommen so vom Wechselrichter, das Modul rechnet nur bei den MPPT Werten selbst (und auch da nur eine Multiplikation der WR-Werte).

Bei zwei Wechselrichtern müsstest du ja zwei Devices in fhem angelegt haben, wie sind denn die Einzelwerte für PowerFlow_Site_P_Load?
Sind die ArchiveData_EnergyReal* Werte brauchbar?

Bei einem MeterDevice und zwei Wechselrichtern gibt es vielleicht Bedarf selbst noch was zu rechnen, vielleicht übernimmt SolarWeb das im Hintergrund.
Die Last ist ja immer nur rechnerisch die Differenz aus den gemessenen Werten für Erzeugung (am WR) und Einspeisung (am Zähler), aber wie gesagt, gerechnet von Fronius am WR.
RasPi 2 B | JeeLink Classic [4x 30.3144it, 2x 30.3147it] | CUL 433 a-culfw V 1.04.01 [ IT-1500, ITM-100, Somfy Telis 1 RTS, BelFox ] | TCM ESP3 [ FSB61, FSB61NP, FT55, FMH4S, AP221 ] | Fronius | Modbus/TCP (Stiebel Eltron WP) | HTTPMOD (go-e)

Prof. Dr. Peter Henning

Zitat von: Hadl am 05 Mai 2025, 10:41:45Ich hätte eigentlich erwartet, das dieser Wert sogar negativ ist, wenn der zweite Wechselrichter mehr verbraucht als das Haus konsumiert.
Das scheint mir ein wenig wirr - wieso sollte der Wechselrichter etwas verbrauchen?

Und was soll der "Primärzähler" sein? Der Zähler des Netzbetreibers?
Ist der Fronius-WR an ein separates Smartmeter angeschlossen, mit dem er direkt kommuniziert? Das sollte eigentlich so sein, wenn "solarer Überschuss" festgestellt werden kann.
Was für ein Wechselrichter ist der "zweite"?

LG

pah

Hadl

#124
Zitat von: fichtennadel am 05 Mai 2025, 12:38:01Bei zwei Wechselrichtern müsstest du ja zwei Devices in fhem angelegt haben, wie sind denn die Einzelwerte für PowerFlow_Site_P_Load?
Sind die ArchiveData_EnergyReal* Werte brauchbar?
Der erste Wechselrichter scheint immer den Betrag der Differenz zwischen seiner eigenen Leistung und dem primärzähler auszugeben.
Dadurch wir der Wert entweder groß wenn das Haus viel verbraucht und wenig produziert wird, oder wenn das Haus wenig verbraucht und der zweite Wechselrichter viel produziert.

Die Meter_0_EnergyReal.* Werte sind alle plausibel

Zitat von: fichtennadel am 05 Mai 2025, 12:38:01Die Last ist ja immer nur rechnerisch die Differenz aus den gemessenen Werten für Erzeugung (am WR) und Einspeisung (am Zähler), aber wie gesagt, gerechnet von Fronius am WR.
Genau, und diese Differenz müsste negativ sein wenn mehr eingespeist wird, als er selbst produziert. Auf der Wechselrichter Website sehe ich das auch so, aber in fhem siehts aus als ob ich den Betrag davon sehe.

Zitat von: Prof. Dr. Peter Henning am 05 Mai 2025, 15:35:55
ZitatIch hätte eigentlich erwartet, das dieser Wert sogar negativ ist, wenn der zweite Wechselrichter mehr verbraucht als das Haus konsumiert.
Das scheint mir ein wenig wirr - wieso sollte der Wechselrichter etwas verbrauchen?
Richtig, sollte heißen: "Ich hätte eigentlich erwartet, das dieser Wert sogar negativ ist, wenn der zweite Wechselrichter mehr produziert als das Haus konsumiert."

Zitat von: Prof. Dr. Peter Henning am 05 Mai 2025, 15:35:55Und was soll der "Primärzähler" sein? Der Zähler des Netzbetreibers?
Ist der Fronius-WR an ein separates Smartmeter angeschlossen, mit dem er direkt kommuniziert? Das sollte eigentlich so sein, wenn "solarer Überschuss" festgestellt werden kann.
Was für ein Wechselrichter ist der "zweite"?
Primärzähler ist der Fronius Smartmeter der direkt hinter dem Zähler des Netzbetreibers sitzt und damit das gleiche zählt.
Dieser Smartmeter hängt am ersten Wechselrichter, genauso wie der Akku.
Der zweite Wechselrichter ist auch ein Fronius, aber als reiner Produzent ohne Smartmeter oder Akku.



fichtennadel

Kannst du ein Beispiel für die Werte von PowerFlow_Site_P_* für die beiden Wechselrichter zu einem Zeitpunkt posten?

Eigentlich sollte sich die Last aus (WR1.PowerFlow_Site_P_PV+WR2.PowerFlow_Site_P_PV)-PowerFlow_Site_P_Grid ergeben, vorausgesetzt die Einzelwerte sind korrekt.

Spannend ist, wie Fronius den PowerFlow_Site_P_Grid Wert auf den beiden WR bestimmt.
RasPi 2 B | JeeLink Classic [4x 30.3144it, 2x 30.3147it] | CUL 433 a-culfw V 1.04.01 [ IT-1500, ITM-100, Somfy Telis 1 RTS, BelFox ] | TCM ESP3 [ FSB61, FSB61NP, FT55, FMH4S, AP221 ] | Fronius | Modbus/TCP (Stiebel Eltron WP) | HTTPMOD (go-e)

Hadl

#126
Hier mal ein Beispielzeitpunkt von jetzt
1. WR
PowerFlow_Site_P_Akku: -15
PowerFlow_Site_P_Grid: -12947
PowerFlow_Site_P_Load: 7962
PowerFlow_Site_P_PV: 5100


2. WR
PowerFlow_Site_P_Akku: 0
PowerFlow_Site_P_Grid: 0
PowerFlow_Site_P_Load: 0
PowerFlow_Site_P_PV: 8457


In wirklichkeit ists so:
Produktion: 5100 + 8457= 13557
Einspeisung und Akku laden: 12947 + 15 = 12962
Verbrauch Haus: 13557- 12962 (- Eigenverbrauch WR's) ~ 595
Der erste Wechselrichter sollte als "Rest im Haus" (PowerFlow_Site_P_Load) sehen: 5100 - 15 - 12947 (- Eigenverbrauch) ~ -7862



Hab jetzt den Code nochmal genauer angeschaut und bin zur Überzeugung gekommen das irgendwo ein Vorzeichen verloren geht. Ich hab die Stelle auch gefunden.

Hier wird der Betrag gebildet. Wenn ich das wegnehme, aber die Vorzeichenänderung an die ich mich schon gewöhnt habe lasse, dann funktioniert alles wieder!
        if ($reading eq "PowerFlow_Site_P_Load") {
          if ( $value + 0 eq $value) {
            if ($value < 0) {$value = $value * -1}
          }       
        }
Ohne Betragbildung, aber mit Vorzeichenänderung
        if ($reading eq "PowerFlow_Site_P_Load") {
          if ( $value + 0 eq $value) {
            $value = $value * -1;
          }       
        }

Damit hat dann der 1. WR:
PowerFlow_Site_P_Load: -7962

Prof. Dr. Peter Henning

Ok, jetzt wird es klarer, was hier wo läuft. Ich finde die Konstellation potenziell interessant, weil ich in 3 Jahren meine Altanlage aufbohren und ebenfalls mit dann neuem Fronius-WR und Speicher ausstatten werde. Die soll dann mit der jetzt neuen 2. Anlage (Fronius-WR und Speicher) möglichst optimal zusammenwirken.

Für das Modul ergäbe sich damit die Möglichkeit, eine Art Master-Slave- Kombination zu bilden, bei der alle relevanten Daten an einer Stelle gesammelt werden.

Lg

pah

fichtennadel

Zitat von: Hadl am 07 Mai 2025, 10:36:35Hab jetzt den Code nochmal genauer angeschaut und bin zur Überzeugung gekommen das irgendwo ein Vorzeichen verloren geht. Ich hab die Stelle auch gefunden.

Hier wird der Betrag gebildet. Wenn ich das wegnehme, aber die Vorzeichenänderung an die ich mich schon gewöhnt habe lasse, dann funktioniert alles wieder!
        if ($reading eq "PowerFlow_Site_P_Load") {
          if ( $value + 0 eq $value) {
            if ($value < 0) {$value = $value * -1}
          }      
        }
Ohne Betragbildung, aber mit Vorzeichenänderung
        if ($reading eq "PowerFlow_Site_P_Load") {
          if ( $value + 0 eq $value) {
            $value = $value * -1;
          }      
        }

Damit hat dann der 1. WR:
PowerFlow_Site_P_Load: -7962

Die Stelle ist noch aus der ursprünglichen Version von michael.winkler. Ich kann das schon ändern, kann aber sein, dass sich dann jemand meldet, der das wieder andersrum möchte, weil es schon jahrelang so ist und verwendet/erwartet wird.

Und eigentlich kann eine Last ja nicht negativ sein, der Wert an der Stelle ist aber auch unabhängig vom Vorzeichen falsch, weil er auf Ebene der beiden WR gerechnet werden muss.

Unabhängig von der Änderung im Modul wirst Du das voerst über eine Rechnung über beide WR mit Userreadings lösen müssen.

Die "Master-Slave-Kombination" von pah ist eine gute Idee, das sehe ich mir getrennt an, ist aber eine größere Änderung im Modul.

RasPi 2 B | JeeLink Classic [4x 30.3144it, 2x 30.3147it] | CUL 433 a-culfw V 1.04.01 [ IT-1500, ITM-100, Somfy Telis 1 RTS, BelFox ] | TCM ESP3 [ FSB61, FSB61NP, FT55, FMH4S, AP221 ] | Fronius | Modbus/TCP (Stiebel Eltron WP) | HTTPMOD (go-e)

Hadl

Hallo Fichtennade,
ja, ich sehe das so wie du. Der Wert ist mit zwei Wechselrichtern eh nichtmehr wirklich zu gebrauchen, wobei ich eigentlich keinen Usecase sehe wo man den Betrag braucht. Wenn man den Wert immer mit "-1" multipliziert würde es für mich auf jeden Fall mehr Sinn machen.

Das Master-Slave Problem hab ich aktuell u.a. mit dem SolarForecast Modul gelöst, dort kann man mehrere Wechselrichter angeben, aber auch wo der Zähler und der Akku ist. Er rechnet dann auch selbstständig vernünftige Werte aus. Nur im Fall von Wolken merkt man schon, das zwischen den beiden Abfragen an die Wechselrichter ein Zeitversatz ist und manchmal daher die Rechnungen nicht passen.

Gibt es eine Möglichkeit die Abfragen zu syncronisieren?

fichtennadel

#130
Zitat von: Hadl am 07 Mai 2025, 17:26:37Wenn man den Wert immer mit "-1" multipliziert würde es für mich auf jeden Fall mehr Sinn machen.
V0.5 im Contrib (https://svn.fhem.de/fhem/trunk/fhem/contrib/98_fronius.pm)

Zitat von: Hadl am 07 Mai 2025, 17:26:37Gibt es eine Möglichkeit die Abfragen zu syncronisieren?
Ich habe noch keine gefunden, es sind ja nicht mal die Werte eines WRs zwingend in sich konsistent, siehe Fronius Doku "Because data has multiple asynchronous origins it is a matter of fact that the sum of all powers (grid, load and generate) will differ from zero" (https://www.fronius.com/~/downloads/Solar%20Energy/Operating%20Instructions/42%2C0410%2C2012.pdf , Kapitel 4.11)

Ich verwende für die "schnellen" Steuerungen (zB Reaktion auf Wolken) den PowerFlow_Site_P_Grid Wert (Überschuss ins Netz ja/nein oder aktuell verfügbarer Überschuss für Wallbox) und für Statistiken bzw. "langsame" Steuerungen (Mittelwert o.ä.) die ArchiveData Werte.
RasPi 2 B | JeeLink Classic [4x 30.3144it, 2x 30.3147it] | CUL 433 a-culfw V 1.04.01 [ IT-1500, ITM-100, Somfy Telis 1 RTS, BelFox ] | TCM ESP3 [ FSB61, FSB61NP, FT55, FMH4S, AP221 ] | Fronius | Modbus/TCP (Stiebel Eltron WP) | HTTPMOD (go-e)

stefanru

Also ich versuche das Syncen über ein Notify und bin damit ziemlich zufrieden.
   
WR1:PowerFlow_Site_P_PV.* set WR2 GetPowerFlowData

Gruß,
Stefan

Hadl

Ich hab gerade mal meine Events beobachtet. Die beiden Fronius Abfragen scheinen nahezu zeitgleich zu erfolgen und überlagern sich sogar im Event Monitor
Nur der notify den ich probiert habe macht bei jedem der drei Werte schon eine Berechnung und nicht erst wenn alle drei da sind. Und es ist nicht immer gleich welcher der letzte der drei ist.
Damit krieg ich immer falsche Einträge kurz darauf gefolgt von einem besseren. Die SolarForecast ist wohl zeitlich weiter versetzt und sieht meistens bessere Werte.

defmod notify_StromverbrauchHaus notify (Fronius_Symo1:Inverter_Common_PAC_Value|Fronius_Symo1:PowerFlow_Site_P_Grid|Fronius_Symo2:Inverter_Common_PAC_Value):.*\
  {\
  my $val=\
    ReadingsVal('Fronius_Symo1', 'Inverter_Common_PAC_Value', '0') + \
    ReadingsVal('Fronius_Symo1', 'PowerFlow_Site_P_Grid', '0') + \
    ReadingsVal('Fronius_Symo2', 'Inverter_Common_PAC_Value', '0') \
    ;;;;\
  { fhem "setreading notify_StromverbrauchHaus StromverbrauchHaus $val" }\
}

stefanru

Hmmm, und wenn du die Berechnung in einem UserReading in einem der beiden Devices machst?
Oder in einem 3ten Dummy Device dass du per notify triggerst wenn die Abfragen beider WR durch sind?

Gruß,
Stefan

Prof. Dr. Peter Henning

Solche Rechnungen sollten erstens in einer ausgelagerten Perl-Routine erfolgen. Die kann man zwar in einem userReading einbinden - wartbar sollte sie aber nicht im Device sein, sondern mit einem ordentlichen Code-Editor.

Zweitens ist auch hier ein Master-Slave-Konzept zu bevorzugen: Eines der WR-Devices löst (gerne über ein userReading) die ganze Kette anderer Abfragen aus. Bei mir ist das die Abfrage von http://xxx/solar_api/v1/GetPowerFlowRealtimeData.fcgi, da ich weiterhin lieber über HTTPMOD auf den WR zugreife.

Wenn man das in dem Modul überarbeitet, sollte deshalb ein Attribut "externalPowerFunction" (oder so) eingeführt werden, das als Wert einen Funktionsnamen erhält, der unmittelbar nach dieser Abfrage aufgerufen wird.

LG

pah