Netzdienliche Steuerung PV

Warum Netzdienlichkeit, was ist das?

Die Energiewende bringt eine fundamentale Herausforderung mit sich: Unser Stromnetz wurde für zentrale Erzeugung gebaut, nicht für Millionen dezentraler Solaranlagen. Genau hier kommt Netzdienlichkeit ins Spiel – Netzdienlichkeit ist ein Konzept, bei dem die dezentralen Solaranlagen aktiv zur Netzstabilität beitragen.

Das Problem:

  • Vormittags laden Millionen PV-Anlagen ihren Speicher voll, obwohl es Strombedarf im Netz gibt.
  • Mittags speisen Millionen PV-Anlagen gleichzeitig Strom ins Netz ein, da ihr Speicher voll ist.
  • Dies führt zu Netzüberlastungen und teurem Redispatch

Die Lösung: Netzdienliches Verhalten

  • Statt den Speicher erst zu laden, unterstützen wir das Netz
  • Morgens: PV-Überschuss einspeisen (statt Batterie zu laden) → dämpft die Morgenlastspitze
  • Nachmittags: Batterie mit lokalem Überschuss laden → entlastet das Netz bei der Mittagsspitze
  • Ergebnis: Weniger Netzausbau, stabileres System, geringere Systemkosten

Die Automatisierung der PV-Anlage

verwendete Home Assistant Entitäten

  1. PV-Prognose (Solcast-Integration)
    • sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute: Prognose für die Rest-PV-Energie des Tages
    • sensor.solcast_pv_forecast_zeitpunkt_spitzenleistung_heute: Zeitpunkt der maximalen Leistung der eigenen PV-Anlage
  2. Batteriemanagement
    • sensor.deye8k_battery: Aktueller Ladestand des eigenen PV-Speichers
    • number.deye8k_battery_max_charging_current: Steuerung des Ladestroms der eigenen Batterie

Die Logik der Automatisierung im Detail

Schlüsselentscheidungen:

  1. Vor der PV-Spitze (morgens):
    • „Kann ich die Batterie später noch voll bekommen?“ → Nur wenn die Prognose knapp ist, wird geladen
    • Sonst: Einspeisung priorisieren → Entlastung der Morgenspitze mit Netzbezug
  2. Nach der PV-Spitze (nachmittags):
    • Batterie laden ->Entlastung der Mittagsspitze mit PV-Überschuss
  3. Sicherheitsfaktor (10%):
    • Berücksichtigt Umwandlungsverluste
    • Puffer für Prognoseungenauigkeiten

Konfigurationsanleitung für Home Assistant

Voraussetzungen:

  • Solcast-Integration, oder ähnliche PV-Vorhersage
  • Batterie Sensor für den Füllstand der Batterie
  • Möglichkeit das Laden der Batterie zu steuern

Schritt-für-Schritt:

  1. Neue Automatisierung anlegen
  2. YAML-Code einfügen:

Die eigenen Werte für den PV-Speicher können in der Automatisierung angepasst werden.

variables:
  battery_capacity: 10.0    # Batteriegröße in kWh
  max_charge_current: 100   # Maximalstrom WR
  max_fill_level: 99.5      # Maximaler Füllstand der Batterie in %
  safety_factor: 1.1         # Bei ungenauen Prognosen erhöhen
alias: Netzdienliche Batterieladesteuerung
description: Regelt Ladeleistung basierend auf Tageszeit, Batteriestand und PV-Prognose
triggers:
  - minutes: /45
    trigger: time_pattern
  - entity_id:
      - sensor.deye8k_battery
      - sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute
      - sensor.solcast_pv_forecast_zeitpunkt_spitzenleistung_heute
    trigger: state
