Selbstbau-PV / Selbstbau-PV-Hoymiles-nulleinspeisung-mit-OpenDTU-und-Shelly3EM

Ein Python-Skript, das den aktuellen Hausverbrauch aus einem Shelly 3EM ausliest, die Nulleinspeisung berechnet und die Ausgangsleistung eines Hoymiles-Wechselrichters mit Hilfe der OpenDTU entsprechend anpasst. Somit wird kein unnötiger Strom ins Betreibernetz abgegeben.
61 stars 24 forks source link

Überlegungen zur Berechnung des zu setzenden Power Limits #5

Closed Rayn0r closed 3 months ago

Rayn0r commented 1 year ago

Ich hab mir den Code mal angesehen und habe ein paar Verständnisfragen und nen Vorschlag wie man das Ganze vereinfachen könnte. Bitte lasst mich wissen, was ihr dazu meint.

Was in Zeile 52 passieren soll ist mir nicht ganz klar.

Ich denke, dass man alles zwischen Zeile 51 und 64 durch Folgendes ersetzen kann.

aktuellerverbauch = grid_sum + power

if aktuellerverbauch >= maximum_wr:
    setpoint = maximum_wr
    print(f"setpoint auf Maximum ({maximum_wr}W) gesetzt.")
else:
    setpoint = aktuellerverbauch
    print(f"setpoint auf {aktuellerverbauch}W gesetzt.")
karrenbauer commented 1 year ago

..ja, macht irgendwie mehr Sinn, bin aber leider in Python nur Anfänger....bin schon froh, wenn ich ein Script zum laufen bekomme... Ich hab mal mein Script angehängt mit deiner Änderung, scheint besser zu laufen. Vorher hat sich das Limit bis max_WR hochgeschaukelt wenn Bezug > power war und dann kam wieder Setpoint=0, Werte unter 10 Watt werden von der DTU nicht akzeptiert.

nulleinspeisung.zip

Rayn0r commented 1 year ago

Wenn die DTU keine Werte unter 10W akzeptiert, dann sollte das Ganze besser so aussehen:

aktuellerverbauch = grid_sum + power

if aktuellerverbauch >= maximum_wr:
    setpoint = maximum_wr
    print(f"setpoint auf Maximum ({maximum_wr}W) gesetzt.")
else:
    if aktuellerverbauch < 10: 
        aktuellerverbauch = 10
    setpoint = aktuellerverbauch
    print(f"setpoint auf {aktuellerverbauch}W gesetzt.")
karrenbauer commented 1 year ago

Hallo, läuft tagsüber gut, aber Abends/Nachts (wenn der WR aus ist) hängt sich mein Skript nach kurzer Zeit irgendwie auf und bleibt "stehen", reagiert nicht mehr, auch kein "strg-c" zum abbrechen, den Skript musste ich heute morgen neu starten ....

Rayn0r commented 1 year ago

Kannst Du mir sagen, welche Zeilen das Script als Letztes ausgegeben hat, bevor es sich aufgehängt hat?

karrenbauer commented 1 year ago

musste warten bis es dunkel wird, hatte den Script noch etwas abgeändert, bleibt nicht hängen, aber: sollte ab Zeile 79 bei:

if setpoint == 0: setpoint = grid_sum
if not reachable: setpoint = maximum_wr , print("_ WR1 not reachable ______ ",setpoint)

nicht maximum_wr ausgegeben werden? Code im Anhang... 2023 04 26 21 26

nulleinspeisung_1.272.zip

karrenbauer commented 1 year ago

hab´s jetzt irgendwie hin bekommen, warum weiss ich aber auch nicht so genau, Python iss irgendwie "empfindlich" ... Läuft auch die Nacht durch... Jetzt muss es nur noch mit 3 WR arbeiten....

Selbstbau-PV commented 1 year ago

Danke für die Hinweise. Die Funktionsweise wurde vollständig übernommen von https://gitlab.com/p3605/hoymiles-tarnkappe Wenn du das Limit vom aktuellen Verbrauch, statt dem letzten Limit abhängig machen möchtest, kannst du in #L43 altes_limit durch power ersetzen. Dann werden Einspeisungen eher vermieden, als dass sie nur "abgefedert" werden. Auch kann man die 5 W als Toleranz justieren.

Das Skript wurde mal ein wenig aufgeräumt und übersichtlicher gestaltet. Ein paar potentielle Gründe für Instabilität wurden auch eliminiert. Versuch es gerne mal mit der neuesten Version. Vielleicht ist es auch vorteilhaft, es wie im Wiki beschrieben als Systemd-Service zu installieren: https://selbstbau-pv.de/wissensbasis/nulleinspeisung-hoymiles-hm-1500-mit-opendtu-python-steuerung/

LG, SBPV

Rayn0r commented 1 year ago

@Selbstbau-PV Zeile 41 macht mir noch Sorgen. Die beiden Werte dort könnten nicht definiert sein, wenn zum Start des Scripts einer oder beide Geräte nicht erreichbar sind. Das Verschieben hinter if reachable: würde es sicher machen. Dann ist if reachable: keine ausreichende Bedingung mehr um weiterzumachen, weil die beiden Abfragen jetzt in getrennten try/except Blöcken stehen. Im except beider könnte aber ein reachable = false weiterhelfen.

Was denkst Du?

Rayn0r commented 1 year ago

Sollte man noch den Fall betrachten, bei dem der Shelly nicht erreichbar ist, die OpenDTU aber dennoch? Ist es dann sinnvoll die Leistungsabgabe auf ein vorher festgelegtes Maximum zu begrenzen?