Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Lastabhängige Stuerung der Solarproduktion #272

Open
Lucifor1976 opened this issue Oct 26, 2022 · 55 comments
Open

Lastabhängige Stuerung der Solarproduktion #272

Lucifor1976 opened this issue Oct 26, 2022 · 55 comments
Labels
enhancement New feature or request

Comments

@Lucifor1976
Copy link

Is your feature request related to a problem? Please describe.

Wäre es möglich anhand eines Datenpunktes per MQTT den aktuellen Verbrauch an Open DTU zu geben und anhand dessen das Leistungslimit des Inverterst durch den ESC regeln zu lassen?

Describe the solution you'd like

Der ESP entscheidet anhand eines Datenpunktes die Leistung des Wechselrichters um eine Nulleinspeisung zu erreichen.

Describe alternatives you've considered

No response

Additional context

No response

@Lucifor1976 Lucifor1976 added the enhancement New feature or request label Oct 26, 2022
@tbnobody
Copy link
Owner

Ich sträube mich noch etwas dagegen, so einen Algorithmus einzubauen. Hintergrund ist, dass dieser ja ggf. für Solar Panels anders sein müsste als wenn Akkus o.Ä. am Inverter hängen. Jeden einzelnen Use-Case kann man hier nicht berücksichtigen. Ein MQTT Broker muss aber sowieso laufen. Daher wäre es ja auch möglich dort ein einfaches Python Script (o.Ä.) zu betreiben das die Regelung übernimmt.

@Lucifor1976
Copy link
Author

Das ist eine Idee.. Die werde ich mal verfolgen. Die Frage die sich mri stellt ist dann ist der ESP "schnell" genug das das auch klappt?
Ich habe das "Problem" das ich 4 Panels a 410 Watt am HM1500 habe. die Spitzenleistung im Sommer ist dann ca bei 1600Watt, bei 850 Watt Verbrauch im Haus. Es wäre toll denn man dann die Leistung zumindest soweit drosseln kann das nicht permanent 800+ Watt ausgespeist werden...

Wenn das ganze per Blockly auf ioBroker realisierbar ist hänge ich mich da mal rein.. (zu Python bin ich nicht in der Lage) :)

@tbnobody
Copy link
Owner

Es gibt Topics an die man die Limits schicken kann:

| [serial]/cmd/limit_persistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_persistent_absolute | W | Set the inverter limit as a absolute value. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |
| [serial]/cmd/limit_nonpersistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_nonpersistent_absolute | W | Set the inverter limit as a absolute value. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |

Für deinen Einsatzzweck wären dann die nonpersistent Topics interessant. Aber vorsicht, wenn man bei einem HM-1500 z.B. ein Limit von 50% einstellt, werden 375W auf Kanal 1&2 sowie 375W auf Kanal 3&4 limitiert. (Dies ist im Inverter so implementiert und kann nicht geändert werden)
D.h. aber auch, wenn z.B. 2 Panels auf der Nordseite (die z.B. nur 50W liefern) sind und 2 Panels auf der Südseite (die 600W liefern könnten) hättest du in Summe 50W + 375W.... (also unter der Annahme eines Limits auf 50%)
Solche Unzulänglichkeiten muss man ggf. beim Errechnen des Limits berücksichtigen.

@Leviathan09
Copy link

Leviathan09 commented Oct 26, 2022

Wenn das ganze per Blockly auf ioBroker realisierbar ist hänge ich mich da mal rein.. (zu Python bin ich nicht in der Lage) :)

Was den ioBroker und Blockly angeht kann ich dir schon mal sagen das es geht, ich hatte die MQTT Topics die unterstützt werden schon mal durch probiert.

Ich habe jedoch das Problem das es an dem "schnell" genug etwas habert, teilweise wenn ich Werte einstelle dauert es 5-10min bis diese auch übernommen werden. Ein anderes mal geht es innerhalb einer Minute. Ich arbeite immer mit "nonpersitent_relative"

Weiß aber auch nicht ob so ein kleiner Wechselrichter das so präzise Regeln kann wie ein großer Hybrid.

@MrReSc
Copy link
Contributor

MrReSc commented Oct 26, 2022

Für deinen Einsatzzweck wären dann die nonpersistent Topics interessant. Aber vorsicht, wenn man bei einem HM-1500 z.B. ein Limit von 50% einstellt, werden 375W auf Kanal 1&2 sowie 375W auf Kanal 3&4 limitiert. (Dies ist im Inverter so implementiert und kann nicht geändert werden)
D.h. aber auch, wenn z.B. 2 Panels auf der Nordseite (die z.B. nur 50W liefern) sind und 2 Panels auf der Südseite (die 600W liefern könnten) hättest du in Summe 50W + 375W.... (also unter der Annahme eines Limits auf 50%)
Solche Unzulänglichkeiten muss man ggf. beim Errechnen des Limits berücksichtigen.

