Automatización KNX SOC Batería: Deslastre de Cargas, Carga Nocturna y Programación Tarifaria
El estado de carga de la batería es la variable de entrada más importante para la automatización energética KNX – determina cuándo permitir cargas adicionales, cuándo deslastrar cargas para proteger la batería, cuándo activar la carga nocturna fuera de punta y cómo adaptar la estrategia entre condiciones operativas de verano e invierno. Una capa de automatización SOC bien diseñada puede reducir los costos de importación de la red en un 40–70% en comparación con el control básico de autoconsumo.
Tabla de umbrales SOC con bandas de histéresis
La tabla de umbrales SOC define bandas operativas discretas, cada una activando un conjunto específico de acciones KNX. La histéresis – un desplazamiento de recuperación por encima del umbral – evita conmutaciones rápidas cuando el SOC oscila cerca de un límite de umbral debido a fluctuaciones de carga o medición ruidosa del SOC.
| Banda SOC | Acciones KNX permitidas | Recuperación de histéresis |
|---|---|---|
| > 90% AND exporting | SG Ready Estado 4 + corriente máxima EV + calentador de inmersión ON | Activo hasta que el SOC baje al 85% o deje de exportar |
| 50–90% | Autoconsumo normal: SG Ready State 3 + modo prioridad VE | Permanecer en banda – sin desconexión |
| 20–50% | Solo autoconsumo básico – sin SG Ready State 4, VE a 6 A mín. | Volver a la banda 50-90 % cuando la solar cargue la batería por encima del 55 % |
| < 20% | Suspender todas las cargas controlables: VE desactivado, SG Ready → State 2 | Reanudar cargas cuando el SOC supere el 25 % (histéresis 5 %) |
| < 10% | Emergencia: reducción HVAC −2 °C + alerta de carga a la visualización KNX | Cancelar la reducción de emergencia cuando el SOC supere el 15 % |
Módulo lógico MDT — bandas SOC con implementación de histéresis
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 setpointDisparador de carga nocturna fuera de horas punta
Las tarifas dinámicas de electricidad (Tibber, Nordpool, Octopus Agile) ofrecen períodos en los que la electricidad de la red cuesta menos de 0,10 EUR/kWh — típicamente entre las 00:00 y las 06:00. Activar la carga de la batería durante estas ventanas reduce los costos energéticos diarios cuando la generación solar es insuficiente para cargar completamente la batería durante el día.
Lógica de carga nocturna fuera de horas punta
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 para integración KNX: Nordpool publica los precios day-ahead a las 13:00 CET para el día siguiente — adecuado para automatizaciones HA que obtienen los precios una vez al día y programan la carga en consecuencia. Tibber proporciona una API de nivel superior con pronósticos de precios por hora y admite suscripciones push WebSocket para actualizaciones de precios en tiempo real, permitiendo ajustes dinámicos de umbral en la GA de tarifa KNX sin sondeo.
Precarga matutina antes de la tarifa punta
Las tarifas por tiempo de uso a menudo tienen ventanas de precio punta de 07:00 a 11:00 cuando la carga matutina del edificio es alta pero la generación solar aún está aumentando. Precargar la batería al menos al 50% de SOC antes de la ventana punta utilizando energía más barata fuera de punta asegura que el edificio se alimente de la batería en lugar de la costosa red durante las horas punta.
Automatización de precarga matutina (script IP-Symcon)
// 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_percentEstrategia SOC estacional
La estrategia de operación de la batería debe adaptarse a la disponibilidad solar estacional. En verano, la batería cicla diariamente entre casi vacía y casi llena – el ciclo profundo diario maximiza el autoconsumo pero requiere una buena química de batería (LFP preferido sobre NMC para longevidad en ciclos profundos diarios). En invierno, con menor generación, la batería rara vez se carga por completo, por lo que debe mantenerse en un rango de SOC medio para preservar la capacidad de respaldo.
| Estación | Rango de SOC objetivo | Estrategia | Disparador de horario KNX |
|---|---|---|---|
| Verano (abril–septiembre) | 20–95% | Deep daily cycling — max self-consumption. Allow EV + HP loads when SOC > 80%. | Cambio de modo estacional el 1 de abril y el 1 de octubre |
| Invierno (oct–mar) | 40–80% | Mantener SOC medio para respaldo. Precargar al 80 % antes del pico matutino. Sin descarga profunda. | Cambio a estrategia de invierno el 1 de octubre |
| Períodos largos nublados | 60–80% | Suspender ciclos profundos — preferir importación de red en horas valle en lugar de batería por debajo del 60 %. | Automatic: if SOC < 60% at 09:00 for 3+ days |
| Heatwave (>35°C) | 20–80% | Reducir el límite superior para proteger la temperatura de la batería (reducción térmica del BMS) | If GA 9/1/2 (battery temp) > 35°C |
Cambio de modo estacional mediante programación horaria KNX
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");
}Tarifa energética KNX GA: Tibber y Nordpool vía HA
Para una programación dinámica de la batería según la tarifa, el precio actual de la electricidad debe publicarse en una dirección de grupo KNX donde el módulo lógico KNX pueda compararlo con valores umbral. Home Assistant o IP-Symcon lee la API de la tarifa y escribe el precio en un GA KNX en cada actualización horaria.
Automatización HA Tibber → GA tarifa KNX
# 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 importPuesta en marcha con escenarios de prueba SOC reales
La puesta en marcha de la automatización SOC requiere probar cada banda umbral inyectando valores SOC simulados a través de ETS6 Group Monitor – sin esperar a que la batería recorra naturalmente cada estado. Pruebe cada umbral en secuencia y verifique que las acciones KNX correctas se activen y cesen en los valores SOC adecuados, incluida la histéresis.
Escenarios de prueba de puesta en marcha de automatización SOC
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 gridReconectar el SOC real después de la prueba
Después de completar las pruebas SOC simuladas, reactive la consulta Intesis para el registro SOC de la batería. Verifique que el valor SOC real coincida con la pantalla del BMS de la batería. Confirme que la lógica transicione correctamente con datos SOC reales antes de entregar el sistema.
Verificación del modo estacional
Pruebe el cambio de modo estacional escribiendo temporalmente las banderas de verano e invierno en GA 9/9/5. Verifique que los umbrales de SOC cambien según lo esperado: el umbral de habilitación de EV en verano (40 % SOC) debe ser menor que el umbral de invierno (60 % SOC). Restaure el modo estacional correcto después de la prueba.
¿Necesita automatización energética KNX basada en SOC diseñada y puesta en marcha?
Diseñamos y configuramos automatización de umbrales SOC, horarios de carga en horas valle, lógica de estrategia estacional e integración de tarifas Tibber/Nordpool para edificios KNX con almacenamiento en batería — completamente probado y documentado.
Solicitar presupuesto →