Photovoltaik Eigenverbrauch,Bilanz,Prognose (Kostal Plenticore; KSEM; BYD HV)

Begonnen von ch.eick, 07 Oktober 2020, 16:09:12

Vorheriges Thema - Nächstes Thema

ch.eick

Hallo zusammen,
einige von Euch verwenden im WR_ctl ja keine DbRep reports für den gester/Vormonat/... , dafür habe ich eine kleine Änderung vorgenommen, damit in der uiTable nicht mehr das "null" angezeigt wird.
In dieser Funktion bitte an zwei Stellen etwas korrigieren, damit einfach nichts zurück gegeben wird.
Hier die kurz Fassung...
sub WR_ctl_Format {
< snip >

    if ($period eq "_Qx" and $QuarterPrevious ne "null") {
        return $QuarterPrevious;
    }

< snip >

  return ;
}

VG   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Moinsen,
ich habe mich mal an einen Umbau der dwd_load() MySQL Procedure herangesetzt.

Bei der Procedure hat mich die Laufzeit gestört, da ich gerne jede Stunde ein Update laufen lasse, was im WR_ctl über das LogDBRep_PV_KI_Prognose DbRep Device gestartet wird. Dabei geht der MySQL Docker Container auf 100% CPU, was leider bei einer längeren Laufzeit zu eventuellem stocken im FHEM führt, wenn es auf der selben CPU läuft.

Nach kurzen Nachdenken ist mir eingefallen, dass sich ja die historischen Daten nicht innerhalb eines Tages verändern werden. Verwendet werden ja hierbei Daten mit folgendem TIMESTAMP, also 1-2 Jahre zurück, um einen änlichen Zeitraum zum Vergleichen zu haben.
AND ( TIMESTAMP > DATE_ADD(@date,INTERVAL -30 DAY)
OR    TIMESTAMP > DATE_ADD(@date,INTERVAL -(365+30) DAY)
  AND TIMESTAMP < DATE_ADD(@date,INTERVAL -(365-30) DAY)
OR    TIMESTAMP > DATE_ADD(@date,INTERVAL -(2*365+30) DAY)
  AND TIMESTAMP < DATE_ADD(@date,INTERVAL -(2*365-30) DAY)
    )

Dazu kommen dann fc0 und fc1, wodurch ich dies nun über ein Parameter Wort aufgeteilt habe.
call dwd_load_new('full',curdate(),'none');
call dwd_load_new('update',curdate(),'none');
call dwd_load_new('update_yield_only',curdate(),'none');
- full wäre der komplette Lauf wie bisher
- update aktualisiert nur fc0 und fc1, sowie den yield von heute
- update_yield_only korrigiert somit nur den aktuellen yield von heute

Somit ergibt sich dann zukünftig die Möglichkeit die dwdfull Tabelle vor der KI_Prognose geziehlt und schneller zu aktualisieren.

Nachts sollte immer ein "full" Lauf erfolgen und jede Stunde würde ein "update" reichen.
Wer dann den aktuellen yield der laufenden Stunde wachsen sehen möchte, der kann das mit "update_yield_only" machen, was dann auch ohne die KI_Prognose das Grafana Diagramm aktualisieren würde.

Laufzeiten im Test bisher mit start um *:03
PV_KI_Prognose done 2024-03-19 12:08:55         ==> 1'14  KI_Prognose
state          done 2024-03-19 12:07:41         ==> 4'40  dwd_load(curdate(),'none')
Laufzeit der neuen dwd_load(<step>,curdate(),'none');
4'50       full

3.062 sec  update
0.062 sec  update_yield_only

Somit könnte man jede Stunde eine Laufzeit von > 4'30 einsparen.
An der Laufzeit der KI_Prognose ändert sich hierbei jedoch nichts.

Ich teste dann mal weiter

VG    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Hallo zusammen,
es ist nun soweit und ich habe die dwd_load Procedure nun ins contrib gestellt.
Auch im WR_ctl hat sich deshalb der Aufruf geändert.
Die Procedure muss natürlich in der MySQL Datenbank ausgetauscht werden.