Wäre es nicht möglich das Limit automatisch abhängig der Verschattungssituation von Kanal 1&2 und Kanal 3&4 anzupassen?
--> Benutzer setzt Limit auf 600 W
Wenn die Gesamtleistung > 600 W ist, wird das Limit auf 600 W gesetzt.
Wenn die Gesamtleistung < 600W dann könnte man das Limit erhöhen. Wenn dann die Gesamtleistung steigt, könnte man das Limit weiter schrittweise erhöhen.

@Lucifor1976
Copy link
Author

Bei mir gucken die 4 Panele starr 30° Aufgestellt nach süden, das wäre also kein Problem. Mir ist "nur" wichtig nicht zu viel auszuspeisen, da ich sonst die Auspeisung per Zählerfehler nicht mehr erklären kann :)
In Zukunft soll diese Anlage auch an unser großes E3DC Kraftwerk angeschlossen werden (Wir haben leider zwei Hausanschlüsse.)
Ich werd mir das ansehen, sobald die ESP´s und NRF´s gekommen sind. (Hoffentlich Freitag)

@Leviathan09
Copy link

Es gibt Topics an die man die Limits schicken kann:

| [serial]/cmd/limit_persistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_persistent_absolute | W | Set the inverter limit as a absolute value. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |
| [serial]/cmd/limit_nonpersistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_nonpersistent_absolute | W | Set the inverter limit as a absolute value. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |

@tbnobody ist es evtl. möglich das openDTU beim Verbinden mit dem MQTT Broker die cmd Topics mit published?
Ich sehe bei mir im ioBroker Log zwar das der ESP ein subscribe macht aber selbst published er die Topics nicht, dadurch tauchen diese auch nicht im ioBroker auf um Sie zu nutzen.
Manuelles anlegen ist nur über umwege möglich und verursacht zumindest bei mir Fehler wodurch der ESP dann die Eingegebenen Werte nicht an nimmt.

@tbnobody
Copy link
Owner

Das entspricht so nicht der Spezifikation von MQTT. Es können dort keine Topics "angelegt" werden. Entweder wird etwas published oder eben nicht. Selbst wenn OpenDTU auf cmd etwas publishen würde und ioBroker erst danach gestartet würde, würde es nichts sehen (ok, außer natürlich retained values). Wenn der Adapter hier Fehler gibt sollte dieses in ioBroker behoben werden.

@MIC1981
Copy link

MIC1981 commented Oct 28, 2022

Wenn das ganze per Blockly auf ioBroker realisierbar ist hänge ich mich da mal rein.. (zu Python bin ich nicht in der Lage) :)

Was den ioBroker und Blockly angeht kann ich dir schon mal sagen das es geht, ich hatte die MQTT Topics die unterstützt werden schon mal durch probiert.

Ich habe jedoch das Problem das es an dem "schnell" genug etwas habert, teilweise wenn ich Werte einstelle dauert es 5-10min bis diese auch übernommen werden. Ein anderes mal geht es innerhalb einer Minute. Ich arbeite immer mit "nonpersitent_relative"

Weiß aber auch nicht ob so ein kleiner Wechselrichter das so präzise Regeln kann wie ein großer Hybrid.

Hättest du mal ein Blockly-Beispiel parat? Ich bekomme es über MQTT gar nicht erst angelegt.

@Lucifor1976
Copy link
Author

Es gibt Topics an die man die Limits schicken kann:

| [serial]/cmd/limit_persistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_persistent_absolute | W | Set the inverter limit as a absolute value. The value will survive the night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |
| [serial]/cmd/limit_nonpersistent_relative | W | Set the inverter limit as a percentage of total production capability. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic immediatly. | % |
| [serial]/cmd/limit_nonpersistent_absolute | W | Set the inverter limit as a absolute value. The value will reset to the last persistent value at night without power. The updated value will show up in the web GUI and limit_relative topic after around 4 minutes. | Watt (W) |

Für deinen Einsatzzweck wären dann die nonpersistent Topics interessant. Aber vorsicht, wenn man bei einem HM-1500 z.B. ein Limit von 50% einstellt, werden 375W auf Kanal 1&2 sowie 375W auf Kanal 3&4 limitiert. (Dies ist im Inverter so implementiert und kann nicht geändert werden) D.h. aber auch, wenn z.B. 2 Panels auf der Nordseite (die z.B. nur 50W liefern) sind und 2 Panels auf der Südseite (die 600W liefern könnten) hättest du in Summe 50W + 375W.... (also unter der Annahme eines Limits auf 50%) Solche Unzulänglichkeiten muss man ggf. beim Errechnen des Limits berücksichtigen.

Danke dir, ich werd es ausprobieren, müssen die DP angelegt werden oder macht das OpenDTU? in MQTT finde ich diese DP nänlich nicht?

@Lucifor1976
Copy link
Author

Lucifor1976 commented Oct 30, 2022

So für alle die es interessiert:
in ioBroker die Datenpunkte anlegen hat keinen Sinn. Das klappt bei mir nur einmal, danach muss MQTT neu gestartet werden, dann geht es wieder einmal..
Es geht aber auch per curl und der API.
Das ganze muss dann so aussehen:

curl -X POST http://192.168.1.188/api/limit/config -d 'data={"serial":"116162810943","limit_type":1,"limit_value":100}'

