# Peak-Shave V01 – Vollständiger Inhalt

---

## Blatt: Info

**Aufgabe**

Passe den beigefügten Blueprint pv_peak_shave_v5.yaml an die Metabeschreibung in diesem Excel an.

**Vorgehen**

1. Lies zuerst das Excel vollständig.
2. Lies dann den bestehenden Blueprint vollständig.
3. Identifiziere die Unterschiede zwischen Blueprint und Excel.
4. Besprich jeden Unterschied mit dem Anwender bevor du Code schreibst.
5. Ändere den Blueprint-Namen nicht – er wird von anderen Automationen referenziert.

**Designphilosophie**

Dieser Algorithmus ist bewusst einfach gehalten. Folgende Punkte wurden diskutiert und absichtlich nicht umgesetzt:

**PrognoseOK auf aktuellen SOC beziehen:**
Die Formel ist fix auf Min SOC (nicht auf den aktuellen SOC). Grund: In Zone B ist der Akku bereits auf Min SOC entladen. Die relevante Frage ist ob genug PV kommt um von Min SOC auf 100% zu laden. Der aktuelle SOC würde die Bewertung je nach Tageszeit verfälschen.

**Zeitraum A kann kurz oder leer werden:**
Wenn die Notwendige Zeit größer ist als die verfügbare Zeit in Zone A, hat Zone A keine oder negative Dauer. Das ist kein Fehler – Regel B4 (Frühstart) greift dann sofort ab Beginn von Zone B und startet die Entladung rechtzeitig.

**Hausverbrauch ist ein Schätzwert:**
Der Hausverbrauch wird als konfigurierbarer Konstantwert verwendet (default 400 W). Das ist eine bewusste Vereinfachung. Der Wert kann durch Auswertung der Logs kalibriert werden. Eine dynamische Messung würde den Algorithmus komplexer machen ohne den Kernmechanismus zu verbessern.

**Rang 1 kann das System kurz aus dem Peak-Shave-Modus nehmen:**
Rang 1 greift global bei Netzbezug über Schwelle und setzt Eigenverbrauch + Max-Laden 5000. Das ist der sicherste Zustand. Nach maximal einem Tick (5 Minuten) normalisiert sich der Betrieb wieder. Das Risiko ist bekannt und akzeptiert.

**Zone E – kein Software-seitiger Min-SOC-Schutz:**
In Zone E (Nacht) gibt es keine Software-Regel die bei SOC < Min SOC eingreift. Der Algorithmus verlässt sich auf den hardware-konfigurierten End-of-Discharge-SOC im Huawei Wechselrichter. Dieser muss zwingend auf 15% gesetzt sein. Ohne diese Einstellung kann der Akku in Zone E bis 0% entladen werden.

**Allgemeiner Grundsatz:**
Einfachheit vor Vollständigkeit. Der Algorithmus soll wartbar, nachvollziehbar und durch Logs iterativ verbesserbar sein. Optimierungen werden erst auf Basis realer Log-Daten eingebaut.

**Hinweis für Anwender**

- Alle Begriffe sind im Blatt 'Begriffe' dokumentiert.
- Die Zeiträume sind im Blatt 'Zeiträume' definiert.
- Die Regeln sind im Blatt 'Regeln' vollständig beschrieben.
- Das Logging-Konzept ist im Blatt 'Logging' erklärt.
- Frage nach wenn etwas unklar ist – schreibe keinen Code bevor alle Unterschiede besprochen sind.

---

## Blatt: Begriffe

