Bedeutung Datenpunkte / REST Schreibzugriff [Fenecon]

Hallo zusammen,
ich bin neu hier. E-Techniker, etwas IT Hintergrund und ideellem Interesse an EE.

Habe mich schon etwas eingelesen, komme an der Stelle aber nicht wirklich weiter:
Ich betreibe seit 9 Monaten ein Fenecon Home 10, inzwischen mit 17,6 kWh. Ich entlade den Speicher Nachts prognosebasiert um Puffer für den Mittagspeak zu bekommen [Raspi / eigenes Python Script].

Aktuell stolpere ich über folgendes: Wenn der Hausverbrauch die eingestellte Entladeleistung übersteigt, wird die Differenz aus dem Netz bezogen anstatt die Erzeugung um die Differenz zu erhöhen. Daher habe ich die Entladung jetzt Nachts laufen, wenn keine großartigen Lastspitzen auftreten. Aufgefallen ist mir das Verhalten am Wasserkocher um 6:00 als das noch anders war. Meine Steuerung ist bewusst langsam (30s um den Watchdog am Leben zu halten), da ich zwecks der internen Regler nicht agieren möchte .

Ich hatte dazu das Register “ess0/SetActivePowerGreaterOrEquals” im Blick, aufgrund des “GreaterOr”.

Beim Verhalten konnte ich aber letztendlich keinen Unterschied feststellen, und finde auch keine Details in der Doku was der Unterschied ist, welcher drei gesonderte Register sinnvoll macht.

  • ess0/SetActivePowerLessOrEquals
  • ess0/SetActivePowerEquals
  • ess0/SetActivePowerGreaterOrEquals

Meine Ziele sind [Reihenfolge=Priorität]:

  1. Sicherstellung des Eigenbedarfs, möglichst wenig Fremdbezug
  2. den Wirkungsgrad des Wechselrichters zu optimieren (ist bei den 200W Grundlast wohl eher schlecht [stromspeicher-inspektion-2024-teillastwirkungsgrade]
  3. PV Überschuss sinnvoll einzuspeisen (abends/morgens während der Hochlastzeiten

Vertraglich ist das egal, die Anlage läuft noch ein paar Jahre auf EEG2011, und der Zähler merkt nicht ob die :sun_with_face: scheint während ich einspeise :smiley: .
Eine Erhöhung des Eigenverbrauchs mittels WP ist in Planung, es wird aber denke ich auch langfristig Zeiten geben, bei denen ich sinnvoll entladen will und kann [wobei die Nachtstunden gar nicht sooo ungünstig sind den Anteil zu erhöhen [peakpick.de].

BTW: Ich habe auch mal probiert quick and dirty den WR Wirkungsgrad zu ermitteln um mal ein Gefühl für mein Gerät zu bekommen.
Alle Werte die ich finden konnte die sich mit DC/AC auf “ActualPower” beziehen, zeigen exakt die gleiche Leistung. Irgendwie messtechnisch auf den ersten Blick ein System ohne Verluste :hugs:?
Der Energievergleich über die Register zeigt in meinen Augen realistischer zwischen 82% und 87% Gesamtwirkungsgrad zwischen PV erzeugt und AC abgegeben aus (Notstrom inkl.).
Idee war eigentlich mal die ActualPower Werte mitzuloggen, über die Energiewerte braucht es dann ja halbwegs statische Betriebsbedinungen und etwas mehr Mathematik :wink:. Ob das überhaupt in sinnvollen Zeiträumen bei der Leistung was bringt müsste sich auch erst noch heraussstellen - ist aber auch realisierbar.

Nachdem mich der Support von Fenecon an dieses Forum verwiesen hat, freue ich mich hier etwas Input zu bekommen. Vielleicht hat ja sogar jemand die Messwerte vom Home10WR bzgl. Wirkungsgraden analog der Kurve aus Berlin von 71% auf >85% wäre ja schon ein Anfang der sich leicht realisieren ließe - low hanging :red_apple: :pear: :cherries:
Vielen Dank im Voraus!

LG
//hufnala

Hallo hufnala, willkommen im OpenEMS Community Forum!

Wir arbeiten selbst auch (im Rahmen der neuer regulatorischen Möglichkeiten mit Direktvermarktung und Pauschaloption) an einer “Entladung ins Netz”-Funktion. Siehe
Feature Request: TimeOfUse controller: Discharge to grid - #16 by yvesilknievil und mein Video dazu mit Felix Goldbach: https://www.youtube.com/watch?v=-pdx44EZAuU. Es wäre toll, dich da an Board zu haben, so dass nicht jeder sein eigenes Süppchen kocht (bzw. Script schreibt). Ich weiß schon: mit Java ist das auf den ersten Blick etwas komplizierter als in Python :wink:


Die Register für Equals, LessOrEquals und GreaterOrEquals gibt es, weil intern die Leistungsverteilung mit einem linearen Gleichungssystem berechnet wird. Diese Funktion verwenden wir vor allem bei unseren größeren Cluster- bzw. Industrial-Systemen.

Theoretisch müsstest du mit dem SetActivePowerGreaterOrEquals genau das erreichen, was du möchtest, d.h. die Leistung limitieren und - wenn Verbrauch größer als Erzeugung ist - mit mehr Leistung entladen. In der Praxis könnte es sein, dass das manchmal mit dem SMART-Mode nicht funktioniert. Hintergrund ist: wir versuchen dass Wechselrichter immer dann in seinem schnellen internen Modus läuft, wenn am Netzanschlusspunkt auf Null ausgeregelt werden soll. Nur wenn wir übersteuern wollen, geben wir aktiv die Set-Points vor.

Vermutlich wäre es am besten, wenn du auch nur dann aktiv übersteuerst, wenn es notwendig ist. Und in allen anderen Zeiten nicht. Du kannst auch als Set-Point null vorgeben um die Übersteuerung vor Ablauf des Watchdogs auszuschalten.


EDIT: Könntest du dein Script mit der Community teilen?

Gruß,
Stefan

Hallo Stefan,

vielen Dank für die Ansatzpunkte, da kann ich mal drauf schauen. Das script teile ich gerne, dauert aber bis Mittwoch oder so. Die Entladefunktion wäre super, das Video schaue ich mir gerne mal an bzw. Lese mich ein.
An Java werde ich mich nicht beteiligen, das kriege ich zeitlich nicht hin, a/b Tester in der freien Wildbahn kann ich mir aber gut vorstellen.

Die Funktion macht bei mir sicher nicht das beschriebene, schaue ich mir nochmal an.
LG und noch schöne Pfingsten,
Lars

Hallo Stefan,
zum SMART Mode und den SetPoints über REST/JSON bin ich leider nicht fündig geworden. Mein Script habe ich hier abgelegt - nicht zu viel erwarten, sehr Hobbyartig :slight_smile:

Grund für die beiden Vorhersagen ist, dass ForecastSolar doch deutliche Abweichungen hat, die zu Fehlentscheidungen geführt haben (deutlich geringere Ertrag, so dass ich an schlechten Tagen mit leeren Speicher da saß). Korrelationen habe ich auch gemacht, optimal ist da nichts.

Ich kann den Datenpunkt für die Entladung jederzeit einfach austauschen, und wenn Interesse besteht auch die Systemnummer mal durchgeben falls Ihr logs braucht/wollt.
LG Lars

Ich klinke mich ganz kurz ein - kannst du das eventuell nicht als .zip auf github laden, so könnten wir gemeinsam den Code eventuell sogar miteinander verbessern ? :slight_smile:

Ich bin verwirrt:

Das liegt als zip auf meinem Github. Was soll ich machen? “Nicht” als ZIP - da fehlt mir die Github Erfahrung :smiley:

Der Input wird überschaubar sein, Verbesserungen wird es viele geben - Hobbyprojekt :wink:

Es wäre einfacher für uns mitzuarbeiten, wenn du die zip entpackt hochladen würdest (als einzelne Dateien im Stammverzeichnis) dann könnten wir gemeinsam mittels PRs an der Weiterentwicklung arbeiten ! :slight_smile:

OK, das kann ich machen, kein Problem.
Weiterentwicklung weiß ich nicht so recht, was Ihr Euch da vorstellt. Es ging ja nur um die REST Funktion, die ich über TCP aufrufe, die nicht das macht was ich erwarte. Der Teil is quasi der Vorschlag aus der Doku zum Pythonaufruf.
Dauert jetzt aber bis morgen.
Gute Nacht.

1 Like

Script und zugehöriges Ini-File sind hochgeladen.

LG Lars

2 Likes

Hallo @stefan.feilmeier,
gibt es irgendwelche Anmerkungen zur Nutzung der Befehle im Script um den Eigenverbrauch bei der Entladung besser zu berücksichtigen?
Wie beschrieben würde ich das lieber Systemseiteig machen als über das script “langsam” zu reagieren.

So etwas habe ich gerade selber hier programmiert in den letzten Tagen.

Ein Programm fragt alle 20 Sekunden die Werte ab für Ladestand und Verbrauch und setzt dann SetActivePowerGreaterOrEquals mit einen höheren Wert als wir verbrauchen.
Aktuell exportieren wir da ca 200W dauerhaft ins Netz.

Das ganze läuft auf einem alten Raspberry Pi im Hintergrund.

Ich habe das noch mit dem Wetter gekoppelt. Also bei > 8h Sonne am nächsten Tag und >50% Ladestand, senden wir 200 W * Ladestand% Richtung Netz. Je nach Zahl der Sonnenstunden gibt es dann weniger oder mehr.

Eigentlich wollte ich ja nur die Zielvorgabe für die Berechnung von 0 auf 200 W ändern. Aber per Nachregelung von SetActivePowerGreaterOrEquals geht es ebenfalls.

Ziel ist nach etwas zu entladen und damit effektiv zu verhindern, dass wir Strom kaufen, falls doch mal ein paar Watt zu wenig aus der Batterie kommen.

Wenn ihr das einbauen könntet, wäre schön. Vielleicht könnte die FEMS Software mal generell anzeigen, was für eine Wetterauskunft die hat? Und dann eben ein dauerhaftes automatisches Einspeisen über Nacht erlauben?

PS: Bei uns hängt noch die Wärmepumpe zwischen Hausnetz und öffentlichem Netz. die 200W oben gehen also noch an der Heizung vorbei und nicht unbedingt nach draußen.

1 Like

Hi, kling interessant. Kannst Du Dein Script teilen?
Ich werde meines aktuell nicht wirklich umstellen, maximal erweitern, dass ich für mir für einen kurzen Zeitraum den Eigenverbrauch hole, und dann erhöhe. aber bestimmg gibt es ein paar interessante Ideen zu sehen.
Meines findest Du in o.g. github, die Ansätze sind ähnlich vermute ich :-). Nachts zu entladen ist auch nicht das große Thema, da ist der EE Anteil meist <60%, und die 2KW Entladeleistung sind da ein Tropfen.

Interessant wäre noch welchen Wetterdienst Du nutzt. Aktuell ist es kein Thema, aber die Korrelation ist sagen wir mal “nicht gut”. Ich habe mir im Frühjahr 1-2 mal den Speicher leer gefahren weil nur Bruchteile dessen am nächsten Tag kamen, die angesagt waren. Seitdem habe ich da ziemlich viel Sicherheitsmarge im System. :wink:

Gedanken machen kannst Du dir ggf. noch über den Wirkungsgrad des Wechselrichters. +200W ist sicher nicht schlecht, aber höher ist besser. Wo das beim Fenecon/Goodwee anfängt habe ich noch nicht rausbekommen. Da sind anscheinend schnell 5-10 Wirkungsgrad versteckt. https://solar.htw-berlin.de/studien/stromspeicher-inspektion-2025/ und https://solar.htw-berlin.de/wp-content/uploads/htw-stromspeicher-inspektion-2025-bat2ac-wirkungsgrade.jpg

Ist kein Script. Ist eine App mit Xojo geworden. Jeder hat ja seine Lieblingsprogrammiersprache :slight_smile:

Wetterdienst ist die Wetter-API von wetter.com und die ist bis 100 Anfragen pro Monat gratis.
Und da schaue ich nur auf die Sonnenstunden:

If SonnenStunden >= 10 Then
  Aktiv = True
  Log "Aktiv geschaltet"
  MinLadeStand = 30
elseIf SonnenStunden >= 8 Then
  Aktiv = True
  Log "Aktiv geschaltet"
  MinLadeStand = 40
elseIf SonnenStunden >= 6 Then
  Aktiv = True
  Log "Aktiv geschaltet"
  MinLadeStand = 50
ElseIf SonnenStunden >= 4 Then
  Aktiv = True
  Log "Aktiv geschaltet"
  MinLadeStand = 60
Else
  Log "deaktiviert."
End If

Die 200W ist ja nur eine ausgedachte Zahl. Aktuell nehme ich 200W * Prozent Ladestand. Ich will halt nicht auf Null ausgleichen mit der Batterie (+Solar), sondern etwas mehr.

If aktiv and LadeStand > MinLadeStand and SollDelta > 0 Then

  Var s As Integer = AktuellerVerbrauch + SollDelta * LadeStand / 100
  Var j As New JSONItem
  j.Value("value") = s
  
  'log "set output to "+s.ToString+"..."
  counter = 8
  SendQuery "ess0/SetActivePowerGreaterOrEquals", j.ToString

Wenn man das im FEMS per Häkchen setzen kann, dass man das automatisch bekäme, wäre ich froh und bräuchte es nicht selber zu machen.

Ah super, danke Dir.
Letztendlich bin ich dann fast beim gleichen raus gekommen - Sonnenstunden vom DWD passen noch am besten ;-), die sind ganz frei erhältlich, nur etwas umständlicher.
App soll mir auch recht sein :wink:

Ich wollte noch den Graphen zeigen.Wie man sieht, sorgt das kleine Programm auf dem Raspberry Pi dafür, dass wir immer 50 bis 200 Watt mehr entladen als nötig, so dass wir kontinuierlich ins Netz einspeisen. Bei uns geht das an der Wärmepumpe vorbei (Messkonzept 8). Außerdem sorgt das dafür, dass wir nicht immer wieder kleine Mengen aus dem Netz nehmen und wirklich näher an Strombezug 0 kommen.

@stefan.feilmeier Es wäre toll, wenn man bei der FEMS Software direkt etwas wie 100 Watt als Ziel für die Kalkulation angeben kann. Default steht ja das Target auf 0.

Ich denke, wenn du den Support anrufst und fragst, dann machen die das gerne für dich. Bei anderen Systemen funktioniert die 0-Ausregelung eben sehr sehr gut.

Welcher Wert ist gemeint?

targetGridSetpoint in io.openems.edge.controller.ess.balancing?

Hallo zusammen, ich habe gedacht ich mach ein Reply hier, da es passend it (denke ich) wenn nicht kann ich es aus separat posten.

Ich habe ein Fenecon 10 Home mit dynamischen Strom Tarif (Awattar als anbieten) und der App. Der Fahrplan funktioniert eigentlich schon ganz gut. Ich möchte mit aber die Rest App schreibend kaufen, um von Hand eingreifen zu können wenn es uns sinnvoll erscheint, der Preis niedrig ist und ich “mehr” nachladen möchten als der Fahrplan.

Die API doku von der FEMS (Fenecon doku) habe ich durgelesen. Aber sie ist an manchen Stellen mir nicht präzise genug. Wie ich mit einer REST API umzugehen habe, ist nicht das Problem (das Kann ich programmieren) , aber ich habe Fragen zur Parametrierung, die mir vielleicht jemand erklären könnte.

Es gibt die 6 Parameter, wobei ich die 3 Blindleistungsvorgaben nicht benutzen kann wenn ich richtig gelesen habe.

  • SetActivePowerEquals Watt [W]
  • SetReactivePowerEquals VoltAmpere Reaktiv [var]
  • SetActivePowerLessOrEquals Watt [W]
  • SetReactivePowerLessOrEquals VoltAmpere Reaktiv [var]
  • SetActivePowerGreaterOrEquals Watt [W]
  • SetReactivePowerGreaterOrEquals VoltAmpere Reaktiv [var]
  1. Um die Batterie aus dem Netz zu laden, muss ich mit “negativen” Werten arbeiten, Wenn ich das richtig sehe? (SetActivePowerEquals = -5000 z.B.)
  2. Aber muss man was etwas beachten, falls zur gleichen Zeit, dann doch noch PV ertrag kommt
  3. Muss man wenn man manuell schreibend eingreift, vorher bei dem Dynamischen Stromtarif “abschalten”
  4. Muss man etwas beachten mir der Netzdienlichen Beladung, wenn man hier eingreift
  5. Kann man den Timeout aus via API setzten. Dazu habe ich nichts gefunden. Wäre schade wenn ich den nur in einer GUI setzen könnte.

Es wäre mir noch wichtig zu verstehen was passiert wenn ich Beispiel den Wert SetReactivePowerEquals VoltAmpere auf -5000 setze und auf einmal 4000 watt Solarertrag kommen, bei sagen wir 2000 Watt Momentanverbrauch weil ich grad am Kochen bin. Ist das System so aufgestellt und nimmt dann die 4000watt von den PV und lädt die zusätzlichen 1000 aus dem Netz, bzw. 3000 Watt zusätzlich aus dem netz mit dem Momentan Verbrauch. Oder nimmt es die 5000 aus dem Netz und speist die 4000 ein, bzw. 4000 - 2000 für den Momentan Verbrauch…

Was passiert mit dem Fahrplan für das netzdienliche laden, wenn ich eingreife. Was passiert mit dem Fahrplan für den Dynamischen Stromtarif. vermutlich nichts, oder wird der einfach mit der neuen Situation in den nächsten 15Min wieder neu von der App berechnet, bzw. wenn der Timeout vorbei ist?

Fragen über Fragen über das Verhalten die ich der API-Dokumentation leider nicht entnehmen kann. Gehört wahrscheinlich auch nicht eine API-Dokumentation, aber in eine App Dokumentation die sich mit so nicht ganz erschliesst

Natürlich könnte man sagen: " Probier’s aus" . Aber ich dachte vielleicht weiss das jemand hier oder kann mich in die richtige Richtung schubsen.

Das Ziel ist es das ganze als Plugin im OpenHAB zu steuern

Vielen Dank für eine Antwort

bkumio

Servus,
die Fragen sind spannend, leider habe ich auch wenig zu der Funktion der Datenpunkte gefunden, und die Antworten sowohl hier als auch bei Fenecon sind eher sparsam. Ich werde mich aus fachlichen Gründen weder wie vorgeschlagen an der Entwicklung beteiligen, noch einem Verstehen des Codes arbeiten. Das übersteigt mein Wissen, meine Kapazität und meinen Elan a.d. Stelle deutlich.

Beim Entladen (mein erster Thread) ist es so, dass wenn ich die Entladeleistung vorgebe (Ziel den Speicher Nachts/Morgens zu entladen), Mehrverbrauch ggf. aus dem Netz zugekauft wird, und nicht die entsprechende Entladung erhöht wurde. Ich habe das jetzt mir in Script hinterlegt, die Leistung ggf. temporär zu erhöhen. Die Entladung steuere ich mit positivem Vorzeichen!

Ich habe keinen Weg gefunden, den Timeout zu verändern.Aktuell habe ich den Zyklus auf 15s um auf der sicheren Seite zu sein und ungewollten Zukauf schnell zu erkennen. Vorher waren es 30s (1/2 Timeout) - Nach Busregeln müsste es eigentlich <0.5 sein, um eine ausgefallene/verzögerte Übertragung zu eleminieren :wink:

Alles andere wirst Du ggf. ausprobieren müssen, oder (s.o.) in den Code einsteigen fürchte ich.

LG hufnala