Batterie-SOC KNX-Automation: Lastabwurf, Nachtladung und Tarifplanung
Der Batterieladezustand ist die wichtigste Eingangsgröße für die KNX-Energieautomation – er bestimmt, wann zusätzliche Lasten zugeschaltet, wann Lasten abgeworfen werden, um die Batterie zu schützen, wann die nächtliche Niedertarifladung ausgelöst wird und wie die Strategie zwischen Sommer- und Winterbetriebsbedingungen angepasst wird. Eine gut ausgelegte SOC-Automationsebene kann die Netzbezugskosten im Vergleich zur reinen Eigenverbrauchssteuerung um 40–70 % senken.
SOC-Schwellwerttabelle mit Hysteresebändern
Die SOC-Schwellwerttabelle definiert diskrete Betriebsbänder, die jeweils eine bestimmte Reihe von KNX-Aktionen auslösen. Die Hysterese – ein Erholungs-Offset oberhalb des Schwellwerts – verhindert schnelles Umschalten, wenn der SOC aufgrund von Lastschwankungen oder verrauschter SOC-Messung nahe einer Schwellwertgrenze schwankt.
| SOC-Band | Zulässige KNX-Aktionen | Hysterese-Erholung |
|---|---|---|
| > 90% AND exporting | SG Ready Zustand 4 + EV-Maximalstrom + Heizstab EIN | Aktiv, bis SOC auf 85% fällt oder nicht mehr exportiert |
| 50–90% | Normaler Eigenverbrauch: SG Ready State 3 + EV-Prioritätsmodus | Im Band bleiben – kein Abschalten |
| 20–50% | Nur grundlegender Eigenverbrauch – kein SG Ready State 4, EV mindestens 6 A | Rückkehr zum 50-90 %-Band, wenn Solar die Batterie über 55 % lädt |
| < 20% | Alle steuerbaren Lasten unterbrechen: EV deaktiviert, SG Ready → State 2 | Lasten wieder aufnehmen, wenn SOC über 25 % steigt (5 % Hysterese) |
| < 10% | Notfall: HVAC-Absenkung −2 °C + Lastalarm an KNX-Visualisierung | Notfall-Absenkung aufheben, wenn SOC über 15 % steigt |
MDT Logikmodul — SOC-Bänder mit Hysterese-Implementierung
Logic channel 1: SOC band flags (set on GA 9/1/0 change)
Flag "soc_critical": SOC < 20 → set; clear when SOC > 25
Flag "soc_low": SOC < 10 → set; clear when SOC > 15
Flag "soc_full": SOC > 90 → set; clear when SOC < 85
On-delay timer: 60s before setting any flag (noise rejection)
Logic channel 2: Load enable gate
IF soc_critical: disable EV (write 0 to GA 10/0/1)
set SG Ready → State 2 (S1=0, S2=0)
IF NOT soc_critical AND surplus > 2500W:
EV: enable + set current from surplus/230
SG Ready: State 3 if surplus > 3000W
Logic channel 3: Emergency HVAC setback
IF soc_low: send HVAC setback scene (reduce setpoint −2°C)
write 1 to alarm GA 9/9/0 (battery emergency alert)
IF NOT soc_low AND NOT soc_critical: restore HVAC setpointAuslöser für nächtliches Laden außerhalb der Spitzenzeiten
Dynamische Stromtarife (Tibber, Nordpool, Octopus Agile) bieten Zeiträume, in denen Netzstrom weniger als 0,10 EUR/kWh kostet – typischerweise zwischen 00:00 und 06:00 Uhr. Das Auslösen des Batterieladens in diesen Fenstern reduziert die täglichen Energiekosten, wenn die Solarerzeugung tagsüber nicht ausreicht, um die Batterie vollständig zu laden.
Logik für nächtliches Laden außerhalb der Spitzenzeiten
KNX time-based trigger (IP-Symcon or HA schedule):
Trigger time: 01:00 local time
Condition: GA 9/1/0 (Battery SOC) < 40%
AND KNX tariff GA 9/9/1 < 10 (price < 0.10 €/kWh)
Action: Set MultiPlus to forced battery charge mode
Victron (via Cerbo GX Modbus write):
Write 4 to register 37 (unit ID 227) → force bulk charge
Fronius GEN24 (via webserver API or EVCC):
evcc.yaml: scheduled charging at 01:00 with "now" mode
KNX tariff GA update (source: HA automation reading Tibber API):
HA script (runs at 22:00 daily):
GET https://api.tibber.com/v1-beta/gql (Tibber price API)
Find minimum price in next 8 hours
Write min_price × 100 (integer cents) to GA 9/9/1
GA 9/9/1 = current electricity price in euro cents (DPT 9.002)
GA 9/9/2 = off-peak start hour (DPT 5.010)
Cancel condition: 06:00 OR GA 9/1/0 > 90%
→ Stop forced charge → return to normal ESS modeNordpool vs. Tibber für KNX-Integration: Nordpool veröffentlicht day-ahead Preise um 13:00 Uhr MEZ für den folgenden Tag – geeignet für HA-Automatisierungen, die die Preise einmal täglich abrufen und das Laden entsprechend planen. Tibber bietet eine API auf höherer Ebene mit stündlichen Preisprognosen und unterstützt WebSocket-Push-Abonnements für Echtzeit-Preisaktualisierungen, was dynamische Schwellenanpassungen in der KNX-Tarif-GA ohne Polling ermöglicht.
Morgendliches Vorladen vor dem Spitzentarif
Zeitvariable Tarife haben oft Spitzenpreisfenster von 07:00 bis 11:00 Uhr, wenn die morgendliche Gebäudelast hoch ist, die Solarerzeugung jedoch noch anläuft. Das Vorladen der Batterie auf mindestens 50 % SOC vor dem Spitzenfenster mit günstigerer Energie außerhalb der Spitzenzeiten stellt sicher, dass das Gebäude während der Spitzenzeiten aus der Batterie statt aus dem teuren Netz versorgt wird.
Morgendliche Vorladungsautomatisierung (IP-Symcon-Skript)
// IP-Symcon PHP script — runs at 06:00 daily
$soc = GetValueFloat(IPS_GetVariableIDByName("Battery SOC", $parentID));
$pvForecast = GetValueFloat($pvForecastVariableID); // from PV forecast API
// PV forecast integration: HA reads forecast.solar API
// GET https://api.forecast.solar/estimate/<lat>/<lon>/<dec>/<az>/<kwp>
// Forecast for today: energy in kWh — high forecast means skip pre-charge
if ($soc < 30 && $pvForecast < 15) {
// Low SOC and low solar forecast — pre-charge to 50% before peak
SetValueInteger($multiPlusMode, 4); // Force bulk charge
IPS_RunScriptEx($chargeStopScript, ["targetSOC" => 50]);
}
// In HA automation:
automation:
- alias: "Morning pre-charge if low SOC"
trigger:
- platform: time
at: "06:00:00"
condition:
- condition: numeric_state
entity_id: sensor.battery_soc
below: 30
- condition: template
value_template: "{{ states('sensor.pv_forecast_today_kwh')|float < 15 }}"
action:
- service: script.force_battery_charge_to_50_percentSaisonale SOC-Strategie
Die Batteriebetriebsstrategie sollte sich an die saisonale Solarverfügbarkeit anpassen. Im Sommer zykliert die Batterie täglich zwischen fast leer und fast voll – tiefe tägliche Zyklen maximieren den Eigenverbrauch, erfordern aber eine gute Batteriechemie (LFP gegenüber NMC für Langlebigkeit bei täglichen Tiefentladungen bevorzugt). Im Winter, wenn die Erzeugung geringer ist, wird die Batterie selten vollständig geladen, daher sollte sie in einem mittleren SOC-Bereich gehalten werden, um die Reservekapazität zu erhalten.
| Jahreszeit | Ziel-SOC-Bereich | Strategie | KNX-Zeitplanauslöser |
|---|---|---|---|
| Sommer (April–September) | 20–95% | Deep daily cycling — max self-consumption. Allow EV + HP loads when SOC > 80%. | Saisonale Umschaltung am 1. April und 1. Oktober |
| Winter (Okt–Mär) | 40–80% | SOC im mittleren Bereich für Reserve halten. Vor dem Morgenpeak auf 80 % vorladen. Keine Tiefentladung. | Umschaltung auf Winterstrategie am 1. Oktober |
| Lange Bewölkungsperioden | 60–80% | Tiefe Zyklen aussetzen — Netzbezug zu Schwachlastzeiten bevorzugt, wenn Batterie unter 60 %. | Automatic: if SOC < 60% at 09:00 for 3+ days |
| Heatwave (>35°C) | 20–80% | Obergrenze senken, um Batterietemperatur zu schützen (BMS thermische Leistungsreduzierung) | If GA 9/1/2 (battery temp) > 35°C |
Saisonale Betriebsartumschaltung über KNX Zeitplan
KNX time schedule (Gira X1 or MDT Logic Module timer):
April 1 — summer mode:
Write "summer" flag → GA 9/9/5 value 1
SOC shedding threshold: 20% (allow deep cycling)
EV enable threshold SOC: 40% (lower than winter)
Morning pre-charge: disabled (sufficient solar expected)
October 1 — winter mode:
Write "winter" flag → GA 9/9/5 value 0
SOC shedding threshold: 40% (protect from deep discharge)
EV enable threshold SOC: 60% (higher — conserve battery)
Morning pre-charge: enabled (low solar, pre-charge from grid)
IP-Symcon monthly schedule (runs on 1st of each month):
$month = date("n"); // PHP month number
if ($month >= 4 && $month <= 9) {
SetValue($seasonMode, "summer");
} else {
SetValue($seasonMode, "winter");
}KNX-Energietarif GA: Tibber und Nordpool via HA
Für eine dynamische tarifabhängige Batteriesteuerung muss der aktuelle Strompreis auf eine KNX-Gruppenadresse veröffentlicht werden, auf der das KNX-Logikmodul ihn mit Schwellwerten vergleichen kann. Home Assistant oder IP-Symcon liest die Tarif-API und schreibt den Preis bei jeder stündlichen Aktualisierung auf eine KNX-GA.
HA Tibber → KNX-Tarif-GA-Automatisierung
# HA configuration.yaml — Tibber integration
tibber:
access_token: !secret tibber_access_token
# sensor: current electricity price in EUR/kWh
sensor:
- platform: tibber
name: tibber_current_price
# automation: write current price to KNX GA every hour
automation:
- alias: "Tibber price → KNX tariff GA"
trigger:
- platform: time_pattern
minutes: "0" # Run at :00 of every hour
action:
- service: knx.send
data:
address: "9/9/1"
payload: >
{{ (states('sensor.tibber_current_price')|float * 1000)|int }}
# Scale: multiply by 1000 to get milli-EUR (DPT 9.002 compatible)
type: "2byte_float"
# KNX logic uses GA 9/9/1 value:
# < 100 (0.10 EUR/kWh): trigger off-peak battery charge
# > 300 (0.30 EUR/kWh): enable all self-consumption loads aggressively
# > 500 (0.50 EUR/kWh): emergency: maximise battery discharge, no grid importInbetriebnahme mit realen SOC-Testszenarien
Die SOC-Automatisierungsinbetriebnahme erfordert das Testen jedes Schwellwertbands durch Einspeisen simulierter SOC-Werte über ETS6 Group Monitor – ohne darauf zu warten, dass die Batterie natürlich durch jeden Zustand zyklisiert. Testen Sie jeden Schwellwert nacheinander und überprüfen Sie, ob die korrekten KNX-Aktionen ausgelöst und bei den richtigen SOC-Werten einschließlich Hysterese beendet werden.
SOC-Automatisierungs-Inbetriebnahmetestszenarien
Prerequisite: disconnect real battery SOC input to KNX
(remove Intesis IN701KNX poll for register 843 temporarily)
→ manually write SOC test values to GA 9/1/0 via ETS6
Test 1 — Normal operation (SOC 75%):
Write 75 to GA 9/1/0
Expected: no load shedding, self-consumption logic active
Verify: EV and SG Ready loads enabled (if surplus present)
Test 2 — Enter low SOC zone (SOC 18%):
Write 18 to GA 9/1/0
Expected: after 60s on-delay, soc_critical flag sets
Verify: GA 10/0/1 (EV enable) → 0 (EV disabled)
SG Ready relays → State 2 (both contacts open)
Test 3 — Hysteresis: recovery insufficient (SOC 22%):
Write 22 to GA 9/1/0 (above 20% threshold but below 25% recovery)
Expected: soc_critical flag remains set (hysteresis holds)
Verify: loads remain disabled — confirm hysteresis working
Test 4 — Hysteresis: recovery sufficient (SOC 27%):
Write 27 to GA 9/1/0 (above 25% recovery threshold)
Expected: soc_critical flag clears after 60s
Verify: loads re-enable (if surplus still present)
Test 5 — Emergency zone (SOC 8%):
Write 8 to GA 9/1/0
Expected: HVAC setback scene activates (HVAC −2°C)
Alarm GA 9/9/0 → 1 (alert fires in Gira X1)
Verify in HVAC setpoint display: temperature reduced by 2°C
Test 6 — Off-peak charging trigger:
Write 35 to GA 9/1/0 (SOC 35% — below 40% threshold)
Set time to 01:05 (test time via IP-Symcon or HA test trigger)
Write 8 to GA 9/9/1 (price 0.008 EUR/kWh — very cheap)
Expected: forced battery charge mode activates
Verify: MultiPlus/GEN24 starts charging from gridLive-SOC nach dem Test wieder verbinden
Nach Abschluss der simulierten SOC-Tests aktivieren Sie die Intesis-Abfrage für das Batterie-SOC-Register wieder. Überprüfen Sie, ob der Live-SOC-Wert mit der Batterie-BMS-Anzeige übereinstimmt. Bestätigen Sie, dass die Logik mit Live-SOC-Daten korrekt umschaltet, bevor Sie das System übergeben.
Saisonmodus-Überprüfung
Testen Sie die saisonale Betriebsartumschaltung, indem Sie vorübergehend Sommer- und Winter-Flaggen auf GA 9/9/5 schreiben. Überprüfen Sie, ob sich die SOC-Schwellenwerte wie erwartet ändern: Der sommerliche EV-Freigabeschwellenwert (40 % SOC) sollte niedriger sein als der winterliche Schwellenwert (60 % SOC). Stellen Sie nach dem Test die korrekte saisonale Betriebsart wieder her.
Benötigen Sie eine SOC-basierte KNX-Energieautomatisierung, die entworfen und in Betrieb genommen wird?
Wir entwerfen und konfigurieren SOC-Schwellenwert-Automatisierung, Ladestrategien für Schwachlastzeiten, saisonale Strategielogik und Tibber/Nordpool-Tarifintegration für KNX-Gebäude mit Batteriespeicher – vollständig getestet und dokumentiert.
Angebot anfordern →