| Begriff | Beschreibung |
|---|---|
| Rang | Innerhalb eines Zeitraums werden die Regeln in aufsteigender Reihenfolge des Rangs geprüft. Die erste Regel deren Status UND Bedingung erfüllt sind wird ausgeführt. Alle nachfolgenden Regeln werden nicht mehr geprüft. Ist keine Regel erfüllt, bleibt der letzte aktive Zustand erhalten. |
| Tick | Die Regeln werden alle 5 Minuten geprüft und können den Zustand der Anlage verändern. Alle Regeln — einschließlich Rang 1 — werden ausschließlich beim Tick ausgewertet. |
| Notwendige Zeit | Wird bei jedem Tick neu berechnet. Formel: max(0, (SOC - Min SOC) / 100 * Akku_kWh / Entladeleistung_kW * 60) in Minuten. Das max(0, ...) verhindert negative Werte wenn SOC unter Min SOC liegt. Wenn Entladeleistung = 0 (PV deckt WR-Limit vollständig), wird NotwendigeZeit auf 999 Minuten gesetzt – Zone B startet sofort per Frühstart, praktisch passiert nichts bis PV sinkt. |
| Entladeleistung | max(0, WR-Limit kW - Hausverbrauch kW - PV kW). Wird bei jedem Tick neu berechnet. WR-Limit ist konfigurierbar (default 5 kW). |
| Nicht erreichbar | Wenn die Anlage während eines Ticks nicht erreichbar ist, wird kein Zustand verändert. Es wird ein Log-Eintrag 'unavailable' geschrieben. Beim nächsten Tick wird normal weitergemacht. |
| PRIO1 | Möglichst keinen Strom aus dem Netz beziehen. Eigenverbrauch optimieren. |
| PRIO2 | Die Anlage so netzdienlich wie möglich betreiben (das Ziel) |
| PRIO3 | Den Zeitraum höchster PV-Leistung vollständig in den Akku laden. Der Algorithmus hält den Akku zum Beginn dieses Zeitraums auf Min SOC, damit die gesamte Kapazität für die Einspeisespitze zur Verfügung steht. An sehr sonnigen Tagen ist dieser Zeitraum kürzer als das definierte Ladefenster - der Akku wird trotzdem voll, aber zur richtigen Zeit. |
| SOC | Aktueller Ladestand des Akkus in %. |
| Min SOC | 15 % |
| SOC Puffer | 30 % |
| Wechselrichter | Kann mit maximal WR-Limit kW laden und entladen (konfigurierbar, default 5 kW). Die Ladeleistung kann begrenzt werden, die Entladeleistung nicht. |
| Eigenverbrauch | Huawei-Betriebsmodus 'Maximise Self Consumption'. PV versorgt zuerst das Haus. Überschuss lädt den Akku bis Max-Laden. Ist Akku voll oder Max-Laden = 0, geht Überschuss ins Netz. Nachts entlädt der Akku für das Haus. Netzbezug nur wenn PV + Akku nicht ausreichen. |
| Einspeisen | Huawei-Betriebsmodus 'Fully Fed to Grid'. PV versorgt zuerst das Haus. Der Akku entlädt zusätzlich ins Netz. Effektive Entladeleistung: max(0, WR-Limit kW - Hausverbrauch kW - PV kW). Max-Laden hat in diesem Modus keinen Einfluss. |
| WR-Limit | Konfigurierbare maximale Lade-/Entladeleistung in kW (default 5 kW). Wird zur Berechnung der Entladeleistung verwendet. |
| Akku | Huawei LUNA2000, 10 kWh nutzbare Kapazität. SOC über sensor.batterien_batterieladung (0–100%). Hardware-Min-SOC muss im Wechselrichter auf 15% konfiguriert sein (End of Discharge SOC). |
| Netzbezug | Gemessen über sensor.netzbezug_live in kW. Gilt als 'echt' wenn Wert > Netzbezug-Schwelle. |
| Netzbezug-Schwelle | Konfigurierbare Schwelle in W (default 1000 W). Unterdrückt kurze Lastspitzen beim Schalten. Rang 1 greift erst oberhalb dieser Schwelle. |
| PV | PV-Eingangsleistung über sensor.wechselrichter_eingangsleistung in W. Ost-West-Anlage: 3,6 kWp Ost, 2,0 kWp West. |
| Hausverbrauch | Konfigurierbare Schätzung des mittleren Hausverbrauchs (default 400 W). Wird zur Berechnung der Entladeleistung verwendet. Kalibrierung über Log-Daten empfohlen. |
| Peak | Prognostizierter Zeitpunkt der maximalen PV-Leistung. Gewichteter Mittelwert der OpenMeteo-Prognosen für Ost- und West-String. Sensor: sensor.pv_peak_zeit_gewichtet. |
| Intervall | Zeitfenster symmetrisch um den Peak. Default 330 Minuten (lade_offset_min = 165 min). Peak - Intervall/2 = Beginn Zone C. |
| Restprognose | Verbleibende PV-Energieprognose in kWh. Summe: sensor.energy_production_today_remaining + sensor.energy_production_today_remaining_2. Mit kalibrierbarem Korrekturfaktor (default 1.0). |
| PrognoseOK | Restprognose_kWh >= (100 - min_soc) / 100 * Akku_kWh. Prüft ob genug PV kommt um den Akku von Min SOC auf 100% zu laden. Beispiel: min_soc=15%, Akku=10 kWh → benötigt 8,5 kWh. 9,0 kWh → true. 7,0 kWh → false. Formel ist fix auf Min SOC, nicht auf den aktuellen SOC. |
| Peak-Fallback | Wenn sensor.pv_peak_zeit_gewichtet nicht verfügbar ist, wird sun.sun Attribut next_noon verwendet. Das System läuft weiter, Peak-Shave ist weniger präzise. |
| Home Assistant | Steuerungssystem. Blueprint läuft alle 5 Minuten. Logging in /config/peakshave_log.csv. |
| Analyse-Modus | input_boolean.peakshave_analyse_modus. Im Normalbetrieb wird nur bei Zustandsänderungen geloggt. Im Analyse-Modus wird zusätzlich bei jedem Tick geloggt. |

---

## Blatt: Zeiträume

| Zeitraum | Beschreibung | Von | Bis |
|---|---|---|---|
| A | Akku auf Puffer SOC entladen, PV-Überschuss wird eingespeist. | Sonnenaufgang - 60 Min | Peak - Intervall/2 - Notwendige Zeit zum Entladen von SOC auf Min SOC |
| B | Akku vor Peak auf Min SOC bringen. | Peak - Intervall/2 - Notwendige Zeit zum Entladen von SOC auf Min SOC | Peak - Intervall/2 |
| C | Akku im Peak laden. | Peak - Intervall/2 | Peak + Intervall/2 |
| D | Die Zeit nach dem Peak mit PV. | Peak + Intervall/2 | Sonnenuntergang |
| E | Die Zeit ohne PV. | Sonnenuntergang | Sonnenaufgang - 60 Min |

