feat: Major update - Battery Optimizer v3.4.0 with comprehensive fixes

## 🎯 Hauptänderungen

### Version 3.4.0 - SOC-Drift & Charging Capacity
-  Sicherheitspuffer (20-50% konfigurierbar) für untertägige SOC-Schwankungen
-  Monatliche automatische Batterie-Kalibrierung
- 🐛 SOC-Plausibilitäts-Check (filtert 65535% Spikes beim Modus-Wechsel)
- 🐛 Zeitabhängige API-Abfrage (vor/nach 14:00 Uhr)

### Neue Features
- 🔋 **Safety Buffer**: Kompensiert SOC-Drift und Eigenverbrauch
- 🔋 **Auto-Calibration**: Monatlicher Vollzyklus für SOC-Genauigkeit
- 🔋 **Spike Protection**: 4-fach Schutz gegen ungültige SOC-Werte
- 🔋 **Smart API**: Verhindert HTTP 500 Errors bei fehlenden Tomorrow-Preisen

### Dokumentation
- 📚 SOC_CALIBRATION_GUIDE.md - Umfassender Kalibrierungs-Guide
- 📚 FIX_CHARGING_CAPACITY.md - Sicherheitspuffer-Dokumentation
- 📚 FIX_SOC_SPIKE_PROBLEM.md - Spike-Protection-Lösung
- 📚 FIX_API_TIMING.md - Zeitabhängige API-Abfrage
- 📚 DIAGNOSE_LADE_PROBLEM.md - Debug-Guide

### Neue Dateien
- battery_calibration_automation.yaml - 4 Automations für Kalibrierung
- battery_calibration_input_helper.yaml - Input Helper Config
- battery_optimizer_input_helper_safety_buffer.yaml - Puffer Config
- debug_schedule.py - Umfassendes Debug-Script

### Scripts
- battery_charging_optimizer.py v3.4.0
- hastrom_flex_extended.py v1.1.0
- debug_schedule.py v1.0.0

### Fixes
- 🐛 SOC springt auf 65535% beim ESS-Modus-Wechsel → Debounce + Plausibilitäts-Check
- 🐛 API-HTTP-500 vor 14:00 → Zeitabhängige Abfrage
- 🐛 Batterie nicht bis 100% geladen → Sicherheitspuffer
- 🐛 SOC driftet ohne Vollzyklen → Automatische Kalibrierung

## 🚀 Installation

1. Input Helper erstellen (siehe battery_optimizer_input_helper_safety_buffer.yaml)
2. Automations installieren (siehe battery_calibration_automation.yaml)
3. Scripts aktualisieren (battery_charging_optimizer.py v3.4.0)
4. PyScript neu laden

## 📊 Verbesserungen

- Präzisere Ladeplanung durch Sicherheitspuffer
- Robustheit gegen SOC-Drift
- Keine API-Fehler mehr vor 14:00
- Hardware-Stopp bei 100% wird respektiert
- Bessere Batterie-Gesundheit durch regelmäßige Kalibrierung

🤖 Generated with Claude Code (claude.ai/code)

Co-Authored-By: Claude <noreply@anthropic.com>
This commit is contained in:
felix.zoesch
2025-12-12 08:04:07 +01:00
parent 5ab422426f
commit 0fa03a566a
90 changed files with 22002 additions and 0 deletions

View File