Wobei die IP und die Seriennummer des Inverters ersetzt werden muss!

Jetzt versuche ich mit meinen mageren Scriptkenntnissen was Javascript angeht das ganze zu realisieren.
Ich werde es erstmal mit Blockly versuchen, damit komme ich einigermaßen zurecht.

Im Prinzip:
Wenn Hausverbrauch kleiner als 200 Watt dann Powerlimit 15% non peristend.
...
Wenn Hausverbrauch kleiner als 1700 Watt dann Powerlimit 100% non peristend.

Das Ganze halt nur auf Javarisch.

Jetzt bin ich zumindest ein ganzen Stück weiter...

Edit: mit dem Adapter "Linux Control" und bei diesem "Eigene Befehle" kann man problemlos Buttons basteln, die das Limit dann über die VIS setzen lassen (Datenpunkte von LinuxControl per State=true ansprechen).

@PeterFausH
Copy link

Ich hab mal so eine Tarnkappe für meine hoymiles angefangen.
Wenn ihr mal sehen wollt: https://gitlab.com/p3605/hoymiles-tarnkappe
Allerdings war das meine erste Erfahrung mit mqtt und da steckt noch Potential drin.

@Lucifor1976
Copy link
Author

Lucifor1976 commented Nov 1, 2022

Ich hab mal so eine Tarnkappe für meine hoymiles angefangen. Wenn ihr mal sehen wollt: https://gitlab.com/p3605/hoymiles-tarnkappe Allerdings war das meine erste Erfahrung mit mqtt und da steckt noch Potential drin.

Danke, ich seh mir das mal an, ich bin was Scripting angeht bei Python aber direkt raus °° auch Java kann ich nur in Ansätzen.. Mir wäre daher ein Blockly mit meiner derzeitigen Umgebung lieber (Iobroker, Smartmeter (Volkszähler), OpenDTU und das setzen der Limits via curl und Java, da das direkte Datenpunkte im LinuxControl Adapter sind und das Script dann direkt in Iobroker nutzbar ist).

Ich habe dein Script aber tatsächlich verstanden °°
Wenn ich meine Smartmeter Instanz so im iobroker Slave erreichen kann, müsste das klappen.. (Ich habe die Clientsoftware vom Volkszähler nämlich nicht installiert)

@ThePradox
Copy link

Ich habe heute etwas ähnliches veröffentlicht. Auch in python, frei konfigurierbar und nur minimales python scripting erforderlich: https://github.com/ThePradox/SolarExportControl

@LJ9210
Copy link

LJ9210 commented Nov 3, 2022

@PeterFausH kann man dein Vorhaben auch bei Home Asisstant einbinden ?

@PeterFausH
Copy link

PeterFausH commented Nov 3, 2022 via email

@t3ck0
Copy link

t3ck0 commented Nov 6, 2022

um das Feature der DTU Pro nachzubilden ist es notwendig ein Smartmeter, (z.B. SDM630, Fronius 63A-3) im ESP einzubinden und die Leistung entsprechend an den Wechselrichter zu kommunizieren.
Die genannten Smartmeter kommunizieren über Modbus RTU und es gibt bereits code um sie an einen ESP anzubinden.
Hardwareseitig kann das Smartmeter an den ESP verdrahtet werden.

Die Leistungsbegrenzung sollte für Batterie/Akku Projekte aufgenommen werden.
Ist es möglich die Funktion in dein Projekt aufzunehmen?

@ThePradox
Copy link

Meinung: Ich glaube das übersteigt den Scope von dem Projekt. Viele beziehen Ihre Smartmeter-Stromdaten auch per Infrarot SML Schnittstelle. Sollen die dann auch unterstützt werden? Wie groß ist die Chance das dort wo der Stromzähler steht, auch der Inverter per Funk erreichbar ist?

@ThePradox
Copy link

Ergänzung: Vielleicht wäre es sinnvoller einfach nur einen RX Pin in OpenDTU zu definieren an den man den Stromverbrauch senden kann? Da kann dann jeder dran klemmen was er will.

@t3ck0
Copy link

t3ck0 commented Nov 6, 2022

Da hast du recht, ein RX und ein TX PIN zu definieren an den die aktuelle Leistung gesendet werden kann, ist für viele sicherlich hinreichend gut.
Da die DTU-Pro ein Smartmeter DTSU666 nutzen kann um die Funktion zu realisieren kam mein Vorschlag.
Kannst du den Leistungswert auf einem RX Pin in deinem Projekt an die aktuelle Leistung des Umrichters geben?

@cbscpe2
Copy link

cbscpe2 commented Nov 24, 2022

Ich würde mir auch wünschen, man könnte die Limits via Serielle Schnittstelle setzen. Dann könnte ich das mit weniger Aufwand in mein Projekt einbinden das leider MQTT nicht direkt unterstützt. Dazu kommt noch, dass das Setzen der Limits im Moment der einzige Grund ist, dass ich einen MQTT Server betreiben muss.

@Freeenergy-man
Copy link