actions:
  - variables:
      battery_level: "{{ states('sensor.deye8k_battery') | float }}"
      remaining_pv: >-
        {{
        states('sensor.solcast_pv_forecast_prognose_verbleibende_leistung_heute')
        | float }}
      peak_time_str: >-
        {{ states('sensor.solcast_pv_forecast_zeitpunkt_spitzenleistung_heute')
        }}
      battery_capacity: 25
      max_charge_current: 185
      max_fill_level: 99
      safety_factor: 1.1
      needed_energy: "{{ (battery_capacity * (100 - battery_level) / 100) }}"
      peak_time_ts: >-
        {{ as_timestamp(peak_time_str) if peak_time_str not in ['unknown',
        'unavailable', ''] else none }}
      is_after_peak: |-
        {% if peak_time_ts != none %}
          {{ now().timestamp() > peak_time_ts }}
        {% else %}
          false
        {% endif %}
  - if:
      - condition: template
        value_template: "{{ battery_level >= max_fill_level }}"
    then:
      - target:
          entity_id: number.deye8k_battery_max_charging_current
        data:
          value: 0
        action: number.set_value
    else:
      - if:
          - condition: template
            value_template: "{{ not is_after_peak }}"
        then:
          - if:
              - condition: template
                value_template: "{{ (remaining_pv * safety_factor) < needed_energy }}"
            then:
              - target:
                  entity_id: number.deye8k_battery_max_charging_current
                data:
                  value: "{{ max_charge_current }}"
                action: number.set_value
            else:
              - target:
                  entity_id: number.deye8k_battery_max_charging_current
                data:
                  value: 0
                action: number.set_value
        else:
          - target:
              entity_id: number.deye8k_battery_max_charging_current
            data:
              value: "{{ max_charge_current }}"
            action: number.set_value
mode: single

Warum machen wir das?

  1. Praktischer Klimaschutz:
    • Reduziert Netzausbaukosten
    • Ermöglicht höheren PV-Zubau ohne Netzengpässe
  2. Wirtschaftlicher Vorteil: (Wenn die Pläne zu dynamischen Netzentgelten umgesetzt werden)
    • Höhere Einspeisevergütung durch gezielte Einspeisung
    • Vermeidung teuren Netzausgleichsstroms
    • Höhere Einspeisevergütung durch gezielte Einspeisung
    • Vermeidung teuren Netzausgleichsstroms
  3. Technische Eleganz:
    • Nutzt vorhandene Hardware intelligent
    • Keine zusätzlichen Investitionen nötig

Netzdienlichkeit ist kein Verzicht, sondern intelligente Kooperation mit dem System.

