Seite 90 von 90

Re: SOC BMW

Verfasst: Mo Okt 06, 2025 6:01 am
von Wynton
Hallo zusammen

seit gestern meine Wallbox einen Reboot durchlaufen hat, funktioniert die SOC Abfrage meines Mini SE nicht mehr.


RuntimeError
raise RuntimeError
File "/var/www/html/openWB/modules/soc_i3/i3soc.py", line 189, in getHTTP
body = getHTTP(url, headers)
File "/var/www/html/openWB/modules/soc_i3/i3soc.py", line 408, in requestData
data = requestData(token, vin)
File "/var/www/html/openWB/modules/soc_i3/i3soc.py", line 534, in main
main()
File "/var/www/html/openWB/modules/soc_i3/i3soc.py", line 555, in <module>
Traceback (most recent call last):
2025-10-06 07:56:40: ERROR: soc_i3:LP1: Request failed, exception=

headers={
2025-10-06 07:56:40: ERROR: soc_i3:LP1: requestData: url=https://cocoapi.bmwgroup.com/eadrax-vcs ... cles/state,
2025-10-06 07:56:40: ERROR: soc_i3:LP1: Data-Request failed
2025-10-06 07:56:40: ERROR: soc_i3:LP1: Request failed, StatusCode: 489
2025-10-06 07:55:03: PID: 19046: ##### cron5min.sh finished ##### (LV0)
2025-10-06 07:55:02: PID: 19274: Starting OpenWB services (LV0)
2025-10-06 07:55:01: PID: 19046: ##### cron5min.sh started ##### (LV0)

den Captcha Token habe ich erneuert
Version meiner OPEN WB ist die 1.9.304.0
Hat jemand eine Idee?

Besten Dank vorab
Viele Grüße Jörg


edit: ich hab die VIN mal unkenntlich gemacht

Re: SOC BMW

Verfasst: Mo Okt 06, 2025 7:19 am
von heidanei
Hi!
Wynton hat geschrieben: Mo Okt 06, 2025 6:01 am Hallo zusammen

seit gestern meine Wallbox einen Reboot durchlaufen hat, funktioniert die SOC Abfrage meines Mini SE nicht mehr.
[...]
Hat jemand eine Idee?
BMW hat die bisherige App-Schnittstelle so verändert dass keine Zugriffe von Dritten mehr möglich sind, dafür aber eine neue Schnittstelle geschaffen, siehe viewtopic.php?p=133578#p133578. (Die Nachricht müsstest Du eigentlich auch in Deiner MyMINI-App bekommen haben.)

Das SoC-Modul muss angepasst, bzw. eigentlich komplett neu geschrieben werden, dazu muss sich auch erst noch jemand finden der es macht, es wird also wahrscheinlich noch etwas dauern.

heidanei

PS: Du solltest die VIN von Deinem Fzg. aus dem Log löschen.

Re: SOC BMW

Verfasst: Mo Okt 06, 2025 9:59 am
von KaiGo
BMW hat sie bisher genutzte Schnittstelle, die zum Beispiel auch von Homeassistent und so genutzt wurde, abgeschaltet. Man muss jetzt eine komplett neue API (BMW CarData) verwenden. Bis das in der OpenWB Stable ankommt kann vermutlich noch etwas dauern. Auch muss man selber erstmal einen Client im BMW Connected Drive Portal konfigurieren.

Re: SOC BMW

Verfasst: Mo Okt 06, 2025 11:06 am
von Wynton
danke für die Rückmeldungen

Vg Jörg

Re: SOC BMW

Verfasst: Sa Okt 11, 2025 11:01 am
von chrisbu
Hallo Freunde der gepflegten Problemlösung


ich habe eine ganz brauchbare Methode um über Homeassistant und der Integration https://github.com/JjyKsi/bmw-cardata-ha und der Integration "openWB2 over MQTT" die Zwischenwerte berechnen zu lassen.
Über die BMW Integration "cardata" kommt ja nur alle 40 min ein aktualisierter Wert. Damit würde die Begrenzung auf z.B. 80 % eigentlich unmöglich.
Beispiel: letzter Sync mit BMW-> SOC=79%
40 min warten
realer Wert geht dann auf 90 oder noch mehr.
nach 40 min neuer Sync mit BMW-> Grenze von 80% erreicht, stoppe die Ladung. (Dabei sind es doch schon 92% geworden)


die Folgende Anpassung in Homeassistant berechnet einfach zwischen 2 Syncs die Werte und addiert die zum aktuellen SOC.
mit Hilfe der "Variablen" soc_efficiency kann man versuchen den berechneten an den realen Wert anzugleichen. Bei mir sind das ziemlich genau 88% also 0,88. Da einfach etwas ausprobieren:

Bei mir wird nun in der Wallbox ca. alle 20 Sek. der Wert geändert.
Änderungen oder Verbesserungen sind willkommen!

Code: Alles auswählen

###############################################################################
# 🧠 BMW SoC Interpolation Package (Final Enhanced)
# Autor: ChatGPT + User
# Zweck:
#   - Glättet den SoC-Verlauf zwischen seltenen BMW-API-Updates (~40 min)
#   - Berechnet theoretischen SoC aus Ladeenergie (Gesamtenergie)
#   - Erkennt echte Updates, pausiert kurz und sendet MQTT
#   - Beibehaltung des letzten berechneten Werts nach Ladeende
#   - Schützt vor Sprüngen >100 % und unterstützt Debug-Überwachung
###############################################################################

homeassistant:
  customize:
    sensor.bmw_soc_interpoliert:
      friendly_name: "BMW SoC (interpoliert)"

###############################################################################
# 🧮 Helfer
###############################################################################
input_number:
  soc_start_bmw:
    name: Letzter echter SoC BMW
    min: 0
    max: 100
    step: 0.1
    unit_of_measurement: "%"

  energy_start_bmw:
    name: Geladene Gesamtenergie bei letztem SoC-Update
    min: 0
    max: 10000000
    step: 0.01
    unit_of_measurement: "kWh"

  soc_efficiency:
    name: Ladeeffizienz
    min: 0.5
    max: 1.0
    step: 0.01
    unit_of_measurement: "%"
    initial: 0.88

  soc_last_interpolated:
    name: Letzter berechneter interpolierter SoC
    min: 0
    max: 100
    step: 0.1
    unit_of_measurement: "%"

###############################################################################
# ⏸️ Helfer – Pause nach echtem Update
###############################################################################
input_boolean:
  bmw_soc_pause_interpolation:
    name: Interpolation pausieren
    icon: mdi:pause-circle

###############################################################################
# ⚙️ Automation 1 – Echten SoC merken, MQTT senden und Interpolation pausieren
###############################################################################
automation:
  - alias: BMW SoC Update speichern
    id: bmw_soc_update_speichern
    description: Speichert den SoC, sendet MQTT und pausiert die Interpolation.
    trigger:
      - platform: state
        entity_id: sensor.state_of_charge_predicted_on_bmw_side
    action:
      # 🧮 1️⃣ SoC-Start speichern
      - service: input_number.set_value
        data:
          entity_id: input_number.soc_start_bmw
          value: "{{ trigger.to_state.state | float }}"
      # ⚡ 2️⃣ Aktuelle Gesamtenergie speichern
      - service: input_number.set_value
        data:
          entity_id: input_number.energy_start_bmw
          value: "{{ states('sensor.openwb_chargepoint_3_geladene_energie_gesamt') | float }}"
      # 📡 3️⃣ Echten SoC sofort über MQTT senden
      - service: mqtt.publish
        data:
          topic: openWB/set/vehicle/0/get/soc
          payload: "{{ trigger.to_state.state | float }}"
          qos: 1
          retain: true
      # ⏸️ 4️⃣ Interpolation pausieren
      - service: input_boolean.turn_on
        target:
          entity_id: input_boolean.bmw_soc_pause_interpolation
      - delay: "00:00:20"
      - service: input_boolean.turn_off
        target:
          entity_id: input_boolean.bmw_soc_pause_interpolation
    mode: restart

###############################################################################
# ⏱️ Automation 2 – Aktualisiert theoretischen SoC bei Energieänderung & sendet MQTT
###############################################################################
  - alias: BMW SoC theoretisch aktualisieren
    id: bmw_soc_theoretisch_aktualisieren
    trigger:
      - platform: state
        entity_id: sensor.openwb_chargepoint_3_geladene_energie_gesamt
    action:
      # 1️⃣ Sensor aktualisieren
      - service: homeassistant.update_entity
        target:
          entity_id: sensor.bmw_soc_interpoliert
      # 2️⃣ MQTT veröffentlichen
      - service: mqtt.publish
        data:
          topic: openWB/set/vehicle/0/get/soc
          payload: "{{ states('sensor.bmw_soc_interpoliert') }}"
          qos: 1
          retain: true
    mode: single

###############################################################################
# 🧾 Automation 3 – Letzten berechneten SoC speichern
###############################################################################
  - alias: BMW letzten interpolierten SoC speichern
    id: bmw_soc_letzten_interpolierten_speichern
    trigger:
      - platform: state
        entity_id: sensor.bmw_soc_interpoliert
    condition:
      - condition: numeric_state
        entity_id: sensor.bmw_soc_interpoliert
        above: 0
    action:
      - service: input_number.set_value
        data:
          entity_id: input_number.soc_last_interpolated
          value: "{{ states('sensor.bmw_soc_interpoliert') | float }}"
    mode: queued

###############################################################################
# 📈 Template-Sensor – Berechneter SoC während des Ladens (mit Gesamtenergie)
###############################################################################
template:
  - sensor:
      - name: "BMW SoC interpoliert"
        unique_id: bmw_soc_interpoliert
        unit_of_measurement: "%"
        device_class: battery
        state: >
          {% set soc_start = states('input_number.soc_start_bmw') | float %}
          {% set soc_last = states('input_number.soc_last_interpolated') | float %}
          {% set e_start = states('input_number.energy_start_bmw') | float %}
          {% set e_now = states('sensor.openwb_chargepoint_3_geladene_energie_gesamt') | float %}
          {% set eff = states('input_number.soc_efficiency') | float %}
          {% set batt = states('sensor.energy_content_high_voltage_battery') | float %}
          {% set p_now = states('sensor.openwb_chargepoint_3_ladeleistung') | float %}
          {% set pause = is_state('input_boolean.bmw_soc_pause_interpolation', 'on') %}

          {% if batt > 0 and not pause %}
            {% set delta_e = (e_now - e_start) * eff %}
            {% if delta_e >= 0 and p_now > 0 %}
              {% set soc_est = soc_start + (delta_e / batt * 100) %}
            {% else %}
              {% set soc_est = soc_last %}
            {% endif %}
            {{ [soc_est, 100] | min | round(1) }}
          {% else %}
            {{ soc_last | round(1) }}
          {% endif %}

###############################################################################
# 🧪 Debug-Sensor – Zeigt Rohdaten zur Kontrolle (optional)
###############################################################################
      - name: "BMW SoC Debug"
        unique_id: bmw_soc_debug
        state: >
          {{ {
            'soc_start': states('input_number.soc_start_bmw'),
            'soc_last': states('input_number.soc_last_interpolated'),
            'e_start': states('input_number.energy_start_bmw'),
            'e_now': states('sensor.openwb_chargepoint_3_geladene_energie_gesamt'),
            'eff': states('input_number.soc_efficiency'),
            'batt': states('sensor.energy_content_high_voltage_battery'),
            'p_now': states('sensor.openwb_chargepoint_3_ladeleistung'),
            'pause': is_state('input_boolean.bmw_soc_pause_interpolation', 'on')
          } }}

den Code in Homeassistant unter "packages" in eine bmw_soc.yaml speichern und das ganze einmal neu starten.
Wie das mit den Packages geht ist hier ganz gut beschrieben: https://community.simon42.com/t/struktu ... aml/3332/2

Re: SOC BMW

Verfasst: Sa Okt 11, 2025 3:41 pm
von openWB
Du kannst beim manuellen SoC Modul der openWB initial den SoC übertragen und die openWB rechnet selbst hoch.
Das klappt sehr gut.

Re: SOC BMW

Verfasst: Sa Okt 11, 2025 5:49 pm
von tomtom69
Wenn ich den SoC manuell übertrage:
Darf das nur am Anfang der Ladung passieren, und danach nicht mehr (=weil der berechnete Wert sonst überschrieben wird)?
Es gibt eine Abfragemöglichkeit mit der neuen API, z.B. hier:
https://github.com/dj0abr/bmw-mqtt-bridge
Aber anscheinend (ich konnte es noch nicht prüfen, weil das mit den Tokens bei mir noch nicht hinhaut) wird der Wert in der API nicht mehr während dem Laden aktualisiert, d.h. es bräuchte dann noch eine Logik, die den Wert nur zum Ladestart oder beim Anstecken an die OpenWB überträgt, und nicht mehr während der Ladung.

Re: SOC BMW

Verfasst: Mi Okt 15, 2025 12:12 pm
von DerDennis
@chrisbu

Wenn du den Wert "sensor.state_of_charge_predicted_on_integration_side" nimmst wird dieser während des Ladens alle 5 Minuten übertragen.
"State of Charge (Predicted on BMW SIDE)" wird nur alle 40 Minuten übertagen.