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.
64 stars 25 forks source link

Feature Request: zweiter Inverter #6

Open Rayn0r opened 1 year ago

Rayn0r commented 1 year ago

In Ticket #4 fragte @karrenbauer

wie bekomme ich Daten von WR2?

Hier die Antwort:

Die Daten des zweiten Inverters stehen schon in der Variable r drin. Schau mal in die WebAPI von OpenDTU. Hier siehst Du die Struktur vom JSON. Die Inverter werden dort im "Array" Inverters[] nacheinander aufgeführt. Du kannst also die Werte des zweiten Inverters auslesen, indem Du bei ['inverters'][0] statt der 0 eine 1 einträgst.

        reachable_2   = r['inverters'][1]['reachable'] # ist DTU erreichbar ?
        producing_2   = int(r['inverters'][1]['producing']) # produziert der Wechselrichter etwas ?
        altes_limit_2 = int(r['inverters'][1]['limit_absolute']) # wo war das alte Limit gesetzt
        power_dc _2   = r['inverters'][1]['AC']['0']['Power DC']['v']  # Lieferung DC vom Panel
        power_2      = r['inverters'][1]['AC']['0']['Power']['v'] # Abgabe BKW AC in **Watt**

Jetzt könnte zum Problem werden, wenn OpenDTU die Inverter nicht immer in der gleichen Reihenfolge liefert. Wenn Du die Inverter richtig benannt hast, sollte es allerdings kein Problem sein. Den Namen sollte man so auslesen können:

        name_2 = r['inverters'][1]['name'] # Wie ist der Name?
karrenbauer commented 1 year ago

Vielen Dank! genau das habe ich gesucht!!

Rayn0r commented 1 year ago

Mittels:

    for inverter in r['inverters']:
        print(f"Name: {inverter['name']}")
        print(f"Reachable: {inverter['reachable']}\n")

sollte Dir das Script die Name der Inverter und deren Verfügbarkeit auch ausgeben.

Xenon-s commented 1 year ago

Ich habe es auch mit zwei Invertern am laufen, jedoch limitiert er mit den Hm600 immer auf 50%, den HM400 packt er gar nicht erst an. Heißt: ich bekomme maximal 700W anstatt 1000W. Ich bin nicht so sattelfest in python (komme aus der Javascript Welt). Ist überhaupt schon implementiert, dass zwei Inverter geregelt werden können? Die Inverter sind in Reihe geschaltet, eventuell kommt das Skript damit durcheinander?

Edit: ich Depp, da steht ja im Skript "maximale Leistung 300W"... Ich glaube es hat sich bereits erledigt 😅

Rayn0r commented 1 year ago

@Xenon-s Nein, die 300W im Script sind nicht die Ursache (also nur bedingt).

Für das Setzen des Limits muss man die Seriennummer des Inverters mitgeben, für welchen man das Limit anpassen will. Siehe Zeile 62: https://github.com/Selbstbau-PV/Selbstbau-PV-Hoymiles-nulleinspeisung-mit-OpenDTU-und-Shelly3EM/blob/f22b135152474c3655e9937ae26617f8cfbb1979/nulleinspeisung.py#L62 Die Erklärung gibts hier unter "Example 2: change power limit". Wenn Du also die Leistung des 2. Inverters anpassen möchtest, dann benötigst Du im Skript eine 2. Variable für die Seriennummer des 2. Geräts. Dann muss der Request ab Zeile 59 für den 2. Inverters dupliziert werden.

...und mit Sicherheit muss noch etwas mehr angepasst werden, weil ja auch hinterlegt werden muss welcher Inverter welche maximale Leistung bringen darf/kann.

Xenon-s commented 1 year ago

Da der zweite eh nur 400W kann, lasse ich den unangetastet und Decke damit dann alles ab. Sollte mehr benötigt werden, soll die 600W Anlage dazuschalten. Das ist ja mit dem Skript hier problemlos möglich

karrenbauer commented 1 year ago

ich habe mittlerweile 4 HM-Wechselrichter und 2x DTU laufen, ich benutze für jeden WR ein separates Skript, das geht auch. Geht sicher alles auch in einem Skript, dazu fehlen mir aber wohl noch die Programmierkenntnisse...

Xenon-s commented 1 year ago

Habe ich auch gemacht. Nach nicht mal einer Minute waren die Wechselrichter nicht mehr erreichbar

StLore commented 1 year ago

Hi, ich habe 2 HM bei mir im Einsatz und hatte ähnliche Effekte. 5 Sekunden für "wait" ist zu wenig. Mit 10-20 Sekunden strapaziert man die Kommunikation nicht so sehr. Mit 20 Sekunden habe ich keinerlei Unterbrechungen mehr.

Xenon-s commented 1 year ago

Danke dir für die Antwort. Sowas hatte ich mir auch gedacht. Da ich aber iobroker als Smarthome System im Einsatz habe, werde ich mir da was in Javascript bauen. Das Python Skript funktioniert sehr gut, aber dafür müsste ich einen extra Container aufsetzen. Aber die Idee dahinter ist gut. Würde ich mich mit Python gut auskennen, würde ich es auf X-beliebige Inverter erweitern. Aber da findet sich bestimmt jemand :)

karrenbauer commented 1 year ago

ich hatte "wait" auch auf 20 Sekunden gesetzt, dann funktioniert es...