5 Gedanken zu „Netzdienliche Steuerung PV“

  1. Vielen Dank für die Veröffentlichung!

    Das ist sicher eine wesentliche Verbesserung gegenüber einer Steuerung, die einfach nur den Speicher füllt, bis er voll ist und danach ins Netz einspeist. Aber noch besser erscheint mir, sich die day-ahead-Preise der Strombörse zu besorgen und dann die Batterie zu laden, wenn der Strompreis am niedrigsten ist bzw. dann ins Netz einzuspeisen, wenn er am höchsten ist. Die day-ahead-Preise in 96 slots zu je 15 min. bekommt man z.B. mit einem GET auf: https://api.energy-charts.info/price?bzn=DE-LU&start=2026-03-05
    Am Abend kann man sich damit eine ziemlich gute Prognose des Folgetags besorgen.

    Antworten
    • Stimmt, aber dann wird es komplex. Der Einkaufspreis allein wäre ja nicht das Kriterium, die Logik, wie bekomme ich meine Speicher bei einem BörsenTarif möglichst kostengünstig voll bzw. voll genug für den nächsten Tag, muss noch mit dem durchschnittlichen Stromverbrauch des nächsten Tages, der PV-Prognose usw. abgeglichen werden. Und dass dann alle 15min? Das war nicht mein Ziel.
      Ich habe z.B. einen dynamischen Stromtarif mit Zeitfenstern mit unterschiedlichen Preisen.
      Und ich wollte eine schlanke Regelung, die viele auch durchschauen veröffentlichen, damit vielleicht der ein oder andere mitmacht und dem System hilft.
      Für mich mit WP und dynamischen Stromtarif arbeite ich auch gerade an einem AddOn, dass dann die komplexere Steuerung realisieren kann.

      Antworten
      • Ja es stimmt, dass mit einem solchen Ansatz eine gewisse Komplexität entsteht. Angenommen morgens um 6:00 Uhr werden alle Prognosen des kommenden Tages eingeholt:
        – die Strompreise,
        – die Temperaturen (wegen des Wärme- bzw. Kühlungsbedarfs und für die Vorhersage des COP der Wärmepumpe)
        – die Sonneneinstrahlung

        Periodisch in kurzen Äbständen werden die aktuelle Stromerzeugung, der aktuelle Stromverbrauch und die aktuellen Speicherkapazitäten ermittelt:
        – der Ladezustand der Batterie (falls vorhanden),
        – der Ladezustand der Autobatterie (falls vorhanden)
        – der Ladezustand des Pufferspeichers für Heizung und Trinkwasser (falls vorhanden)

        Mit diesen Informationen lässt sich einiges optimieren:
        – den Eigenverbrauch des Solarstroms maximieren, indem die Verbraucher koordiniert werden (das ist relativ einfach),
        – die Einspeisung ins Netz auf Zeiten mit Strombedarf (hohem Börsenpreis) legen,
        – den Bezug von Strom aus dem Netz auf Zeiten mit hohem Angebot (niedrigem Börsenpreis) legen.

        Tatsächlich stellt sich die Situation für jeden Haushalt anders dar. Der eine hat eine Wärmepumpe und einen Pufferspeicher, aber keinen Solarstrom, der andere Solarstrom und ein E-Auto, aber keine Wärmepumpe.

        Im Idealfall hat man einen dynamischen Stromtarif, bei dem ein fixer Preis (typisch ca. 18 ct / kWh) und zusätzlich der aktuelle Börsenpreis verrechnet wird.

        Wenn es gelingt, eine solche Steuerung im Home Assistant anzubieten, dann schafft man für die Nutzer einen echten finanziellen Mehrwert und für das Stromnetz eine wesentliche Entlastung.

        Ich stelle mir eine Software vor, die aus zwei Komponenten besteht. Einmal am Tag werden die Prognosen zusammengetragen. Anschließend läuft periodisch alle paar Minuten ein Programm, das die Optimierung übernimmt und in einer Kombination aus aktuellen Bedürfnissen und Prognosen die Geräte steuert. Dazu gehört auch, die idealen Slots zu finden (sortieren nach Preis), um Strom zu beziehen oder einzuspeisen.

        Ihre Steuerung für die Wärmepumpe ist einer der Bausteine, die dafür benötigt werden. Man bräuchte Zugriff auf alle Komponenten.

        Ich versuche derzeit einen sehr speziellen Fall zu optimieren: In einem denkmalgeschützten Gebäude einer Kirchengemeinde gibt es eine Pelletheizung, einen großen Pufferspeicher (1.600 l), eine kleine Wärmepumpe (2,5 kW), aber keinen Solarstrom. Heizung (Heizkörper und hohe Vorlauftemperatur) und Warmwasser werden zentral aus dem Pufferspeicher versorgt. Nur in der Übergangszeit und im Sommer kann die Wärmepumpe zu konkurrenzfähigen Preisen (gegenüber dem Pelletkessel) Wärme erzeugen. Die Steuerungsoptimierung ist überschaubar komplex und auch bereits kodiert. Ich benutze den Preis für eine kWh Wärme als Vergleichs- und Optimierungsgröße. Derzeit fehlt mir aber der Zugriff auf die Wärmepumpe (Firma KWB).

        Antworten

Schreibe einen Kommentar

Diese Website verwendet Akismet, um Spam zu reduzieren. Erfahre, wie deine Kommentardaten verarbeitet werden.