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.

Mein Balkonkraftwerk

BKW

Wir verbrauchen schon wirklich wenig Strom, der Jahresbedarf liegt bei 1500 kWh, aber ich wollte zum einen mit Photovoltaik herumspielen und auch meinen eigenen Strom erzeugen.
Da wir unsere alte Gasheizung gegen eine Wärmepumpe austauschen wollen, wird demnächst dann auch eine große PV-Anlage auf unser Dach kommen.

die Hardware

Da es eher ein Test war, habe ich mich für ein ganz einfaches und kostengünstiges Gesamtset entschieden. Dafür war es echt günstig, ich habe nur 379,-€ für das Set bezahlt. Noch steht es provisorisch auf der Terrasse, es wird aber auf das Dach vom Gartenhaus kommen, wenn wir das Dach repariert haben. Das Set besteht aus:

  • 2 Module a 375 Wp
  • ein Deye SUN800-G3-EU Wechselrichter
  • ein einfache Befestigung für den Boden

Da mir der Datenlogger, der bei dem Wechselrichter dabei ist, zu selten Daten liefert, habe ich dann noch einen Shelly 3 Mini PM zur Messung der PV Leistung in die Zuleitung gebaut.

Aufbau des BKW

So ein Set aufzubauen ist recht einfach. Alle Einzelteile haben Stecker, die ein Verwechseln fast unmöglich machen und im Netz gibt es Unmengen Anleitungen mit Videos.
Schwieriger fand ich den Aufbau der Haltung. Da ich die Halterung nicht fest auf der Terrasse verschrauben wollte, mussten 120 Kg zum Beschweren her, damit das Modul bei Sturm nicht wegfliegen kann.
Kleiner Hinweis, fragt eure Privathaftpflichtversicherung, meine würde ggf. Schäden übernehmen, falls meine Module mal fliegen gehen. 🙂

Die Solarman Integration

Die Integration für Home Assistant ist über den HACS zu bekommen.

Bei der Einrichtung müsst ihr ein bisschen mit den Templates herumspielen. Bei mir wurde der Wechselrichter deye 800 mit 2 Modulen nur von der älteren Solarman Version 1.4.3 erkannt und auch nur, wenn ich das Template für einen Deye Wechselrichter mit 4 Modulen ausgewählt habe. 🙁
Im Netz sind aber viele Anleitungen zu dem Problem zu finden.


Ansonsten, IP-Adresse des DatenLoggers angeben, die Seriennummer und danach stehen die Werte in Home Assistant zur Verfügung.

Die Integration bietet sehr viele Werte an, mich haben jetzt „nur“ die Werte zu der erzeugten PV-Leistung interessiert.

Im Endeffekt verwende ich nur noch den Status, die gesamt erzeugten kWh und über den Shelly die gerade erzeugte Leistung.

Einbindung in Energie Dashboard

Ich habe ja einen Shelly zur Messung der erzeugten PV-Leistung eingebaut, dieser liefert jetzt einen negativen Wert.

Daher habe ich mir einen Helper gebaut, der den Wert mit -1 multipliziert.

Den Helper nutze ich dann auch für mein eigenes Dashboard, den Shelly für das Energiedashboard von Home Assistant.

{{states.sensor.shellypmminig3_84fce636d384_power.state |float() * -1 }}

Mein eigenes Dashboard

Mein eigenes Dashboard hat eine Unterseite Energie, in der ich die Verbrauchswerte des Shelly 3EM anzeige und jetzt auch die Werte der PV-Anlage.

Folgende Werte habe ich im Dashboard:

  • gerade erzeugte Leistung der PV
  • tägliche Maximalleistung der PV
  • Maximale Leistung der PV
  • Gesamtproduktion
  • und natürlich die Werte des Shelly 3EM mit dem Verbrauch

Die beiden Werte zur maximalen Leistung sind über zwei Helper realisiert, die anderen Werte kommen direkt aus den Integrationen.

täglicher Maximalwert der PV

Den Wert ermittele ich mit einem getriggertem TemplateSensor, hier gibt es die HilfeSeite dazu. Dazu muss der Code in die configuration.yaml. Der Sensor gibt den höchsten ermittelten Wert des „sensor.bkwshelly“ zurück und der Wert wird jede Nacht um 0:00 Uhr zurückgesetzt.

template:

  - trigger:
      - platform: time
        at: "00:00:00"
      - platform: state
        entity_id: sensor.bkwshelly
    sensor:
      - name: "todays max PV"
        unique_id: today_max_pv
        unit_of_measurement: "W"
        device_class: power
        availability: "{{ states('sensor.bkwshelly') | is_number}}"
        state: >
          {% set t_new = states('sensor.bkwshelly') | float(-99) %}
          {{ [t_new, this.state | float(-99)] | max if trigger.platform != 'time' else t_new }}
        attributes:
          power_updated: "{{ now() | as_local }}"

maximaler Wert der PV

Um den höchsten dagewesenen Wert eines Sensors zu ermitteln, gibt es den Statistik Sensor. Da ich meine Sensoren in eine eigene sensor.yaml ausgelagert habe, hier der Code dazu. Wenn ihr eure Sensoren noch in der configuration.yaml habt, muss der Code natürlich in den Abschnitt „sensor:“

- platform: statistics
  name: "PV power MAX"
  unique_id: pv_max
  entity_id: sensor.bkwshelly
  state_characteristic: value_max
  max_age:
    days: 1000
Datenschutz
Ich, Guido Jeuken (Wohnort: Deutschland), würde gerne mit externen Diensten personenbezogene Daten verarbeiten. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht mir aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, treffen Sie bitte eine Auswahl:
Ich, Guido Jeuken (Wohnort: Deutschland), würde gerne mit externen Diensten personenbezogene Daten verarbeiten. Dies ist für die Nutzung der Website nicht notwendig, ermöglicht mir aber eine noch engere Interaktion mit Ihnen. Falls gewünscht, treffen Sie bitte eine Auswahl: