Zurück zur Projektübersicht

Problemstellung

Die Victron Solaranlage mit 6× JK-BMS v15 Akkus kann keinen maximalen Lade-SOC zentral begrenzen. Ohne Steuerung würden die Akkus täglich auf 100% geladen — was die Lebensdauer von Lithium-Zellen drastisch verkürzt.

Mit der Victron-eigenen Spannungsbegrenzung auf 55V via DVCC wurden die Akkus trotzdem immer auf ~98% geladen — weit über dem optimalen Bereich für tägliche Zyklen.

Die Lösung: Jedes der 6 JK-BMS wird einzeln über ESP32-Mikrocontroller via Bluetooth angesteuert. Sobald ein Akku seinen Ziel-SOC erreicht, wird der Ladevorgang für genau diesen Akku deaktiviert — unabhängig von den anderen. Victron liefert weiterhin Strom für die restlichen Akkus.

Ladestrategie

ZeitraumZiel-SOCHystereseVerhalten
Mo–Sa90%5%Laden stoppt bei 90%, startet erst wieder unter 85%
Sonntag100%2%Vollladung für Zell-Balancing, startet erst wieder unter 98%
Carryover100%2%Falls Sonntag nicht alle voll werden → 100%-Modus bleibt aktiv

Die Hysterese ist das Kern-Feature: Ohne sie würde das System bei Erreichen des Ziels sofort abschalten, der SOC fällt auf 89,9%, das System schaltet wieder ein, erreicht 90%, schaltet ab — endloses Micro-Cycling. Mit 5% Puffer im 90%-Modus passiert das nicht.

Technische Architektur

Steuerung2× ESP32 (esphome-jk-bms)
KommunikationBluetooth Low Energy (BLE)
PlattformHome Assistant
Komponenten1 Script + 11 Automations
Akkus6× JK-BMS v15
EntwicklungFull Vibecoded — 0 Zeilen manuell geschrieben

Victron Ladestrom-Begrenzung via DVCC

Ein kritischer Nebeneffekt der Einzel-BMS-Steuerung: Sobald 5 von 6 Akkus ihr Ziel erreichen und abschalten, bekommt das letzte aktive BMS die vollen 210A der Victron-Anlage ab — über dem 200A-Limit des JK-BMS. Die Folge: Überlast-Fehler „Hoher Ladestrom".

Die Lösung: Ein Template-Sensor zählt in Echtzeit, wie viele BMS gerade laden. Via Modbus wird der Victron-Ladestrom dynamisch begrenzt:

Aktive BMSVictron-StromPro BMSStatus
6200A~33A
5180A~36A
4160A~40A
3130A~43A
2100A~50A
180A~80A🔒 Sicher
# Automation: Victron Ladestrom begrenzen
trigger:
  - platform: state
    entity_id: sensor.bms_active_charging_count
action:
  - service: modbus.write_register
    data:
      hub: victron
      slave: 100
      address: 2705
      value: {{ target_current }}  # 80–200A je nach Count

BLE-Verify-Loop

Da Bluetooth-Befehle verloren gehen können, wird jeder Schaltbefehl verifiziert:

# Script: bms_set_charging
sequence:
  - repeat:
      count: 3  # max. 3 Versuche
      sequence:
        - service: switch.turn_off  # Befehl senden
          target:
            entity_id: switch.bms_X_charging
        - delay:
            seconds: 8  # BLE-Latenz abwarten
        - if:
            - condition: template
              value_template: states('switch…') == 'off'
          then:
            - stop: Erfolg ✅

Per-BMS Automation

Jeder der 6 Akkus hat eine identische Automation (hier BMS #3 als Beispiel):

# Automation: BMS3 Charge Control
trigger:
  - platform: state
    entity_id: sensor.bms_3_bms_3_state_of_charge
action:
  - if:                                            # SOC ≥ Ziel → AUS
      - condition: template
        value_template: soc >= target_soc
    then:
      - service: script.bms_set_charging
        data:
          switch_entity: switch.bms_3_charging
          desired_state: "off"
  - if:                                            # SOC < Ziel-Hysterese → EIN
      - condition: template
        value_template: soc < (target - hyst)
    then:
      - service: script.bms_set_charging
        data:
          switch_entity: switch.bms_3_charging
          desired_state: "on"

Wochenlogik

AutomationTriggerAktion
Mo 00:01Zeit · MontagModus → 90% Limit
So 00:01Zeit · SonntagModus → 100% Full
So 23:59Zeit · SonntagWenn nicht alle 100% → Carryover starten
Carryover ResetAlle BMS ≥ 99,5%Carryover beenden, zurück zu 90%
7-Tage-WarnungCarryover > 7 TageNotification: Akkus prüfen!
Home Assistant ESP32 BLE JK-BMS Victron YAML Automation Hysterese
— VIBECODED WITH —
🧝‍♂️✨🤖
Rasputin @ OpenClaw
via DeepSeek V4 Pro · 17. Mai 2026
0 Zeilen manuell · 100% AI-architected · deployed in 90 Minuten