Marstek B2500 Batteriespeicher

Was geht damit? Das Firmwareupdate? Die Einspeisung pro Kanal mit mehr als 400?

Wenn ja, wie?

Ja, mit OpenDTU-onBattery kann ich jetzt mehr einspeisen, wenn ich mehr ziehe.

In den Dynamic Power Limiter Einstellungen habe ich Maximales Leistungslimit auf 1200 W gestellt, was bei mir per Solar selten überhaupt erreicht wird und halb Batterie (max 800W) halb Solar auch nicht und jetzt habe ich auch bei höherem Bedarf 0 Verbrauch, wenn genug Sonne. Ich hätte auch 1600 W einstellen können aber weiß nicht ob das mit der Leitung nicht Probleme geben könnte. Müsste ja eigentlich gehen, mache ich vielleicht nächstes Sommer. Im Moment ist der Ertrag eh schon sehr schwach geworden.
So sind meine DPL Einstellungen grad:

Und das für den Stromzähler:

Das war etwas hakelig zu finden, weil ich erst über die Fehler gestolpert bin, die OoB wirft, weil mein Stromzähler im selben Topic auch L1, L2, L3 übermittelt, die OoB natürlich nicht interessieren.

Firmware Update geht mit OpenDTU-onBattery natürlich auch nicht, braucht man ja wie erwähnt einen Original DTU, der auch mit Hoymiles Zuhause telefonieren kann.

Wie genau ist denn der vom Akku gemeldete SoC bei euch so?
Wenn ich ~2 Zyklen, also so 4-5kWh durchlasse, ohne zwischendrin mal 100% zu erreichen, springt der Akku wenn er dann mal wieder voll wird durchaus von 80-85% direkt auf 100%. D.h. der Akku hatte 0,3-0,4kWh mehr drin als der SoC anzeigt.
Der Wh-SoC ist offensichtlich nur aus dem Prozentwert errechnet, also der ist exakt gleich dem %-Wert.
Wenn ich dagegen Bat-In und Bat-Out selbst in HA gegenrechne (einmal, wenn 100% erreicht waren mit einem entsrechendem Offset halt auf 2240Wh “eingestellt”), lag ich bisher maximal 35Wh daneben… Was entsprechend auf <2% genau war….

Bereits nach einmal von 100% auf 10% entladen, beträgt die Abweichung knapp 0,1kWh. Also statt den 224Wh die bei 10% drin sein sollten, sind es eher 300Wh.
Beim Aufladen scheint noch mehr “verloren” zu gehen. Werden dann laut Bat-In z.B. 1000Wh geladen, meldet der SoC nur 1100Wh, die manuelle Rechnung aber schon etwa 1300Wh. Also bereits da liegt der SoC schon um ~8% daneben.

Hallo

Ich habe auch einen ESP32 zum Auslesen des Marstek B2500 per Bluetooth genommen. So braucht man nicht in das Gerät eingreifen und bekommt auch keine Probleme mit Garantie/Gewährleistung. Funktioniert einwandfrei. Wie das geht steht hier: GitHub - tomquist/esphome-b2500 und hier: ESPHome for B2500.

Die Automation für die Nulleinspeisung (ich hab das aber auf Restbezug 20 Watt eingestellt, um ja nichts zu verschenken) hab ich mir von ChatGPT bauen lassen. Und ich muss sagen, was die KI hier geliefert hat, funktioniert seeeehr gut. Das ganze hat ein paar Stunden gedauert, aber selber hätte ich sowas niemals ! hinbekommen.

alias: Nulleinspeisung - inkrementeller PI mit Akku-Schutz (3s)
description: >
Inkrementeller PI-Regler: regelt alle 3s, max 200 W Sprungweite, 0–800 W. Nur
aktiv bei Akku > 20 %. Unter 20 % Akku wird auf festen Wert 125 W gesetzt.

triggers:

- seconds: /3
  trigger: time_pattern
  conditions:
- condition: state
  entity_id: input_boolean.nulleinspeisung
  state: “on”
- condition: template
  value_template: >-
  {{ states(‘sensor.energy_netzbezug’) not in
  \[‘unknown’,‘unavailable’,‘uninitialized’\] }}
  actions:
- choose:
  - conditions:
    - condition: template
      value_template: “{{ soc <= 20 }}”
      sequence:
    - target:
      entity_id: number.b2500_01_b2500_1_b2500_01_timer_1_output_power
      data:
      value: “{{ output_final | round(0) }}”
      action: number.set_value
    - data:
      entity_id: input_number.nulleinspeisung_integral
      value: “{{ integral_final }}”
      action: input_number.set_value
  - conditions:
    - condition: template
      value_template: “{{ soc > 20 }}”
      sequence:
    - target:
      entity_id: number.b2500_01_b2500_1_b2500_01_timer_1_output_power
      data:
      value: “{{ output_final | round(0) }}”
      action: number.set_value
    - data:
      entity_id: input_number.nulleinspeisung_integral
      value: “{{ integral_final | round(3) }}”
      action: input_number.set_value
      variables:
      sensor: “{{ states(‘sensor.energy_netzbezug’) | float(0) }}”
      setpoint: 10
      soc: “{{ states(‘sensor.b2500_01_b2500_1_b2500_01_battery_level’) | float(0) }}”
      prev_output: >-
      {{ states(‘number.b2500_01_b2500_1_b2500_01_timer_1_output_power’) |
      float(0) }}
      prev_integral: “{{ states(‘input_number.nulleinspeisung_integral’) | float(0) }}”
      kp: 0.5
      ki: 0.02
      dt: 3
      max_step: 200
      out_min: 0
      out_max: 800
      error: “{{ (sensor - setpoint) }}”
      integral_raw: “{{ (prev_integral + (error \* dt)) }}”
      delta_raw: “{{ (kp \* error) + (ki \* integral_raw) }}”
      delta_step: |
      {% if delta_raw > max_step %}
      {{ max_step }}
      {% elif delta_raw < -max_step %}
      {{ -max_step }}
      {% else %}
      {{ delta_raw }}
      {% endif %}
      tentative_output: “{{ (prev_output | float) + (delta_step | float) }}”
      clamped_output: “{{ \[out_min, \[tentative_output | float, out_max\] | min\] | max }}”
      integral_new: >
      {% set tentative = tentative_output | float %} {% set clamped =
      clamped_output | float %} {% if (clamped == tentative) and (clamped >
      out_min) and (clamped < out_max) %}
      {{ integral_raw }}
      {% else %}
      {{ prev_integral }}
      {% endif %}
      output_final: |
      {% if soc <= 20 %}
      125
      {% else %}
      {{ clamped_output }}
      {% endif %}
      integral_final: |
      {% if soc <= 20 %}
      0
      {% else %}
      {{ integral_new }}
      {% endif %}
      mode: single

:crayon:by HarryP: Code-/Logzeilen formatiert (bitte immer in </> einbinden)
s.a.: (Neues Update & Features - Hier in der Community 🫶)

nice.
Ich habs nur angelesen;
auf welchem Verbrauchswert regelst du? Und du lässt dann HA den B2500 den jeweiligen Wert einspeisen?

Weshalb emulierst du nicht einfach einen Shelly Pro Zähler und nutzt dann die im B2500 eingebaute Nulleinspeisung?

Wie funktioniert das eigentlich, wenn 2 (oder mehr) B2500 gekoppelt und über HA betrieben werden?

Dann hängt ja nur ein Output von Speicher 2 an einem Input von Speicher 1. Somit 2 Panels an Speicher 2 und nur ein Panel an Speicher 1. Und Speicher 1 schickt den Strom weiter zum Wechselrichter.

D.h. ich muss den Output von Speicher 2 und den Output von Speicher 1 manuell via HA “balancen”? Weil die reden ja dann sogesehen nicht direkt automatisch miteinander.

Ist das korrekt? Oder wie konfiguriert man das dann?

Den Fall hab ich bei mir nicht und mir noch keine Gedanken drüber gemacht, weil ich es effektiver finde, jedem Ausgang einen WR Eingang zu spendieren. Dann hat man auch gleich Platz für ein Panel mehr, was sich vor allem bei vollem Akku bemerkbar macht.