Hallo, habe aktuell eine Solaranlage mit Speicher und möchte gerne das ganze mit Nulleinspeisung realisieren.
DTU Ahoy und Tasmota am Zähler habe ich schon zum laufen gebracht.
Jetzt fehlt nur noch die automatische Leistungsregelung.
Dazu hatte ich heute eine sehr gute Idee :)
Kann man Ahoy Dtu und Tasmota nicht zusammen als ein Projekt realisieren?
Dann hätte man eine Steuerung am Zähler die alles macht.

@homeautomation2022
Copy link

Können kann man alles, es muss nur einer Programmieren...
Problem dabei ist: so gut wie jeder hat eine andere Umgebung, anderen Zähler, anderes Homesystem, andere Übertragungsarten/Protokolle usw. Diese kann man nicht alle abdecken, das würde das Projekt, in dem es rein um die Steuerung und Überwachung des Wechselrichters geht, sprengen.
Gern kann so etwas auf Forks wie es z.B. bei VE.Direct für die MPPT Solarladeregler gemacht wurde verbreitet werden. Aber es kann hier halt nicht jeder Wunsch erfüllt werden.
Ein Kompromiss wäre ein Modul, das einfach nur einen MPPT Eingang dür den aktuellen Zählerwert hat und darüber eine Nulleinspeisung VERSUCHT, es wird nie eine echte zugelassene ausfallsichere und schnelle Nulleinspseisung werden.

@t3ck0
Copy link

t3ck0 commented Nov 26, 2022

Eine zugelassene Nulleinspeisung sollte in dieser Leistungsklasse auch kaum jemand benötigen.
Wenn du EINEN Smartmetertyp (ich wiederhole mich, SDM60, Fronius 63A-3, DTSU666-D, etc.) in dein Projekt aufnimmst so wie bei der DTU-Pro, dann ist das hinreichend gut.
Wer einen anderen Typen nutzen will, als du reinprogrammierst, der hat eben Pech oder soll sich selbst was schreiben.
Modbus kannst über RX-TX laufen lassen und all meine Vorgeschlagenen Typen nutzen den.

@PeterFausH
Copy link

Um ein Limit zu setzen braucht es nur ein einziges MQTT-Kommando:
Hier als Python-Zeile:
client.publish("solar/"+serial+"/cmd/limit_nonpersistent_absolute",limit)
Das ist die Verbindung von was auch immer für einem Zähler zur openDTU.

Limiter-Beispiel-Graph
So sieht das aus, wenn in einem cronjob jede Minute eine Limitierung erfolgt.

@berni2288
Copy link

Ich habe einen Fork von dem Projekt OpenDTU_VeDirect gemacht und Support für Nulleinspeisung (mit Batterie statt Solar) mit dem Shelly 3 EM eingebaut. Der subscribed sich einfach auf die Shelly MQTT topics und setzt dann alle 15 Sekunden das Limit vom Hoymiles neu. Konfiguration ist über das Web interface möglich. Man kann eine Stop und eine Start Voltage setzen damit er bei einem gewissen Ladestand der Batterie anfängt zu arbeiten. Man kann 3 MQTT Topics setzen die addiert werden, also es funktioniert wahrscheinlich mit jedem MQTT Power Meter wie Shelly 3em.

https://github.com/berni2288/OpenDTU_PowerLimiter

Allerdings ist hier noch irgendein Bug, alle paar Tage hört der Hoymiles auf Updates an meinen ESP32 zu schicken, dass muss ich noch lösen. Ansonsten bin ich damit sehr zufrieden und mein Smart Meter Diagram zeigt schön dass weder Strom bezogen wird (also nichts über 10 W) und dass auch nichts ins Netz geht.

Da es hier um eine kritische Funktion geht die möglichst in "Echtzeit" passieren sollte und auch die Fehleranfälligkeit möglichst klein gehalten sollte, halte ich nichts davon diese Funktionalität auf einen weiteren Computer auszulagern, deswegen habe ich das direkt in OpenDTU eingebaut.

@helgeerbe
Copy link
Contributor

helgeerbe commented Jan 2, 2023

Hi @berni2288, wenn du nichts dagegen hast, würde ich deine Änderung gerne wieder nach OpenDTU_VeDirect holen. Ich plane meinen China-Inverter durch einen HM-300 zu ersetzen. Aktuell kann ich den China-Inverter nur über einen Shelly an und abschalten. Er liefert dann konstant 100W (regelbar über ein Poti).

Kurze Frage. Warum machst die Start-/Stop-Voltage in OpenDTU? Victron hat dafür eigentlich das (virtual) Load flag. Ich nutze es, um meinen Inverter an und ab zu schalten. Das OpenDTU Setting würde ich eher als Sicherung sehen, wenn der MPPT ausfällt und man die Batterie vor der vollständigen Entladung schützen will.

Inzwischen ist der OpenDTU und OpenDTU_VeDirect ziemlich stabil. Die Update-Ausfälle nach einer gewissen Laufzeit hatte ich, als es noch diverse Memory-Leaks gab. Schau dir mal den Speicherverbrauch an.

@berni2288
Copy link

@helgeerbe Gerne, aber beachte das Feature ist derzeit noch eher im Beta-Status, funktioniert bei mir aber schon gut, bis auf den Bug.