Kurzbeschreibung der WR_ctl Änderung
< snip >
################################################################################################################
## 2 Start der KI Prognose
## Der Reading Name und das Device werden in LogDBRep_PV_KI_Prognose im executeAfterProc eingestellt
##  "/opt/fhem/python/bin/PV_KI_Prognose.py 192.168.178.40 192.168.178.40 LogDBRep_PV_KI_Prognose WR_1_ctl Yield_fc"
##
2_KI_Prognose
{if( !([$SELF:state] eq "off")                                           ## DOIF enabled
    and
     (
      ReadingsVal("LogDBRep_PV_KI_Prognose","PV_KI_Prognose","null") eq "done"  ## Die Prognose darf nicht gerade laufen !!!
      or
      ReadingsVal("LogDBRep_PV_KI_Prognose","state","null") eq "initialized"
     )
    and
  (
    ([05:00-22:00] and [:03]                                             ## In der PV-Zeit jede Stunde aktualisieren
    )
    or [$SELF:ui_command_1] eq "2_KI_Prognose"                           ## Hier wird das uiTable select ausgewertet
  )
   ) {

  if ($hour == 5) {
    ::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load_new('full',curdate(),'none')");
  } else {
    ::CommandSet(undef, "LogDBRep_PV_KI_Prognose sqlCmd call dwd_load_new('update',curdate(),'none')");
  }

  if (AttrVal("$SELF","verbose",0) >=3) {
      Log 3, "$SELF 2_KI_Prognose : Start KI Prognose";
    }

    set_Reading("ui_command_1","---");                                   ## Hier wird das uiTable select wieder zurückgesetzt, ansonsten
                                                                         ## kann das Kommando nicht sofort wiederholt werden
  }
}
< snip >
Durch die Änderung im WR_ctl wird nun um 5 Uhr eine komplett neue dwdfull Tabelle erzeugt und danach nur noch mit update aktualisiert, was um einiges schneller geht.

VG    Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ch.eick

Moin,
das nenn ich mal einen schönen Tag. Das Lastmanagement klappt super zwischen den beiden openWB Ladepunkten.
Du darfst diesen Dateianhang nicht ansehen.
Zwei E-Autos, ein Wirlpool, Heizung und WW, sowie der Hausspeicher in der Mittagszeit.
Du darfst diesen Dateianhang nicht ansehen. 
Autarkie 96 % und Eigenvergrauch 68%
Bei der Autarkie hat die Regelungsträgheit der E-Autos 2 kWh aus dem Netz benötigt,
da ich die Speichernutzung für das E-Auto Laden gesperrt hatte, weil ich auf jedenfall den Speicher voll haben wollte.

VG   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ReneR1986

Hallo zusammen,

ich nutze derzeit einen Kostal Plenticore 8.5 mit entsprechendem KSEM und einen BYD Speicher.
Das KSEM ist mit RS-485 mit dem Plenticore verbunden. Zusätzlich hängen beide Komponenten natürlich auch im LAN.

Ich möchte nun noch einen zweiten Kostal Wechselrichter verbauen.
Die entsprechende Einrichtung hierzu habe ich bereits gefunden. Das scheint recht simpel zu sein.
Leider ist es ja aber auch so, dass die beiden Wechselrichter trotzdem nicht wirklich von einander wissen und mehr oder weniger autark von einander laufen.
Diese Integration hätte ich mir etwas schöner gewünscht.

Egal. Zu meiner Frage(n):

Derzeit lese bzw. berechne ich recht simpel folgende Werte, die ich per Modbus aus dem ersten (Master) Kostal bekomme.
Erzeugung, Einspeisung/Bezug, Hausverbrauch, Speicherkapazität
Ich glaube das hatte ich mir damals auch bei ch.eick abgeguckt  :)

