tbnobody / OpenDTU

Software for ESP32 to talk to Hoymiles/TSUN/Solenso Inverters
GNU General Public License v2.0
1.79k stars 499 forks source link

Lastabhängige Stuerung der Solarproduktion #272

Open Lucifor1976 opened 1 year ago

Lucifor1976 commented 1 year ago

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

tbnobody commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

Es gibt Topics an die man die Limits schicken kann: https://github.com/tbnobody/OpenDTU/blob/13b22de53aa6abeb6dec0169d0db77cb3c2f998d/docs/MQTT_Topics.md?plain=1#L67-L70

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

Es gibt Topics an die man die Limits schicken kann:

https://github.com/tbnobody/OpenDTU/blob/13b22de53aa6abeb6dec0169d0db77cb3c2f998d/docs/MQTT_Topics.md?plain=1#L67-L70

@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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

Es gibt Topics an die man die Limits schicken kann:

https://github.com/tbnobody/OpenDTU/blob/13b22de53aa6abeb6dec0169d0db77cb3c2f998d/docs/MQTT_Topics.md?plain=1#L67-L70

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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

LJ9210 commented 1 year ago

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

PeterFausH commented 1 year ago

Das kann ich dir nicht sagen, kenne Home Assistent nicht.

Am 03.11.2022 um 21:30, LJ9210 @.***> schrieb:

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

— Reply to this email directly, view it on GitHub, or unsubscribe. You are receiving this because you were mentioned.Message ID: @.***>

t3ck0 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

@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 commented 1 year ago

@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.

berni2288 commented 1 year ago

Ja stimmt, 1A ist es bei 48V :) Ich hab einen HM-800 und 750W Solar Panels, also auch die 480W wären mir zu wenig, deswegen hängt mein Hoymiles direkt an der Batterie. Weiß der Victron Laderegler mehr als der Hoymiles über die Batterie? So weit ich das sehen konnte ist die Spannungs-Anzeige fast ident beim Victron und beim Hoymiles. Mein Plan war dass dieser Power Limiter so universell wie nur möglich einsetzbar ist, also unabhängig vom Laderegler Aber du hast natürlich recht, zuverlässiger wäre es natürlich das vom Victron über das Kabel auszulesen, anstatt zu hoffen dass die Funkdaten aktuell sind... Das Problem mit der Voltage ist auch dass die unter viel Last, also z.B. 800 Watt gern um 1 Volt einbricht, da weiß ich auch noch nicht ganz wie ich damit umgehe.

Die Pylontech Batterie hat aber einen noch genaueren SOC-Wert für die Batteriekapazität, den Wert würde ich mir eigentlich gerne abgreifen, da muss ich noch experimentieren.

Bzg. strlcpy: Kann ich mal ausprobieren, danke.

helgeerbe commented 1 year ago

Was die Spannung betrifft solltest du keinen großen Unterschied zwischen Laderegler und Hoymiles haben. Aber meine Batterie darf nur oberhalb von 0 Grad geladen und bis -20 Grad Batterietemperatur entladen werden.

Ich vermute mal die echte Batterieladung kannst du nur abschätzen. Ansonsten müsstest du die immer mal die Ladung der Batterie unterbrechen. Ein paar Minuten warten und dann die Spannung messen.

dAjaY85 commented 1 year ago

Pylontech unterstützt doch can, eventuell wäre es möglich die Werte über can an den esp zu senden. Es gibt fertige can Module für ESP.

cbscpe2 commented 1 year ago

Die Pylontech via CAN abzufragen ist kein Problem. Im Internet geistern Protokollbeschreibungen herum. Jedoch muss man wissen, dass man die Batterie pollen muss und zwar mit CAN Msg ID 0x0305 und 0x0307, sonst liefert sie keine Statusinformationen über den CAN Bus. Die Messages sind normalerweise 8 bytes lang aber deren Inhalt ist wie ich vermute unwichtig. Venus OS schickt in der Msg 0x0305 8 mal 0x00 und in der Msg 0x0307 0x12, 0x34, 0x56, 0x78, 'V', 'I', 'C', 0x00. Wichtig ist in diesem Zusammenhang nur die CAN Msg ID 0x35C, dort gibt es 5 Flags CAN ID 0x035C SID:035C [02] C0 00 Byte 0 Request Flag 0x80 Charge Enable 0x40 Discharge Enable 0x20 Request Force Charge 1 0x10 Request Force Charge 2 0x08 Request Full Charge Die meisten CAN Bus Interfaces verwenden den SPI Baustein MSP2515, dazu gibt es auch Libraries, die Frage ist nur welchen SPI nimmt mann, der ESP hat doch nur einen. Man kann den zwar mit dem NRF24L01+ Modul teilen, mindestens die RF24 Library ist dafür vorgesehen.

berni2288 commented 1 year ago