Also ich hatte noch nicht wirklich viel Zeit meinen ESP32 mit dem Victron MPPT zu verbinden, irgendwie hat es das erste Mal nicht geklappt. Ich bin mir noch unsicher welche Pins vom ESP32 (NodeMCU) ich verwenden kann für den Victron, weil ein TX und ein RX sind ja schon vom nrf24l01+ belegt?

Den Wechselrichter an den Lastausgang zu hängen ist glaub ich nicht wirklich empfohlen, da die Kondensatoren vom Wechselrichter beim Anschließen viel Strom in kurzer Zeit ziehen. Hab schon mal ein Youtube-Video gesehen wo einer berichtet hat dass es die Victron-Sicherung zerschossen hat damit. Ich hab ein Pylontech 48V-Batterie-System (das US3000C), im 48V-Modus liefert der Victron MPPT 100/20 48V sowieso nur 0,1A am Lastausgang, kann ich also mit 48V eh vergessen :)
Die Pylontech hat eine Softstart-Funktion die die ersten 3 Sekunden die Kondensatoren vom Hoymiles schont und außerdem hat das BMS von meiner Bat auch einen Unter/Über-Spannungs-Schutz, weil nur auf meinen selbstgeschrieben Voltage-Code würd ich mich auch nicht verlassen :)

Das mit dem Speicherverbrauch ist ein sehr guter Tipp, das werde ich mal machen, danke! Ich dachte dass mein Code einfach zu viele Befehle an den Hoymiles schickt und ich ihn dadurch überlaste. Wenn der Bug auftritt dann hilft es nicht mal den ESP32 neuzustarten, ich muss dann den Hoymiles komplett stromlos machen und den ESP32, keine Ahnung was es da hat...
Ich werd auch mal das Limit-Änderungs-Intervall größer machen, vielleicht hilft das was...

@helgeerbe
Copy link
Contributor

helgeerbe commented Jan 2, 2023

@berni2288 lass dich nicht von den aufgedruckten Bezeichnungen verwirren. Beim esp32 kannst du die TX/RX Pins für eine serielle Schnittstelle frei wählen. Bei meinem Wemos esp32 Mini habe ich z. B. diese Pins gewählt.

-DVICTRON_PIN_TX=21
-DVICTRON_PIN_RX=22 

Der Hardware Lastausgang beim MPPT 100/20 48V liefert 1 A und nicht 0,1 A bei 48 V. Das sind aber auch nur 48W. Kein Wunder, wenn da die Sicherung am MPPT fliegt. Interessanterweise können aber bei 24V 20 A geliefert werden. Das sind schon 480W, was für ein Grundlastkraftwerk ausreicht. Aber ich meinte den virtuellen Lastausgang. D. h. wenn der MPPT den Lastausgang an und ausschaltet, wird dies auch über das VE.direct Protokoll signalisiert (Mein MPPT hat auch gar keinen physikalischen Lastausgang). Ich nutze das ON/OFF Flag um den Inverter an und auszuschalten, da der Batterielader den Zustand der Batterie am besten kennt (Meine Batterie steht z. B. leider nicht frostsicher).

Dein US3000C ist sicher eine gute Lösung. Ich habe nur einen einfachen Akku. Ob der Kondensator vom Inverter beim Anschluss die Batterie überlastet, hängt sicher von der Leistung des Inverters ab. Einen HM-300 sollte die Batterie und die Kontakte abkönnen. Bei großen Invertern sollte man tatsächlich die Kondensatoren vorladen, sonst kann es einen schönen Funkenflug geben. (Nur um es erwähnt zu haben: Sicherungen sind Pflicht. Ein Kabel ist keine Schmelzsicherung!).

Behalte mal im WebInterface der OpenDTU unter System-Info den Heap im Auge. Wenn der sich über die Laufzeit verändert, würde ich intensiv nach Speicher-Leaks schauen. Ich habe auch gesehen, dass du bei Stringoperationen strlcpy() und sizeof() verwendest. Spricht etwas dagegen gleich die String Klasse zu verwenden? Das macht einem das Leben meiner Erfahrung nach deutlich einfacher.

@cbscpe2
Copy link

cbscpe2 commented Jan 23, 2023

Hi @berni2288,

Verbindung zum Victron MPPT Hat jetzt bei mir geklappt.

schön, dass Victron MPPT jetzt klappt. Auch wenn ich nicht verstehe, warum es vorher mit dem Level-Shifter nicht wollte.

Wo hattest du denn Level-Shifter eingesetzt?

@berni2288
Copy link

@cbscpe2
Hatte es mit einem Haisheng IIC I2C Logik Level Konverter 3,3 V zu 5 V (bidirektional) versucht.
Für die 5V beim HV PIN hatte ich einmal testweise die 5V vom Victron und einmal die 5V vom ESP board versucht.

Bildschirmfoto vom 2023-01-23 22-56-14

Aber egal, funktioniert ja jetzt auch ohne dem Konverter :)

@cbscpe2
Copy link

cbscpe2 commented Jan 24, 2023