Erzeugung
Erzeugung {ReadingsVal("Plenticore","Power_DC_1",0) + ReadingsVal("Plenticore","Power_DC_2",0)}
Einspeisung/Bezug
Einspeisung { ReadingsVal("Plenticore","Erzeugung",0) - ReadingsVal("Plenticore","Hausverbrauch",0)
Hausverbrauch
Hausverbrauch { ReadingsVal("Plenticore","Home_own_consumption_from_grid",0) + ReadingsVal("Plenticore","Home_own_consumption_from_PV",0) + ReadingsVal("Plenticore","Home_own_consumption_from_battery",0)  }

Wie berechne ich nun die selben Werte, wenn noch ein zweiter Wechselrichter dabei ist?
Bei der Erzeugung könnte ich mir noch vorstellen einfach die Werte vom zweiten Wechselrichter dazu zu addieren.

Beim Hausverbrauch und Einspeisung/Bezug bin ich unsicher.
Wenn der erste Wechselrichter (Master) nichts vom anderen weiß, wird dann die Erzeugung des zweiten Wechselrichters als Hausverbrauch beim ersten Wechselrichter dazugepackt? Oder ist die Erzeugung des zweiten Wechselrichters aus Sicht des ersten Wechselrichters der Netzbezug?
So nach dem Motto der erste Wechselrichters weiß ja nicht, wo der Strom überhaupt herkommt.
Genauso was passiert, wenn ich AC Überschuss Laden einstelle? Da weiß der erste Wechselrichter ja auch nicht, ob der Strom aus dem Netz kommt, oder vom zweiten Wechselrichter...

Lange Rede, kurzer Sinn.
Wie müsste ich das abbilden, damit meine Anzeige von oben wieder stimmt?

Vielen Dank!

VG






ch.eick

Hallo Renè,
Du solltest am besten auf diese Implementierung umsteigen, da das bereits alles drin ist.
Wenn Du viel Zeit investieren  möchtest, könntest Du die Formeln in Wiki bei den jeweiligen Devices raus suchen.
Alles was mit SW_ bei den readings ist, ist für den Schwarm vorgesehen.

Der KSEM mit aktueller Firmware liefert Dir den korrekten Hausverbrauch, jedoch werden dann immer noch nicht die Statistiken zusammen gefasst.

VG   Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ReneR1986

Den Wiki Beitrag hatte ich mir auch schon einmal angeschaut.
Das ist schon ziemlich komplex, dafür, dass ich eigentlich "nur" die paar Werte brauche  :)
Den Rest schaue ich mir meist tatsächlich im Portal an.

Liefert der KSEM den korrekten Hausverbrauch, der dann auch über ein Modbus Register über den Plenticore abfragbar ist?
Derzeit berechne ich den Wert ja.
Wenn ich den korrekten Hausverbrauch bekommen, egal was der zweite Wechselrichter macht, ist dann der Rest nicht wieder recht einfach?

Gesamterzeugung {ReadingsVal("Plenticore","Power_DC_1",0) + ReadingsVal("Plenticore","Power_DC_2",0) + ReadingsVal("Plenticore_2","Power_DC_1",0) + ReadingsVal("Plenticore_2","Power_DC_2",0)}
Einspeisung { ReadingsVal("Plenticore","Gesamterzeugung ",0) - ReadingsVal("Plenticore","Hausverbrauch",0)
Mein KSEM:
hw0100
Software 2.2.1

ch.eick

Zitat von: ReneR1986 am 02 Mai 2024, 12:36:02Den Wiki Beitrag hatte ich mir auch schon einmal angeschaut.
Das ist schon ziemlich komplex, dafür, dass ich eigentlich "nur" die paar Werte brauche  :)
Den Rest schaue ich mir meist tatsächlich im Portal an.
Der Appetit komt beim Essen...
ZitatLiefert der KSEM den korrekten Hausverbrauch, der dann auch über ein Modbus Register über den Plenticore abfragbar ist?
Derzeit berechne ich den Wert ja.
Der KSEM liefert den korrekten Wert, der Plenticore verwendet ihn aber "noch" nicht :-)

ZitatWenn ich den korrekten Hausverbrauch bekommen, egal was der zweite Wechselrichter macht, ist dann der Rest nicht wieder recht einfach?
Die Statistiken verteilen sich auf beide WRs, somit fehlt am WR_1 der WR_2.
Dann kommt noch die Autarkie und der Eigenverbrauch als Berechnung.
Beim Abfragen der Statistiken auch immer zuerst den WR_2 abfragen und anschließend den WR_1, der die Schwarm Werte SW_* berechnet.
ZitatMein KSEM:
hw0100
Software 2.2.1
Der sollte somit aktuell sein.

Die Berechnungen kannst Du Dir ja gerne aus den Devices raus suchen, die sind im userReadings, jedoch kann ich da nicht weiter Support bieten, das wird mir einfach zuviel und die anderen im Thread sind meist auch nur Endverbraucher.
Durch die wenigen Post in diesem Thread kann man erkennen, dass es doch ziemlich wenig Probleme gibt, die dann auch meist nur bei der Implementierung auftauchen.

VG  Christian
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ReneR1986

Hallo Christian,

ZitatDie Statistiken verteilen sich auf beide WRs, somit fehlt am WR_1 der WR_2.

Das ich mir die Werte von beiden Wechselrichtern holen muss, verstehe ich schon.
Das wäre auch kein Problem.

Ich bin aber immer noch nicht sicher, ob ich die Logik richtig verstanden habe.
Was zeigt denn der Wechselrichter 2 z.B. in der WebGui beim Hausverbrauch an?
Zeigt der überhaupt was an? Der ist ja nicht an das KSEM angeschlossen und weiß doch eigentlich gar nicht, was verbraucht wird.
Oder zeigt er nur die Einspeisung in das Netz an?