Ich hätts jetzt über die RS485-Schnittstelle gemacht :) CAN hab ich noch nie verwendet. Hab jetzt mal ein neues Issue für das holen vom SOC aufgemacht, damit wir hier dieses Issue hier nicht hijacken: https://github.com/berni2288/OpenDTU_PowerLimiter/issues/2

dAjaY85 commented 1 year ago

Sieht nach sdo aus, eventuell hat Pylontech die Möglichkeit auf pdo's zu Mappen, dann wäre es superleicht die Werte auszulesen.

https://www.setfirelabs.com/green-energy/pylontech-can-reading-can-replication

https://www.photovoltaikforum.com/thread/130061-pylontech-us2000b-daten-protokolle-programme/

berni2288 commented 1 year ago

Ein paar Updates zu meinem Powerlimiter Projekt:

Code Ich habe jetzt noch einige Verbesserungen gemacht und vermute dass es jetzt stabil läuft. Den Code kann man aber noch etwas aufräumen. Würd sagen das ganze hat mal Beta-Qualität. Eine Anleitung zum Setup/Konfiguration fehlt noch.

Crashes Die Ausfälle von meinem esp32 die ich beobachtet habe sind anscheinend immer aufgetreten wenn ich die Fenster davor offen hatte. Vermutlich hat die Kälte etwas an der Leitfähigkeit der Elektronik geändert. Der nrf24l01+ ist auch bekannt dafür dass er nicht gut mit instabiler Spannungs/Strom-Versorgung funktioniert, Ich verwende einen DC Wandler um die 48V der Batterie auf 5V zu transformieren, vermutlich arbeitet das China-Teil nicht ganz sauber. Ich hab gestern versucht einen Kondensator reinzuklemmen, aber irgendwie startet jetzt mein ESP32 nimmer, ich muss den wohl tauschen. Außerdem gabs einen Bug im Code wo dann zu viele Befehle an den Hoymiles auf einmal gesendet wurden, das kann natürlich auch eine Ursache gewesen sein.

Verbindung zum Victron MPPT Hat jetzt bei mir geklappt. Ich werde implementieren dass der Powerlimiter die Voltage auch alternativ vom Victron nimmt, also für die Stop & Start Spannung der automatischen Leistungsregelung. Das ist zuverlässiger als die Hoymiles Kommunikation. Zusätzlich möchte ich implementieren dass man bei Sonnenschein den Strom gleich direkt in die Steckdose speisen kann (abgeregelt zum aktuellen Haushaltserbrauch). Damit spart man sich wahrscheinlich 10% Lade/Entlade-Verlust durch die Batterie.

Auslesen des Batterie SOC von der Pylontech Batterie Das schätzen des aktuellen Batterie-Ladestands über die Voltage ist ja nicht ganz so toll. Hab zwar jetzt einen Faktor-Wert implementiert der abhängig von der aktuellen Power/Last die lastunabhängige Battery-Voltage schätzt, aber schön ist das nicht. Hab für das Auslesen vom SOC von Pylontech ein Github Projekt gefunden was man anscheinend ganz leicht adaptieren kann für den ESP32: https://github.com/irekzielinski/Pylontech-Battery-Monitoring Warte da noch auf den SparkFun MAX3232 Transceiver den man dafür braucht :)

helgeerbe commented 1 year ago

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.

** Zusätzlich möchte ich implementieren dass man bei Sonnenschein den Strom gleich direkt in die Steckdose speisen kann (abgeregelt zum aktuellen Haushaltserbrauch). Damit spart man sich wahrscheinlich 10% Lade/Entlade-Verlust durch die Batterie.

Wie willst du das machen? Kannst du das etwas näher beschreiben.

berni2288 commented 1 year ago

Wie willst du das machen? Kannst du das etwas näher beschreiben.

Klar, der Laderegler, die Batterie und der Hoymiles sind ja bei mir alle direkt verbunden ohne Relais oder irgendwas. Wenn ich das Power limit vom Hoymiles alle paar Sekunden auf die aktuelle Leistung der aktuellen Solarproduktion vom Victron anpasse, dann sollte ja theoretisch kein Strom in die Batterie fließen, sondern die ganze aktuelle Solarproduktion direkt in den Wechselrichter gehen. Das schont die Batterie und verbessert die Gesamteffizienz meines Systems.

Edit: Natürlich soll der Wechselrichter maximal so viel ins Hausnetz einspeisen wie ich grad im Haushalt verbrauche, anhand der Daten vom Shelly 3em. Alles was mehr an Solarstrom produziert wird darf natürlich in die Batterie fließen.

cbscpe2 commented 1 year ago

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 commented 1 year ago

@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 commented 1 year ago

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 commented 1 year ago

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

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:

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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 commented 1 year ago

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

https://github.com/lumapu/ahoy/issues/606

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

stefan123t commented 1 year ago

@Ollipop030 schau mal hier ein analoger Feature Request für OpenDTU https://github.com/tbnobody/OpenDTU/discussions/567