Komisch müsste eigentlich klappen. Die Signale sind zum Glück alle TTL kompatibel, das erklärt wohl auch warum es ohne funktioniert. Sobald angekommen, werde ich mal den ADUM1201 ausprobieren. Der isoliert auch gleich, wie das eigentlich Victron empfiehlt. Dann muss ich mir auch keine Gedanken bezüglich der Spannungsversorgung machen, jede Seite kann mit 2-5V betrieben werden.

@Adminius
Copy link

@berni2288 du macht genau da was ich vorhabe, gut dass ich dass gefunden habe :)
ich wollte schon auf Basis von Ahoy alles selbst implementieren

  • Victron 100/20 48V liegt da (+2x405Wp Module am Geländer), VE-Kabel muss ich noch ans ESP32 anschließen, das will ich per ADUM1201 machen um die GNDs zu trennen, man weiß ja nie. Level-Shifter ist dann gleich mit dabei
  • Hoymiles HM600 kann schon über Ahoy gesteuert werden, d.h. HW geht schon mal.
  • DIY LiFePo4 Batterie mit 14S ist auch schon fertig. Eigentlich habe ich auch einen JBD SmartBMS mit UART, aber SoC Berechnung geht noch nicht (muss wohl paar mal laden/entladen damit es geht).

Jetzt fehlt mir noch noch der Limiter.
Ich habe quick and dirty gestern probiert, meiner hat schon mal funktioniert, jetzt werde ich deinen probieren :D
Zu Batterie SoC: eigentlich reicht es DC-Voltage vom WR auszulesen (oder auch Victron).
und ein mal manuell herausfinden:

  • Min Voltage 1: Leistung nie mehr höher als XY W
  • Min Voltage 2: ab hier gar nicht mehr Einspeisen bis die DC-Voltage auf Min Voltage 2 + XYZ V raufgeht (z.B. bei 39,2V abschalten, bei +2 => 41,2V wieder starten, aber nicht höher als XY W aus Min Voltage 1 - Einstellung)

Auch ja, Shelly 3M als Input habe ich leider nicht, da werde ich entweder auf ziemlich ungenaue ADC-Messung mit emonLib setzen oder auf SDM72 Zähler

@berni2288
Copy link

Hi @Adminius,
freut mich dass du her hergefunden hast :)

Zu Batterie SoC: eigentlich reicht es DC-Voltage vom WR auszulesen (oder auch Victron).
und ein mal manuell herausfinden:

Ja so hab ich es derzeit implementiert, mit Korrekturfaktor weil die Voltage runtergeht wenn der Wechselrichter grad Saft rausnimmt. Aber ich vermute mal dass die Spannungs/SOC Kurve der Batterie nicht linear ist, also finde ich die Lösung nicht ganz so schön. Deswegen versuche ich grad mit RS485 (oder CAN) an die Daten von meinem BMS zu kommen.
Ich will die Daten sowieso im MQTT haben damit ich sie mit Grafana visualisieren kann. Ist zwar aufwändiger, aber es geht nichts über zuverlässige Daten :)

Min Voltage 1: Leistung nie mehr höher als XY W
Min Voltage 2: ab hier gar nicht mehr Einspeisen bis die DC-Voltage auf Min Voltage 2 + XYZ V raufgeht (z.B. bei 39,2V abschalten, bei +2 => 41,2V wieder starten, aber nicht höher als XY W aus Min Voltage 1 - Einstellung)

In meinem Projekt hab ich grad die Settings "Minimale Leistung", "Maximale Leistung", "Start Spannung" und "Stop Spannung".

Meld dich wenn du Hilfe brauchst, ich hatte noch keine Zeit das Projekt ausführlich zu dokumentieren.

@Adminius
Copy link

Adminius commented Feb 3, 2023

hi @berni2288 ich habe auch ohne Doku geschafft, ist eigentlich selbsterklärend.
An meiner Idee mit 2 Stufen halte ich noch fest (nicht jeder hat eine Möglichkeit SoC auszulesen), ich wäre deswegen vor erst für eine generisch Lösung.
Gestern ist es mir passiert, mit vollen 600W Akku entladen bis die Spannung so tief gesunken ist, dass der BMS abgeschaltet hat => BMS Abschaltung möchte man aber am besten vermeiden, da danach auch der WR nicht mehr erreichbar ist...
1-2V dafür auf z.B. max 50W reduzieren würde mehr bringen, da danach sich die Zellen ein wenig erholt haben und könnten noch länger liefern mit kleinerer Leistung.

ich habe zwar auch SmartBMS (JBD) mit UART und würde auch gern die Daten haben/nutzen/per MQTT verteilen, aber diese Spielereien erst, wenn der Rest besser läuft.

ich muss noch SDM72 Stromzähler per RS485 als Leistungsquelle einbinden. An dem Einsatzort gibt es nichts anderes... soll eigentlich komplett offline/autark ohne WLAN laufen.

@berni2288
Copy link

hi @berni2288 ich habe auch ohne Doku geschafft, ist eigentlich selbsterklärend. An meiner Idee mit 2 Stufen halte ich noch fest (nicht jeder hat eine Möglichkeit SoC auszulesen), ich wäre deswegen vor erst für eine generisch Lösung.