Die Option scheidet aus, denn es ist nicht erlaubt mehr als ein BKW (und damit Wechselrichter) in/an einem Haushalt zu betreiben.

Wo steht das?
Du kannst auf jedenfall konformer einen WR mit 4 Eingängen, der auf 800W Ausgang gedrosselt ist anschließen, als einen Akku. Akku ist nämlich Grauzone…

Ich verstehe zwar nicht so ganz, welche Probleme du mit deiner Config siehst, bin aber auf Erfahrungsberichte gespannt…

Ja, ich redete ja auch von Wechselrichter, nicht von 800W. Vielleicht ist es sogar eine Grauzone zwei Wechselrichter auf jeweils 400W gedrosselt zu betreiben. Aber mehr als 800W darf man nicht einspeisen (wenn es ein BKW bleiben soll).
Ich habe aber schon einen Wechselrichter und der ist auch nicht einstellbar. Für so ein Setup bräuchte ich also sogar zwei neue Wechselrichter.

Naja aktuell steuere ich ja nur den Output eines Speichers. Wenn mein Haushalt gerade 400W verbraucht, lasse ich dieseen halt 400W einspeisen.

Wenn ich jetzt 2 Speicher in Reihe schalte, so wie das ja bei 2 Speichern eigentlich vorgesehen ist, reden die ja (wenn man einen eigenen MQTT Server verwendet) nicht miteinander.
Erschwerend kommt hinzu, der Host-Speicher hat dann nur ein PV-Panel angeschlossen, der Client-Speicher hat zwei. D.h. der Client-Speicher lädt auch schneller auf.
Wenn mein Haushalt 400W braucht, lasse ich den Host-Speicher 400W einspeisen. Aber dem zweiten Speicher muss ich sagen, das er mehr als das doppelte der gerade benötigten Leistung ausgeben soll… zumindest wenn ich beide Speicher einigermaßen gleichmäßig auf- und entladen will… oder wie machen das andere? Das würde mich interessieren. Mich würde auch interessieren, wie die Speicher das im Original, also ohne eigenen MQTT so machen.

Oder steuert man das über den Host-Speicher irgendwie mit? Die MQTT-Integration hat ja da auch noch die per default deaktivierten Properties “Extra 1 Battery….” aber die sind soweit ich sehe read-only. Also selbst wenn man zwei Speicher kombiniert braucht man die nicht wirklich?

Das würde mich vorab interessieren, weil ich überlege ob ich mir einen zweiten Speicher hole. Zumal ich 4,4kWh durchaus brauchen könnte, aber auch weil ich dann ein drittes PV-Panel nutzen kann.

Brauchen sie ja auch nicht. Du sagst ja dem Master, dass er an Port2 kein Panel, sondern einen zweiten Akku hat.
Was in deinen WR rein soll, regelt nach wie vor der Master. Genau wie das, was er aus dem andren Akku anfordert.

Äh, nö.
Der steht immer auf “gib mir alles”.
Die Begrenzung geschieht über den Eingang des Master.

Wie soll das denn gehn?
Du willst doch nicht etwa den Masterakku durch entladen des Slave aufladen und doppelte Verluste und Abnutzung erzeugen?

Früher haben die Zusatzakkus P2500 (für die ist wohl auch die Anzeige der beiden Akkus in der app) über rs485 mit dem Master geredet.

Ah ok. Der Slave weiß das er Slave ist und dreht seine Funktionsweise quasi um. Er steht dann immer auf Passthrough, ausser der Master ist voll und speist weniger ein als reinkommt. Somit lädt immer erst der Master voll und erst wenn der voll ist, lädt der Slave überhaupt erst.

Aber dann lädt ja nachts der Slave trotzdem den Master. Weil dann ist der Master nicht voll und speist auch nicht die volle Leistung ein, nimmt also permanent Strom vom Slave an. Bzw. der Slave hält dann den Master geladen, bis der Slave leer ist. Das gibt also trotzdem doppelte Wandlungsverluste.

Aber ja, das macht wahrscheinlich Sinn und ist die einfachste Form der “Steuerung”, weil man eben nichts steuern muss. :grin:

Wie stelle ich beim Master ein, das er Master ist? Oder stelle ich eher beim Slave ein, das er Slave ist indem ich bei “Wechselrichter” eben “Akku” einstelle? Gibts die Option?

Aber moment mal… Der PV-Input am Master hat ja nur max. ca. 13,5A/55V. Wenn der Slave auf Passthrough schaltet, können also maximal knapp 800W zum Master übertragen werden… da bei Passthrough aber die Spannung nicht gewandelt wird, hab ich nur die PV-Spannung, also eher so 40V (540W). Also wenn ich 2x450W an den Slave hänge und der mit Passthrough arbeitet, dann kann ich ja die Panelleistung nichtmal voll abrufen und der Slave lädt nichtmal, weil ja Passthrough (ausser der Master ist voll). Das wäre dann ja das gleiche also würde ich die 2x450W parallel direkt an den Eingang des Master hängen.

So allmählich verstehe ich, warum das alles so suboptimal ist. :sweat_smile:

So hab ich es verstanden und fände es auch sinnvoll.

Nein, die Dinger haben ne Uhr und schalten Tag, Dämmerung, Nacht Modus.

In der App gibt es den Modus die Akkus zu koppeln.

Genau. Wie sich das Marstek gedacht hat, oder ob sie es vielleicht sogar gelöst haben, ist deren Geheimnis.
Vielleicht gibt es irgendwann mal genügend Leute die sich intensiv damit befasst haben und Experimentierzeit investieren.

Ich sehe die Teile eher als Pufferspeicher, damit man den variierenden Verbrauch kurzfristig ausgleichen kann und nicht in einem Moment Energie verschenkt und 10 Minuten später teuer kaufen muss. Und dazu genügen schon weniger als 2,5kWh.
Einen echten Batteriespeicher würde ich anders aufbauen.

Das sind sie ja im Prinzip auch. Ich hab nur das “Problem”, das wenn die Sonne mal scheint, spätestens wenn sie sogar mal an zwei Tagen hintereinander scheint, der eine Speicher oft schon vor Mittag wieder voll ist.

Für den Fall das die Sonne eher weniger scheint, wäre ein zweiter Speicher eher das Mittel zum Zweck für ein drittes Panel. Wenn mit 3 Panels die Sonne dann doch mal scheint, hätte ich aber zusätzlich auch gleich einen größeren Puffer. Mehr ist bei mir nicht möglich, ich habe nur noch maximal Platz für ein drittes Panel.

Der B2500 ist es bei mir geworden, weil ich
a) das BKW schon hatte und nur um Speicher erweitern wollte, also auch möglichst keine vorhanden Komponenten ersetzen wollte
b) Lösungen die nur mit Cloudanbindung funktionieren für mich generell ausscheiden
c) und natürlich der Anschaffungspreis

Das wird im Sommer quasi immer so sein.
Deshalb fange ich im Sommer meist erst mittags mit laden an.
Ich habe alle 3 Sorten Speicher. Den klassischen mit DC Ladereglern, den Saturn und den Venus.
Die letzten beiden nur wegen dem Preis…

Hallo,

Das hört sich interessant an. Brauche ich für jeden Akku einen ESP oder kann ein ESP mehrere Akkus händeln?

Einer kann alle…

Zwanzigzeichen

Danke für die Info. Bin gerade an der Konfiguration über den Link. Hast Du da was nachträglich manuell anpassen müssen? Ich will das über ESPHOME programmieren und bekomme eine Fehlermeldung. Hier stimmt was nicht:

  board: esp32dev
  variant: "esp32s3"
  flash_size: 4MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_FREERTOS_UNICORE: y
      COMPILER_OPTIMIZATION_SIZE: y

:crayon:by HarryP: Post formatiert

Du musst das korrekte Board auf der Webseite eintragen:


esp32:
  board: "esp32-s3-devkitc-1"
  variant: "esp32s3"
  flash_size: 8MB
  framework:
    type: esp-idf
    sdkconfig_options:
      CONFIG_FREERTOS_UNICORE: y
      COMPILER_OPTIMIZATION_SIZE: y

Im Code verändert habe ich nur die Variablen, die ich bei mir in der secrets stehn hab.
Das sollt ich vielleicht mal als featurerequest einreichen.