@@ -0,0 +1,190 @@
# 🔥 Hotfix: input_text → input_textarea
## ⚠️ Problem
Home Assistant `input_text` hat ein **Maximum von 255 Zeichen**, aber unser JSON-Ladeplan ist viel größer (typisch 2000-4000 Zeichen für 24 Stunden).
**Fehlermeldung:**
```
Invalid config for 'input_text' at packages/battery_optimizer_config.yaml, line 10:
value must be at most 255 for dictionary value 'input_text->battery_charging_schedule->max',
got 4096
```
## ✅ Lösung
Verwende `input_textarea` statt `input_text`:
- ✅ Unbegrenzte Größe
- ✅ Multi-Line Text
- ✅ Perfekt für JSON
## 🔧 Was wurde geändert
### Datei: `battery_optimizer_config.yaml`
**VORHER (falsch):**
```yaml
input_text:
battery_charging_schedule:
name: "Batterie Ladeplan"
max: 4096 # ❌ Nicht erlaubt!
initial: "{}"
```
**NACHHER (korrekt):**
```yaml
input_textarea:
battery_charging_schedule:
name: "Batterie Ladeplan"
initial: "{}" # ✅ Kein max-Limit!
```
### Datei: `battery_charging_optimizer.py`
**Änderungen:**
```python
# VORHER:
input_text.battery_charging_schedule = schedule_json
schedule_json = state.get('input_text.battery_charging_schedule')
# NACHHER:
input_textarea.battery_charging_schedule = schedule_json
schedule_json = state.get('input_textarea.battery_charging_schedule')
```
### Datei: `battery_optimizer_config.yaml` (Templates)
**Template-Sensoren:**
```yaml
# VORHER:
{% set schedule = state_attr('input_text.battery_charging_schedule', 'schedule') %}
# NACHHER:
{% set schedule = state_attr('input_textarea.battery_charging_schedule', 'schedule') %}
```
### Datei: `battery_optimizer_dashboard.yaml`
**Dashboard-Markdown:**
```yaml
# Gleiche Änderung wie oben
state_attr('input_textarea.battery_charging_schedule', 'schedule')
```
## 📦 Betroffene Dateien
Alle **4 Dateien** wurden aktualisiert:
-`battery_optimizer_config.yaml`
-`battery_charging_optimizer.py`
-`battery_optimizer_dashboard.yaml`
- ✅ (Templates in config.yaml)
## 🔄 Migration
### Wenn du bereits installiert hast:
**Option A: Neuinstallation (empfohlen)**
1. Alte `input_text.battery_charging_schedule` Helper löschen
2. Neue Config mit `input_textarea` einfügen
3. Home Assistant neu starten
4. Neuen Plan berechnen
**Option B: Manuell ändern**
1. In UI: Einstellungen → Geräte & Dienste → Helfer
2. `battery_charging_schedule` löschen
3. Neu erstellen als "Text (mehrzeilig)" (= input_textarea)
4. Name: "Batterie Ladeplan"
5. Standardwert: `{}`
6. Python-Dateien ersetzen
7. Home Assistant neu starten
## 🧪 Testen
Nach dem Fix:
```yaml
# Entwicklerwerkzeuge → Dienste
# Plan berechnen
service: pyscript.calculate_charging_schedule
# Prüfe in Entwicklerwerkzeuge → Zustände
# → Suche: input_textarea.battery_charging_schedule
# → Sollte JSON mit Ladeplan enthalten (>255 Zeichen!)
```
**Beispiel-Output:**
```json
{
"2025-11-08 00:00:00": {
"action": "charge",
"power_w": -10000,
"price": 26.72,
"pv_forecast": 0.0,
"reason": "Günstiger Preis (26.72 ct), Wenig PV (0.0 kWh)"
},
...
}
```
## 📏 Größenvergleich
| Helper-Typ | Max. Größe | Geeignet für |
|------------|-----------|--------------|
| `input_text` | 255 Zeichen | ❌ JSON (zu klein) |
| `input_textarea` | Unbegrenzt | ✅ JSON (perfekt) |
**Typische Größen:**
- 24h Ladeplan: ~2000-4000 Zeichen
- input_text Limit: 255 Zeichen
- **⟹ input_textarea zwingend nötig!**
## 🎯 Warum input_textarea?
Home Assistant unterscheidet:
**input_text:**
- Einzeiliges Textfeld
- UI: Kleines Input-Feld
- Max: 255 Zeichen
- Use-Case: Namen, IDs, kurze Werte
**input_textarea:**
- Mehrzeiliges Textfeld
- UI: Großes Textfeld
- Max: Unbegrenzt
- Use-Case: JSON, Listen, lange Texte
## ✅ Status
**Hotfix:** v1.1.1
**Datum:** 2025-11-07 23:30
**Status:** ✅ Behoben
Alle Download-Dateien wurden aktualisiert!
## 📝 Zusätzliche Änderungen nötig?
**Nein!** Alle anderen Komponenten arbeiten transparent:
- ✅ PyScript kann beide Typen gleich nutzen
- ✅ Templates funktionieren identisch
- ✅ Automation unverändert
- ✅ Dashboard unverändert (außer Entity-ID)
Die einzige Änderung ist `input_text``input_textarea` in allen Referenzen.
## 🎓 Gelernt
**Wichtige Home Assistant Regel:**
- `input_text` = max. 255 Zeichen (hart limitiert)
- Für große Daten immer `input_textarea` verwenden
- Limit ist nicht konfigurierbar!
**Best Practice:**
- JSON-Daten → input_textarea
- IDs/Namen → input_text
- Bei Zweifeln → input_textarea (sicherer)
---
**Alle Dateien im Download sind bereits korrigiert!**