So ganz habe ich es noch nicht  ;D

ch.eick

Zitat von: ReneR1986 am 02 Mai 2024, 14:49:42Hallo Christian,

ZitatDie Statistiken verteilen sich auf beide WRs, somit fehlt am WR_1 der WR_2.

Das ich mir die Werte von beiden Wechselrichtern holen muss, verstehe ich schon.
Das wäre auch kein Problem.

Ich bin aber immer noch nicht sicher, ob ich die Logik richtig verstanden habe.
Was zeigt denn der Wechselrichter 2 z.B. in der WebGui beim Hausverbrauch an?
Zeigt der überhaupt was an? Der ist ja nicht an das KSEM angeschlossen und weiß doch eigentlich gar nicht, was verbraucht wird.
Oder zeigt er nur die Einspeisung in das Netz an?
Der WR_2 zeigt nur eingeschränkte Werte an und den Hausverbrauch, bzw. alles andere vom KSEM natürlich nicht.
Schau Dir mal mein WR_2 Device an, das hat weniger readings und auch das WR_2_API liefert eine Werte weniger oder halt 0.
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ReneR1986

Okay, danke.
Das schaue ich mir auch noch einmal an.
Ich denke wenn der zweite Wechselrichter dann in Betrieb ist, dann wird es auch noch einmal klarer.  ;)

VG

ch.eick

Zitat von: ReneR1986 am 02 Mai 2024, 16:01:29Okay, danke.
Das schaue ich mir auch noch einmal an.
Ich denke wenn der zweite Wechselrichter dann in Betrieb ist, dann wird es auch noch einmal klarer.  ;)
Du könntest jetzt schon auf meine Devices umstellen, die laufen auch mit nur einem WR.
Du kannst ja dann auch nur die readings verwenden, die Du für Deine Steuerung brauchst.
Alte Werte in der Datenbank kann man dann im Nachgang noch umbenennen, da gibt es hinweise im Wiki, wie das geht.
Und schon hätten wir einen Mitstreiter im Thread mehr ;-)
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

ReneR1986

Hallo Christian,

ich habe deine RAW Definition
https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_1.txt
mal genommen aber den DB Anteil rausgenommen.
Ich glaube ich habe alle Werte die ich im Moment benötige. Wenn dann bald der zweite WR kommt, dann schaue ich mir auch die andere Definition an.

https://svn.fhem.de/fhem/trunk/fhem/contrib/ch.eick/Photovoltaik/Wechselrichter/RAW_WR_2.txt

Ich bin gespannt, ob die Anzeige dann auch stimmt, wenn AC-Seitiges laden mit ins Spiel kommt.
Ich habe hier gesehen, dass dann u.U. der Hausverbrauch negativ angezeigt wird.

https://www.photovoltaikforum.com/thread/156800-kostal-plenticore-schwarmverschaltung/

VG

ch.eick

Durch meine Implementierung wird ja auch der Hausverbrauch korrigiert und AC Laden verwende ich ebenfalls.
Vieleicht findest Du ja auch Spaß an den anderen Devices ;-)
RPI4; Docker; CUNX; Eltako FSB61NP; SamsungTV H-Serie; Sonos; Vallox; Luxtronik; 3x FB7490; Stromzähler mit DvLIR; wunderground; Plenticore 10 mit BYD; EM410; SMAEM; Modbus TCP
Contrib: https://svn.fhem.de/trac/browser/trunk/fhem/contrib/ch.eick

trupf

Hallo Christian,

ich habe es jetzt noch mal in Angriff genommen mit folgenden Auswertungen:
LogDBRep_Statistic_previous_Month
LogDBRep_Statistic_previous_Quarter
LogDBRep_Statistic_previous_Year

Die SQL-Statements liefern jetzt endlich Daten. Allerdings sehen die Readings dann so aus:
SqlResultRow_2 2023-12-31 23:57:00|SW_Statistic_EnergyHomeFeedInGrid_Year|3155    2024-05-13 13:35:49
SqlResultRow_3 2023-12-31 23:57:00|SW_Statistic_EnergyHomeGrid_Year|4112               2024-05-13 13:35:49
SqlResultRow_4 2023-12-31 23:57:00|SW_Statistic_EnergyHomePvSum_Year|3233          2024-05-13 13:35:49
....

Sieht so aus, als ob das Splitten nicht klappt wie gewünscht. Ich denke "userExitFn  splitReading .*:.*" braucht noch einen Funktions-Eintrag in 99_myUtils.pm - aber wie muss der aussehen?