evcc-io / evcc

Solar Charging ☀️🚘
https://evcc.io
MIT License
3.63k stars 675 forks source link

Sofar HYD: Battery Control #12220

Closed premultiply closed 2 months ago

premultiply commented 9 months ago

https://www.photovoltaikforum.com/thread/221806-sofar-hyd-mit-evcc-akkuentladung-verhindern/?postID=3598510#post3598510

in Template übersetzen

cschlipf commented 7 months ago

@premultiply Lass mich wissen, wenn Du das angehst. Habe mittlerweile in der Integration einiges geändert. Siehe auch: https://homeassistant-solax-modbus.readthedocs.io/en/latest/sofar-energy-storage-modes/, insbesondere dieser Abschnitt: https://homeassistant-solax-modbus.readthedocs.io/en/latest/sofar-energy-storage-modes/#prevent-battery-discharging

Sofar erlaubt hier dann auch die Entladung zu verhindern - die Ladung aber weiterhin zuzulassen (falls jemand mehr vom Dach bekommt als in das Auto+Haus hineingeht)

andig commented 2 months ago

@cschlipf wäre es möglich hier kurz die relevanten Register und Werte zu beschreiben? Dann ist das schnell gemacht. Danke!

cschlipf commented 2 months ago

Gerne.

Um den Passive Mode zu setzen ist dieses Register zu schreiben:

image

Mit dem Wert 3 geht es in den Passive Mode. Wenn man die Batterie wieder aktiviert, sollte das Register wieder zurück auf 0 (Self-Use) gesetzt werden.

Nun könnte es noch sein, dass im Passive Mode die Werte nicht stimmen, weil sie zuvor auf irgendwas anderes gesetzt worden sind. Dazu müssen diese Register zusammen in einer Schreiboperation gesetzt werden:

image
cschlipf commented 2 months ago

SOFAR Modbus Protocol G3_2023-12-22_1.22_en-INT.xlsx

Bei der Gelegenheit hier die aktuellsten ModBus Register.

andig commented 2 months ago

Nun könnte es noch sein

Ich brauche bitte einfach die Liste der Register mit Wert je Modus. Keine Screenshots, keine Textaufgabe. Danke!

cschlipf commented 2 months ago

OK, ich dachte das hätte ich schon genau genug beschrieben.

Hoffe das war kurz und prägnant genug.

andig commented 2 months ago

Danke, das hilft dem Entwickler mit wenig Zeit- Netzladung gibts nicht?

andig commented 2 months ago

Gerne testen

cschlipf commented 2 months ago

Netzladung geht genauso, nur mit anderen Werten:

\<Ladeleistung> ist hier der Wert in W mit der der Akku geladen werden soll. Beim BTS Speicher ist das die Hälfte der Kapazität (z.B. ein BTS Speicher mit 10 kWh Kapazität braucht hier einen Wert von 5000 für die maximale Ladeleistung)

cschlipf commented 2 months ago

Gerne testen

Muss leider warten: Morgen früh geht es in den Urlaub.

wardwygaerts commented 2 months ago

Gerne testen

How can I test? Can I install this branch in Docker?

Frintrop commented 2 months ago

@cschlipf @andig

Gilt dies nicht auch für die anderen Wechselrichter von Sofar funktionieren, die das -g3 Template benutzen. Im Code von Solax_Modbus sehe ich keine anderen Register für die anderen Wechselrichter. ( Insbesonder HYD xKTL-3PH ) ?!?!

Zwer2k commented 2 months ago

Genau, sollte nicht eigentlich sofarsolar-g3.yaml angepasst werden? Bei mir tauchen die Einstellungen nicht auf. Ich glaube auch, dass mit der Anpassung die Register einzeln geschrieben werden, das wird vermutlich nicht funktionieren. Damit es funktioniert, sollten aber 3 Register gleichzeitig geschrieben werden. Hier noch mein Diskussionsbeitrag als Querverweis https://github.com/evcc-io/evcc/discussions/15722#discussion-7098388

Frintrop commented 2 months ago

Sollen wir ein neues Ticket aufmachen für das sofarsolar-g3.yaml Template ? @andig @cschlipf ?

andig commented 2 months ago

Jetzt wäre es doch prima, diesen PR überhaupt mal zu testen. Dann können wir ihn ja einfach kopieren falls die Register identisch sind.

sahomm commented 2 months ago

Werde ich machen. Bin aber nicht vor Donnerstag am HYD

