## 🎯 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>
168 lines
5.1 KiB
YAML
168 lines
5.1 KiB
YAML
# ============================================
|
|
# Battery Charging Optimizer v3 - Automatisierungen
|
|
# ============================================
|
|
# Diese Automatisierungen zu deiner automations.yaml hinzufügen
|
|
# oder über die UI erstellen
|
|
#
|
|
# HINWEIS: Die Keep-Alive und ESS-Modus Automations sind NICHT enthalten,
|
|
# da diese bereits existieren:
|
|
# - speicher_manuell_laden.yaml (Keep-Alive alle 30s)
|
|
# - manuelle_speicherbeladung_aktivieren.yaml (ESS → REMOTE)
|
|
# - manuelle_speicherbeladung_deaktivieren.yaml (ESS → INTERNAL)
|
|
|
|
|
|
# Automatisierung 1: Tägliche Planerstellung um 14:05 Uhr
|
|
alias: "Batterie Optimierung: Tägliche Planung"
|
|
description: "Erstellt täglich um 14:05 Uhr den Ladeplan basierend auf Strompreisen"
|
|
trigger:
|
|
- platform: time
|
|
at: "14:05:00"
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
action:
|
|
- service: pyscript.calculate_charging_schedule
|
|
data: {}
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: "Batterie-Optimierung"
|
|
message: "Neuer Ladeplan erstellt"
|
|
mode: single
|
|
|
|
# Automatisierung 2: Stündliche Ausführung des Plans
|
|
alias: "Batterie Optimierung: Stündliche Ausführung"
|
|
description: "Führt jede Stunde zur Minute :05 den Ladeplan aus"
|
|
trigger:
|
|
- platform: time_pattern
|
|
minutes: "5"
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_manual_override
|
|
state: "off"
|
|
action:
|
|
- service: pyscript.execute_charging_schedule
|
|
data: {}
|
|
mode: single
|
|
|
|
# Automatisierung 3: Initiale Berechnung nach Neustart
|
|
alias: "Batterie Optimierung: Start-Berechnung"
|
|
description: "Erstellt Ladeplan nach Home Assistant Neustart"
|
|
trigger:
|
|
- platform: homeassistant
|
|
event: start
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
action:
|
|
- delay: "00:02:00" # 2 Minuten warten bis alles geladen ist
|
|
- service: pyscript.calculate_charging_schedule
|
|
data: {}
|
|
- service: pyscript.execute_charging_schedule
|
|
data: {}
|
|
mode: single
|
|
|
|
# Automatisierung 4: Mitternachts-Neuberechnung
|
|
alias: "Batterie Optimierung: Mitternachts-Update"
|
|
description: "Neuberechnung um Mitternacht wenn Tomorrow-Daten im Plan waren"
|
|
trigger:
|
|
- platform: time
|
|
at: "00:05:00"
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
- condition: template
|
|
value_template: >
|
|
{{ state_attr('pyscript.battery_charging_schedule', 'has_tomorrow_data') == true }}
|
|
action:
|
|
- service: pyscript.calculate_charging_schedule
|
|
data: {}
|
|
mode: single
|
|
|
|
# Automatisierung 5: Preis-Update Trigger
|
|
alias: "Batterie Optimierung: Bei Preis-Update"
|
|
description: "Erstellt neuen Plan wenn neue Strompreise verfügbar (nach 14 Uhr)"
|
|
trigger:
|
|
- platform: state
|
|
entity_id: sensor.hastrom_flex_pro_ext
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
- condition: template
|
|
value_template: >
|
|
{{ trigger.to_state.state != trigger.from_state.state and
|
|
now().hour >= 14 }}
|
|
action:
|
|
- service: pyscript.calculate_charging_schedule
|
|
data: {}
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: "Batterie-Optimierung"
|
|
message: "Neuer Ladeplan nach Preis-Update erstellt"
|
|
mode: single
|
|
|
|
# Automatisierung 6: Notfall-Überprüfung bei niedrigem SOC
|
|
alias: "Batterie Optimierung: Niedrig-SOC Warnung"
|
|
description: "Warnt wenn Batterie unter Minimum fällt"
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.esssoc
|
|
below: 20
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.battery_optimizer_enabled
|
|
state: "on"
|
|
action:
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: "Batterie-Warnung"
|
|
message: "Batterie-SOC ist unter {{ states('input_number.battery_optimizer_min_soc') }}%. Prüfe Ladeplan!"
|
|
mode: single
|
|
|
|
# Automatisierung 7: Manueller Override Reset
|
|
alias: "Batterie Optimierung: Manueller Override beenden"
|
|
description: "Deaktiviert manuellen Override nach 4 Stunden"
|
|
trigger:
|
|
- platform: state
|
|
entity_id: input_boolean.battery_optimizer_manual_override
|
|
to: "on"
|
|
for:
|
|
hours: 4
|
|
action:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.battery_optimizer_manual_override
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: "Batterie-Optimierung"
|
|
message: "Manueller Override automatisch beendet"
|
|
mode: restart
|
|
|
|
# Automatisierung 8: Laden stoppen wenn SOC erreicht
|
|
alias: "Batterie Optimierung: Stopp bei Max-SOC"
|
|
description: "Beendet manuelles Laden wenn maximaler SOC erreicht"
|
|
trigger:
|
|
- platform: numeric_state
|
|
entity_id: sensor.esssoc
|
|
above: 99
|
|
condition:
|
|
- condition: state
|
|
entity_id: input_boolean.goodwe_manual_control
|
|
state: "on"
|
|
action:
|
|
- service: input_boolean.turn_off
|
|
target:
|
|
entity_id: input_boolean.goodwe_manual_control
|
|
# ESS-Modus wird durch manuelle_speicherbeladung_deaktivieren gesetzt
|
|
- service: notify.persistent_notification
|
|
data:
|
|
title: "Batterie-Optimierung"
|
|
message: "Manuelles Laden beendet - SOC 100% erreicht"
|
|
mode: single
|