Ich hab mir eh überlegt die Spannungseinstellungen noch weiter auszubauen, am besten so flexibel dass es die meisten möglichen use cases von anderen Leuten abdeckt.

Gestern ist es mir passiert, mit vollen 600W Akku entladen bis die Spannung so tief gesunken ist, dass der BMS abgeschaltet hat => BMS Abschaltung möchte man aber am besten vermeiden, da danach auch der WR nicht mehr erreichbar ist... 1-2V dafür auf z.B. max 50W reduzieren würde mehr bringen, da danach sich die Zellen ein wenig erholt haben und könnten noch länger liefern mit kleinerer Leistung.

Ja das mit der BMS-Abschaltung ist mir auch schon einmal passiert, sowas will man eigentlich vermeiden.
Wenn man 100% sicher gehen weil dass sowas nicht passiert sollte man einen Batteriewächter dazwischen schalten (> 10€), zumindest wenn man nicht sicher weiß ob das BMS überhaupt die Batterie zuverlässig vor Tiefentladung schützt.

Da mit dem Hoymiles über (nicht 100% zuverlässigen) Funk kommuniziert wird und der ESP32 möglichweise stromlos werden kann (aus verschiedenen Gründen) empfiehlt sich eine extra Absicherung, außer man nimmt das in Kauf.

ich muss noch SDM72 Stromzähler per RS485 als Leistungsquelle einbinden. An dem Einsatzort gibt es nichts anderes... soll eigentlich komplett offline/autark ohne WLAN laufen.

Wenn du magst kannst du da einen PR erstellen, damit man in den UI Einstellungen zwischen MQTT und SDM72 wechseln kann. Ich vermute mal dass SDM72 ein proprietäres RS485 Protokoll verwendet, welches wir nicht generisch implementieren können.

@Adminius
Copy link

Adminius commented Feb 3, 2023

BMS schaltet bei mir zuverlässig ab. Ich habe 2,8V undervoltage statt 2,5V eingestellt. Mehrmals getestet, alles top. Vermeiden würde ich es trotzdem lieber.

SDM72 hat den selben Protokoll wie der großer SDM630 Bruder (wird oft bei großen WRs eingesetzt). SDM230 wäre einphasige version. Diese sind alle sehr verbreitet.
Es gibt schon etwas fertiges und einfaches als Lib: https://github.com/reaper7/SDM_Energy_Meter
ich gehe aber davon aus, dass man doch zwischen 3ph und 1ph umschalten müsste (das muss ich testen)

Es gibt nur eine Sache wo ich noch unsicher bin:
Victron braucht schon einen HW UART.
USB/Debug noch einen HW UART.
Einen HW UART haben wir noch übrig -> Zähler über UART-RS485 Brücke?
Dann gehen BMSen nur über SW Serial (falls es UART BMS ist). RS485 BMS wäre mit dem Zähler gleichzeitig über RS485 möglich, wenn die Baudrate und IDs zusammen passen.

@berni2288
Copy link

Nicht dass ich viel Erfahrung mit Software Serial hab, aber wahrscheinlich ist es kein großes Problem wenn man nicht gleichzeitig Senden und Empfangen will und keine große Übertragungsrate braucht. Kann mir nicht vorstellen dass das Probleme macht beim Auslesen von BMS-Daten.

@Adminius
Copy link

Adminius commented Feb 3, 2023

Na wenn schon SDM-Library auf SW Serial als option setzt, sollte es auch bei BMS gehen :)
ich überlege es mir noch. Eigentlich mag ich meinen BMS mit UART, aber mir fehlt Active Balancer. Dann kann man gleich auf JK BMS umsteigen (RS485, fertige Libs und Active Balancer... kostet halt das doppelte)

na gut. Ich wollte halt damit sagen, dass wenn man schon BMS einbinden möchte, dann bitte möglichst generisch ;)

@Ollipop030
Copy link

Werden Tasmota Geräte für die Leistungsermittlung zukünftig berücksichtigt? Im Schwester Project gibt es hierzu ein Issue:

lumapu/ahoy#606

Viele Leseköpfe kann man einfach per json abfragen, damit wäre eine Nulleinspeisung ohne MQTT möglich.

@stefan123t
Copy link

@Ollipop030 schau mal hier ein analoger Feature Request für OpenDTU #567

@cbscpe2
Copy link

cbscpe2 commented Feb 10, 2023

@cbscpe2 Hatte es mit einem Haisheng IIC I2C Logik Level Konverter 3,3 V zu 5 V (bidirektional) versucht. Für die 5V beim HV PIN hatte ich einmal testweise die 5V vom Victron und einmal die 5V vom ESP board versucht.

Bildschirmfoto vom 2023-01-23 22-56-14

Aber egal, funktioniert ja jetzt auch ohne dem Konverter :)

Meine ADUM1201 sind angekommen und ich habe nun meinen SmartSolar 100/20 über einen ADUM1201 mit dem USB Serial Adapter verbunden. Und es funktioniert. Jetzt ist die Verbindung wie empfohlen isoliert und potentialfrei.
IMG_7110

@helgeerbe
Copy link
Contributor

helgeerbe commented Feb 10, 2023

@cbscpe2 wenn ich mich recht erinnere haben die UART-TTL USB Adapter mit CH340G einen Jumper, um zwischen 5V und 3.3V zu wechseln. Hast du 5V gesteckt und auch 5V am ADUM1201 angelegt? Oder ist bei dir 3.3V eingestellt und du machst einen echten Level Shift?

@cbscpe2
Copy link

cbscpe2 commented Feb 10, 2023

Beide Seiten werden mit etwa 5V betrieben, vom Smartsolar kommen etwa 4.8V vom USB Adapter 5.1V. Die beiden Seiten des ADUM1201 sind vollständig voneinander unabhängig was die Spannungsversorgung anbelangt und darf zwischen 2.7V und 5.5V betragen. Die beiden Seiten sind elektrisch voneinander getrennt. D.h. der ADUM1201 macht automatisch ein Level Shift. D.h. das funktioniert auch wenn auf der User Seite 3.3V anliegt. In meinem Fall habe ich noch einen zweiten ADUM1201 im Einsatz der am UART eines AVR Microcontrollers hängt der mit 3.3V betrieben wird und auf der anderen Seite hängt ein 5V USB-UART Interface Adapter zum PC. Das klappt bestens.

@arittel
Copy link

arittel commented May 22, 2023

Leistungsbegrenzung OpenDTU mit Python.

Hier mal ein Snippet:
import requests
headers = {
'Content-Type': 'application/x-www-form-urlencoded',
}

url = ('http://192.168.179.160/api/limit/config')
data = 'data={"serial":"11218xxxxxxx", "limit_type":1, "limit_value":33}'

x = requests.post(url, headers=headers, data = data, auth=('admin','XXXXX('))
print(x)

Aus IoBroker jetzt noch über die API die aktuellen Leistungswerte des Zählers auslesen und ein bisschen Mathe dazu.
Am besten alle 30 sek. per Crontrigger starten und schon läuft das ganze.

@stefan123t
Copy link

stefan123t commented Jul 10, 2024

Hier geht es prinzipiell u.a. auch um die technische Machbarkeit einer "Null-Einspeisung"/"Zero-Export" Lösung.

Davon unabhängig gibt es in OpenDTU-OnBattery die beiden Optionen Power Meter und Dynamic Power Limiter.

@tbnobody m.E. wäre es langfristig hilfreich die beiden o.g. Optionen aus dem OpenDTU-OnBattery Project in den mainstream OpenDTU Kernel aufzunehmen. Auch die Hoymiles DTU Pro bietet ja eine Zero Export Control mit Hilfe z.B. eines SDM Smart Meter via Modbus TCP / Modbus RTU (RS485) wie im Aufbau von @cbscpe2 beschrieben an.

Ich habe bei mir ein Shelly Pro3EM wie folgt für eine max. -300 Watt Export Control in OpenDTU-OnBattery konfiguriert:

Settings > Powermeter

Power Meter Configuration
Enable Power Meter: [x]
Verbose Logging: [x]
Power Meter type: HTTP(S) + JSON

HTTP(S) + Json - General configuration
Individual HTTP requests per phase: [ ]

HTTP(S) + Json configuration - Phase 1
URL: GET: http://shellypro3em-123456abcdef/rpc/Shelly.GetStatus
Authorization Type: None
Optional: HTTP request header - Key:
Optional: HTTP request header - Value:
Timeout: 1000 ms
JSON path: em:0/total_act_power
Unit: W
Change Sign: [ ]
Run Test
Success! Power: 73.13W
Save

image

Alternativ könnte man auch alle drei Phasen einzeln abfragen, dazu die folgenden Werte anpassen:

HTTP(S) + Json - General configuration
Individual HTTP requests per phase: [x]

HTTP(S) + Json configuration - Phase 1
JSON path: em:0/a_act_power

HTTP(S) + Json configuration - Phase 2
Phase enabled: [x]
URL: GET: http://shellypro3em-123456abcdef/rpc/Shelly.GetStatus
JSON path: em:0/b_act_power

HTTP(S) + Json configuration - Phase 3
Phase enabled: [x]
URL: GET: http://shellypro3em-123456abcdef/rpc/Shelly.GetStatus
JSON path: em:0/c_act_power

Dynamic Power Limiter Settings

Configuration Notes
The following notes regarding the Dynamic Power Limiter (DPL) configuration shall be considered:
Required: Polling data from and sending commands to the target inverter must be enabled.

General
Enable: [x]
Verbose Logging: [x]
Target Grid Consumption: -300 W
Hysteresis: 30 W

Inverter
Target Inverter: HM-600 (HM-600/700/800-2T)
Inverter is powered by solar modules: [x]
Minimum Power Limit: 10 W
Base Load: 100 W
Maximum Power Limit: 600 W
PowerMeter reading includes inverter output: [x]
Save

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
enhancement New feature or request
Projects
None yet
Development

No branches or pull requests