---

## Blatt: Regeln

| Zeitraum | Rang | Status | Bedingung | Modus | Max-Laden |
|---|---|---|---|---|---|
| Immer | 1 | Netzbezug > Schwelle | | Eigenverbrauch | 5000 |
| A | 2 | SOC < Min SOC | | Eigenverbrauch | 5000 |
| A | 3 | SOC < Puffer SOC | | Eigenverbrauch | 1000 |
| A | 4 | SOC > Puffer SOC | PrognoseOK | Einspeisen | 0 |
| A | 5 | | | Eigenverbrauch | 5000 |
| B | 2 | SOC < Min SOC | | Eigenverbrauch | 1000 |
| B | 3 | | NOT PrognoseOK | Eigenverbrauch | 5000 |
| B | 4 | Notwendige Zeit > Dauer A | PrognoseOK | Einspeisen | 0 |
| C | 2 | | | Eigenverbrauch | 5000 |
| D | 2 | | | Eigenverbrauch | 5000 |
| E | 2 | | | Eigenverbrauch | 0 |

### Bemerkungen

- **Rang 1 (Immer):** Greift in allen Zeiträumen. Netzbezug gilt erst ab Schwelle (konfigurierbar, default 1000 W).
- **A5 (Fallback):** Kein Status, keine Bedingung. Greift wenn SOC ≥ Puffer SOC aber PrognoseOK=false. Verhindert dass Max-Laden=0 aus Zone E aktiv bleibt.
- **B2 vor B3:** SOC-Schutz (B2) hat Vorrang vor PrognoseOK-Abbruch (B3). Akku wird auch bei schlechter Prognose geschützt.
- **B4:** Zeit-Kriterium (Frühstart). DauerA = verbleibende Zeit bis zum formalen B-Startzeitpunkt zum Tick-Zeitpunkt. Negativ oder 0 = sofortiger Frühstart. B5 wurde gestrichen: sobald wir in Zone B sind, ist DauerA ≤ 0, also feuert B4 immer – B5 wäre dead code.
- **NotwendigeZeit:** Wenn Entladeleistung = 0 (starke PV), wird NotwendigeZeit auf 999 min gesetzt. Zone B startet per Frühstart, praktisch passiert nichts bis PV sinkt.
- **Rang-Logik:** Die erste zutreffende Regel gewinnt. Keine Regel → letzter Zustand bleibt erhalten.
- **C, D, E:** Rang 2 gilt immer für den gesamten Zeitraum. Rang 1 greift weiterhin global.
- **Zone E:** Kein Software-Min-SOC-Schutz. Hardware-End-of-Discharge-SOC im Wechselrichter muss auf 15% konfiguriert sein.

---

## Blatt: Logging

### Log-Trigger

| Trigger | Wann | Beschreibung |
|---|---|---|
| Zustandsänderung | immer | Modus oder Max-Laden hat sich geändert → Log-Eintrag |
| Analyse-Modus | optional | input_boolean.peakshave_analyse_modus = ON → zusätzlich bei jedem Tick loggen |
| Unavailable | immer | Anlage nicht erreichbar → Log-Eintrag mit Grund 'unavailable' |

### CSV-Felder (`/config/peakshave_log.csv`)

| Feld | Typ / Einheit | Beschreibung |
|---|---|---|
| datum | YYYY-MM-DD | Datum des Log-Eintrags |
| zeit | HH:MM:SS | Uhrzeit des Log-Eintrags |
| zeitraum | A/B/C/D/E | Aktiver Zeitraum |
| rang | 1–4 / – | Rang der ausgelösten Regel (– bei C/D/E Rang 2) |
| modus_neu | Text | Neuer Betriebsmodus |
| modus_alt | Text | Vorheriger Betriebsmodus |
| max_laden_neu | W | Neuer Max-Laden-Wert |
| max_laden_alt | W | Vorheriger Max-Laden-Wert |
| soc | % | Aktueller Akkustand |
| pv_w | W | Aktuelle PV-Eingangsleistung |
| netzbezug_live | kW | Aktueller Netzbezug |
| einspeisung_live | kW | Aktuelle Einspeisung |
| prognose_ok | true/false | War PrognoseOK zum Zeitpunkt der Regel-Auswertung erfüllt? |
| restprognose_kwh | kWh | Verbleibende PV-Prognose |
| peak_zeit | HH:MM | Prognostizierter PV-Peak (leer wenn Fallback aktiv) |
| notwendige_zeit_min | min | Berechnete Entladezeit bis Min SOC (999 wenn Entladeleistung = 0) |
| grund | Text | Auslöser: 'zustandsaenderung', 'tick_analyse', 'unavailable' |

> **Hinweis:** Der Analyse-Modus wird über input_boolean.peakshave_analyse_modus gesteuert und kann jederzeit im HA-Dashboard ein- und ausgeschaltet werden.