Zwer2k commented 2 months ago

Das sofarsolar.yaml Template scheint zu HYD 10KTL-3ph nicht zu passen


[site  ] ERROR 2024/09/24 19:17:46 battery 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:17:55 pv 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:17:56 battery 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:18:06 pv 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:18:06 battery 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:18:15 pv 1 power: read failed: modbus: exception '2' (illegal data address), function '3'
[site  ] ERROR 2024/09/24 19:18:16 battery 1 power: read failed: modbus: exception '2' (illegal data address), function '3'```
cschlipf commented 2 months ago

Genau. Das wurde im falschen Template eingebaut. Der HYD braucht das G3 Template. Ich wurde empfehlen den PR zu reverten. Die Register der alten Wechselrichter sind komplett anders. So kann ich das auch leider nicht testen.

andig commented 1 month ago

Neues Nightly in 20min

brandsb commented 1 month ago

Hello, I'm trying to accomplish the same thing (first aid topic #15798) but for the HYD5000-ES inverter. The addresses don't match with those of the sofarsolar nor with the G3 template. I've posted the modbus comms documentation Here

I got the grid, pv & battery reads covered. Only the battery control is getting the better of me...

Anyone able to assist me on this? thx!

sahomm commented 1 month ago

Hier das versprochene Feedback... Setup: HYD 15 KTL mit 20kw BTS Batterie EVCC-Version: 0.130.12+1727247451

Szenario:

  1. Fahrzeug anschließen im PV-Mode
  2. Umschalten auf Schnell
  3. nach ca 2 Minuten zurück auf PV

Ergebnis:

[site ] ERROR 2024/09/25 20:22:31 battery mode: modbus: response data size '18' does not match count '4'

Das Log hänge ich an, SKI.Keys wurden entfernt.

Vielen Dank für eure tolle Arbeit!

Saho evcc-20240925-204241-debug-no-ski.log

wardwygaerts commented 1 month ago

I have a HYD 5000-EP, and getting this error when trying to charge my battery from the grid:

[site ] ERROR 2024/09/25 21:14:01 battery mode: modbus: response data size '18' does not match count '4'
sahomm commented 1 month ago

@wardwygaerts yes, that is also my observation (see the post before), but switching off the battery works!

wardwygaerts commented 1 month ago

@sahomm sorry, didn't saw your last post. As soon as I set it to charge from the grid, the Storage Mode indeed changes to Self Use. Other question: if it would work, with how much watts will it charge the battery?

cschlipf commented 1 month ago

@sahomm and @wardwygaerts

You both are using the LSE-3, right? Then this response is expected as the LSE-3 os returning in invalid response length on write. See https://www.photovoltaikforum.com/thread/217362-sofar-hyd-serie-kommunikation-%C3%BCber-modbus-tcp-erfahrungen/?postID=3873925#post3873925

@andig Any change we could change the severity of this message to a warning? It's still working fine.

andig commented 1 month ago

If modbus is a marketed feature then thats a bug and should be fixed. We cannot just ignore arbitrary messages.

wardwygaerts commented 1 month ago

You both are using the LSE-3, right?

I am yes. Currently I don't have a car connected, so I'm only trying to use it to charge my home battery. But when setting a high price limit (higher than my tarriff), nothing happens (except setting storage mode to Self Use, of this was not the case), only this error.

cschlipf commented 1 month ago

If modbus is a marketed feature then thats a bug and should be fixed. We cannot just ignore arbitrary messages.

Not sure it's a marketed feature of the LSE-3. I think it's rather unofficial.

Please note that I did not say 'ignore'. That would be wrong and I agree. My suggestion was just to lower the severity to Warning. In general an invalid response to a write request does not necessarily mean it's a hard error.

andig commented 1 month ago

It does. It means the write did not succeed in the general case.

Frintrop commented 1 month ago

You both are using the LSE-3, right?

I am yes. Currently I don't have a car connected, so I'm only trying to use it to charge my home battery. But when setting a high price limit (higher than my tarriff), nothing happens (except setting storage mode to Self Use, of this was not the case), only this error.

@cschlipf Did you try to load the battery ?

PeterPablo commented 1 month ago

there might be a regression, related to introduction of battery control, ref. #16432

Zwer2k commented 1 month ago

I use waveshare adapters for communication, but I still get the error messages in the log. The system switches between passive mode and selfuse mode, but the values for passive mode are not adjusted. I think the values are sent separately to the inverter and not as a data packet as the inverter expects

Pitchen84 commented 1 month ago

Hier das versprochene Feedback... Setup: HYD 15 KTL mit 20kw BTS Batterie EVCC-Version: 0.130.12+1727247451

Szenario:

  1. Fahrzeug anschließen im PV-Mode
  2. Umschalten auf Schnell
  3. nach ca 2 Minuten zurück auf PV

Ergebnis:

  • Das Fahrzeug wurde erkannt und nicht geladen, da kein PV-Überschuss. >> OK
  • Nach Umschaltung auf "Schnell" wurde das Fahrzeug geladen und der Akku abgeschaltet (HYD im Passive-Mode) >> OK Hier wird aber zyklisch folgende Fehlermeldung geworfen:

[site ] ERROR 2024/09/25 20:22:31 battery mode: modbus: response data size '18' does not match count '4'

  • Die Umschaltung zurück auf PV wird von EVCC ordnungsgemäß durchgeführt, die Umschaltung des HYD auf "SelfUse" um die Akkunutzung wieder zu aktivieren jedoch nicht. >>notOK

Das Log hänge ich an, SKI.Keys wurden entfernt.

Vielen Dank für eure tolle Arbeit!

Saho evcc-20240925-204241-debug-no-ski.log

Bei mir verhält es sich exakt genau so.

andig commented 1 month ago

@Pitchen84 Lse3? Laut https://github.com/evcc-io/evcc/issues/12220#issuecomment-2375131718 geht das nicht, also bitte an den Hersteller wenden.

Und: gibts nur Fehler oder wird nicht umgeschaltet?

cschlipf commented 1 month ago

@andig

Es fliegen nur Fehler wegen der ungültigen Response des LSE-3. Es wird aber durchgeführt. Die Error Logs kann man im Sofar Fall also ignorieren. Die Umschaltung auf Passive funktioniert ja.

Prinzipiell funktioniert es ja, nur bei schalten auf Self Use scheint noch ein Problem zu sein.

cschlipf commented 1 month ago

Also hier der Case 1 (funktioniert nicht) sollte genau dasselbe machen wie Case 2 (funktioniert). Nur eben mit dem Wert 0 (self-use), statt 3 (passive)

    switch:
    - case: 1 # normal
      set:
        source: const
        value: 0 # self-use
        set:
          source: modbus
          {{- include "modbus" . | indent 8 }}
          register:
            address: 0x1110
            type: writemultiple
            decode: int16
    - case: 2 # hold
      set:
        source: sequence
        set:
        - source: const
          value: 3 # passive
          set:
            source: modbus
            {{- include "modbus" . | indent 10 }}
            register:
              address: 0x1110
              type: writemultiple
              decode: int16

Dinge die mir hier auffallen:

andig commented 1 month ago

Int/uint ist bei positiven Werten egal. case 1 braucht keine Liste weil nur 1 Wert gesetzt wird, in allen anderen Cases aber mehrere.

Prinzipiell funktioniert es ja, nur bei schalten auf Self Use scheint noch ein Problem zu sein.

Das Problem hier ist dann ein rein optisches? Was spricht dagegen, sich einfach an den Hersteller zu wenden? Hat das überhaupt schonmal jemand probiert?

Zwer2k commented 1 month ago

Also hier der Case 1 (funktioniert nicht) sollte genau dasselbe machen wie Case 2 (funktioniert). Nur eben mit dem Wert 0 (self-use), statt 3 (passive)

    switch:
    - case: 1 # normal
      set:
        source: const
        value: 0 # self-use
        set:
          source: modbus
          {{- include "modbus" . | indent 8 }}
          register:
            address: 0x1110
            type: writemultiple
            decode: int16
    - case: 2 # hold
      set:
        source: sequence
        set:
        - source: const
          value: 3 # passive
          set:
            source: modbus
            {{- include "modbus" . | indent 10 }}
            register:
              address: 0x1110
              type: writemultiple
              decode: int16

Dinge die mir hier auffallen:

  • Case 1 ist keine Liste unter set:. Fehlt hier ein - vor source: const?
  • Laut Protokoll ist das Register 0x1110 ein uint16 wert. Aber warum tut dann Case 2?

Mit dem fehlenden - in Case 1 wirst du recht haben, es wird vermutlich dadurch einfach nicht ausgeführt. Es gibt auch keine Fehlermeldung im Log. In Case 1 wird zwar "pasive mode" mit dem Register 0x1110 gesetzt, die Leistungswerte werden aber nicht angepasst, d.h. Register 0x1187, 0x1189 und 0x118b bleiben unverändert und es wird eine Fehlermeldung im battery mode: modbus: exception '3' (illegal data value), function '16' geworfen. Wie gesagt, ich verwende Waveshare nicht LSE3 Es ist wichtig, dass die 3 Register mit einem Befehl an den WR geschickt wird und nicht mit 3 einzelnen aufrufen, anderer falls wird vom WR ein Fehler zurück gegeben.

Hier sieht man, dass die 3 Werte nicht verändert worden sind, sondern auf meine vor eingestellten Werten geblieben sind. Hier hatte ich auch schon das Schnellladen wieder ausgeschaltet, d.h. Modus hätte sich wieder auf "self use" ändern sollen. image

cschlipf commented 1 month ago

Dann verstehe ich ehrlich gesagt nicht, warum Case 1 nicht funktioniert, aber Case 2.

Ja, ist ein rein optisches Problem im Log. Deswegen habe ich oben ja vorgeschlagen das in eine Warning zu ändern, aber ich verstehe auch Deine Argumente dagegen.

Ich habe das schon an meine Kontakte von Sofar Deutschland weitergeleitet. Aber

andig commented 1 month ago

Der LSE-3 Stick wird nicht von Sofar hergestellt, sondern von einem dritten Hersteller (IGEN Tech, Solarman), welcher auch noch andere Wechselrichter unterstützt.

Das ändert nix dran, dass das Teil Schrott ist. Dann bei diesem Hersteller beschweren.

Die von Sofar unterstützte Schnittstelle ist RS 485.

...oder einfach auf eine funktionierende Schnittstelle umsteigen. Wir halten fest: evcc funktioniert wie erwartet.

In Case 1 wird zwar "pasive mode" mit dem Register 0x1110 gesetzt, die Leistungswerte werden aber nicht angepasst, d.h. Register 0x1187, 0x1189 und 0x118b bleiben unverändert und es wird eine Fehlermeldung im battery mode: modbus: exception '3' (illegal data value), function '16' geworfen. Wie gesagt, ich verwende Waveshare nicht LSE3 Es ist wichtig, dass die 3 Register mit einem Befehl an den WR geschickt wird und nicht mit 3 einzelnen aufrufen, anderer falls wird vom WR ein Fehler zurück gegeben.

@Zwer2k das ist spannend. Die Vorgabe war:

Energystorage mode auf Self-Use setzen: U16 Register 1110 auf 0

Du sagst das funktioniert so nicht? Was muss stattdessen geschrieben werden? Dann frage ich mich natürlich auch, warum es bei einigen Anwendern anscheinend funktioniert???

Pitchen84 commented 1 month ago

@Pitchen84 Lse3? Laut #12220 (comment) geht das nicht, also bitte an den Hersteller wenden.

Und: gibts nur Fehler oder wird nicht umgeschaltet?

LSE3, HYD15 KTL mit 10 kWh BTS und 61er Firmware

andig commented 1 month ago

Der LSE-3 Stick wird nicht von Sofar hergestellt, sondern von einem dritten Hersteller (IGEN Tech, Solarman), welcher auch noch andere Wechselrichter unterstützt.

@cschlipf was mich jetzt wirklich irritiert ist der Text im Template:

Es wird empfohlen die Verbindung über einen LSE-3 Logger Stick mittels ModBus TCP herzustellen (LSW-3 WLAN Stick wird nicht unterstützt). Bei seriellem Anschluss via RS485 mit entsprechendem Adapter am COM Port ist zu beachten, dass wechselrichterseitig für eine Terminierung des RS485 Busses zu sorgen ist.

Wenn der LSE Schrott ist müssten wir das korrigieren?

Zwer2k commented 1 month ago

Case 1 (also zurückschalten auf "self use") funktioniert bei mir nicht. So wie ich es verstanden habe, auch bei anderen funktioniert es nicht. Aus meiner Sicht liegt es so wie @cschlipf beschrieben hat an fehlenden - in Template image

cschlipf commented 1 month ago

@andig Wie gesagt - es ist nur eine falsche Fehlermeldung. Es tut ja trotzdem.

Energystorage mode auf Self-Use setzen: U16 Register 1110 auf 0

Doch, das ist richtig. Und dieses eine Register kann auch alleine für sich geschrieben werden. Ich verstehe daher nicht, warum der Self-Use nicht wieder aktiviert wird. Wie gesagt: Meine Vermutung war die fehlende Liste.

Hier nochmal die Specs:

image

Was 0x1187, 0x1189 und 0x118b betrifft: Hier ist offensichtlich das Problem, dass diese nicht zusammen in einer Write Operations geschrieben werden:

image

(siehe letzte Spalte unter Remarks)

cschlipf commented 1 month ago

Der LSE-3 Stick wird nicht von Sofar hergestellt, sondern von einem dritten Hersteller (IGEN Tech, Solarman), welcher auch noch andere Wechselrichter unterstützt.

@cschlipf was mich jetzt wirklich irritiert ist der Text im Template:

Es wird empfohlen die Verbindung über einen LSE-3 Logger Stick mittels ModBus TCP herzustellen (LSW-3 WLAN Stick wird nicht unterstützt). Bei seriellem Anschluss via RS485 mit entsprechendem Adapter am COM Port ist zu beachten, dass wechselrichterseitig für eine Terminierung des RS485 Busses zu sorgen ist.

Wenn der LSE Schrott ist müssten wir das korrigieren?

Bisher haben wir nur ausgelesen. Da funktioniert der LSE-3 wunderbar und ist die einfachste Methode. Beim Schreibzugriff kommt eben der falsche Response Code zurück - das ist nicht schön. Aber nochmal: Das hat nun mit den Problemen hier nichts zu tun. In Home Asssistant ignoriere ich den fehlerhaften Return Code eben und es tut alles.

RS485 ware die sauberste Methode. Ja. Nur ist das eben für unbedarfte einiges an zusätzlicher Komplexität: Richtige Terminierung, richtige Verkabelung, kompatiblen Adapter finden (hier gibt es zig Forumspost dazu), korrekte Adaptereinstellungen,... wenn das alles passt, die bessere Lösung - nur kannst das halt nicht jedem zumuten.

andig commented 1 month ago

Wie gesagt: Meine Vermutung war die fehlende Liste.

Da gibts nix zu vermuten. Ob das passiert ist ja im Logfile zu sehen. Und es wird ja geschrieben denn sonst gäbe es den Fehler nicht.

Was 0x1187, 0x1189 und 0x118b betrifft: Hier ist offensichtlich das Problem, dass diese nicht zusammen in einer Write Operations geschrieben werden:

Verstehe ich- auch bei gutem Willen- nicht. Das mag so sein. Aber: Wollen wir jetzt diskutieren, dass das Feature gar nicht funktioniert? Das habe ich zumindest oben noch nicht raus hören können.

Long story short: ich hab keinen Überblick mehr, worum es hier eigentlich geht und würde mich daher ausklingen. Fehlerhafte Hardware/Firmware ist bitte beim Hersteller zu reklamieren.

In Home Asssistant ignoriere ich den fehlerhaften Return Code eben und es tut alles.

Prima. Dann ist das die Lösung. Die Alternative habe ich jetzt schon x-mal beschrieben und die besteht darin ein fehlerhaftes Produkt zu reklamieren.

cschlipf commented 1 month ago

Also ich sehe aktuell 2 Fehler:

Zwer2k commented 1 month ago

Wie gesagt: Meine Vermutung war die fehlende Liste.

Da gibts nix zu vermuten. Ob das passiert ist ja im Logfile zu sehen. Und es wird ja geschrieben denn sonst gäbe es den Fehler nicht.

Das ist es ja, in case 1 gibt es keine Fehlermeldung. Fehler Wird nur in case 2 geworfen, wegen der falschen Behandlung von den 3 Registern (0x1187, 0x1189 und 0x118b).

andig commented 1 month ago

@cschlipf @Zwer2k erlaubt die Doku auch die beiden letzten Register zusammen zu schreiben? Liest sich für mich so. Dann könnte auch https://github.com/evcc-io/evcc/pull/16509 helfen. Auch das müsste aber mal jemand probieren...

Drei Register zu schreiben gibt unsere Modbuslösung aktuell nicht her, dann müssten wir das Feature reverten.

andig commented 1 month ago

@Zwer2k du trägst leider auch nicht zur Klarheit bei. Erst hiess es:

Case 1 (also zurückschalten auf "self use") funktioniert bei mir nicht.

und jetzt:

Fehler Wird nur in case 2 geworfen, wegen der falschen Behandlung von den 3 Registern (0x1187, 0x1189 und 0x118b).

Das ist ein Supportalptraum!