NEWS
Test Adapter BMW/Mini v4.x.x
-
@stenmic Im alten Adapter fand sich der Verbrauch unter bmw.0.WBAxxx.trips.monthly.totalCombustionConsumption.averageConsumption.
Anbei mein Skript zur Verbrauchsermittlung.
Ablauf: Das Skript schreibt die Wertepaare für km und Liter immer dann in den Datenpunkt 0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel, wenn sich der Tankfüllstand reduziert. Nach 9 Wertepaaren wird die Differenz zwischen neuem Wertepaar und ältestem Wertepaar berechnet und daraus der Verbrauch; das älteste Wertepaar wird dann gelöscht. Wenn getankt wird (und sich deshalb der Tankfüllstand um mehr als 10 Liter erhöht) werden alle Wertepaare gelöscht; die nächste Rechnung findet dann erst wieder statt, wenn es wieder 9 Wertepaare gibt. (Grund ist, dass der BMW-Adapter nur ganze Liter liefert und es daher beim Tanken in der Rechnung eine Ungenauigkeit von bis zu 2 Litern geben könnte (z. B. aktueller Stand 10,0 oder 10,9 Liter und nach dem Tanken z. B. 55,0 oder 55,9 Liter --> ergäbe stets eine Differenz von 45 Litern, obwohl es 44,1 oder 45,9 Liter sein könnten)).
Das Ergebnis der Verbrauchsrechnung wird im Datenpunkt 0_userdata.0.Fahrzeuge.BMW_Verbrauch_je_100km abgelegt.Hier das JS (Blockly gerne auf Anfrage im Chat über private Mailadresse):
var alter_String, Anzahl_Werte, neuer_String, letzter_Listenwert, Liter_Differenz, km_Differenz, Verbrauch; // Verfolgung des Tankinhalts // Auswertung DP bmw.0.WBAxxx.stream.vehicle.drivetrain.fuelSystem.remainingFuel.value on({ id: [].concat(['bmw.0.WBAxxx.stream.vehicle.drivetrain.fuelSystem.remainingFuel.value']), change: 'ne' }, async (obj) => { let value = obj.state.val; let oldValue = obj.oldState.val; if ((obj.state ? obj.state.val : '') > (obj.oldState ? obj.oldState.val : '') + 10) { // es wird/wurde getankt --> Rücksetzen der Werte // Aufbau: Anzahl Werte: {Liter;km},... // hier: value = bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value if (getState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel').val.charAt(0) != '0') { console.warn((['BMW wird bzw. wurde betankt; Wert vom BMW: ',(obj.state ? obj.state.val : ''),'l'].join(''))); } neuer_String = ['0: {',('' + (obj.state ? obj.state.val : '')),';',('' + getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val),'}'].join(''); setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel' /* BMW Verbrauch km bei l-Wechsel */, neuer_String, true); console.info(('BMW Tankfüllstand hat sich erhöht; Init-Wert: ' + String(neuer_String))); } else if ((obj.state ? obj.state.val : '') < (obj.oldState ? obj.oldState.val : '')) { alter_String = getState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel').val; Anzahl_Werte = parseFloat((alter_String.charAt(0))); if (Anzahl_Werte == 0) { // erster neuer Wert // Aufbau: Anzahl Werte: {Liter;km},... // hier: value = bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value neuer_String = ['1: {',('' + (obj.state ? obj.state.val : '')),';',('' + getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val),'}'].join(''); setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel' /* BMW Verbrauch km bei l-Wechsel */, neuer_String, true); console.info(('BMW Tankfüllstand hat sich erstmalig reduziert; neu: ' + String(neuer_String))); } else if (Anzahl_Werte < 9) { // weitere Werte // Aufbau: Anzahl Werte: {Liter;km},{Liter;km},... // hier: value = bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value neuer_String = ('' + (Anzahl_Werte + 1)); neuer_String = String(neuer_String) + String(alter_String.slice(1, alter_String.length)); neuer_String = [neuer_String,',{',('' + (obj.state ? obj.state.val : '')),';',('' + getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val),'}'].join(''); setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel' /* BMW Verbrauch km bei l-Wechsel */, neuer_String, true); console.info(('BMW Tankfüllstand hat sich reduziert; neu: ' + String(neuer_String))); } else if (Anzahl_Werte == 9) { // Liste voll --> 1. Berechnung Differenzwerte // Aufbau: Anzahl Werte: {Liter;km},{Liter;km},... // neuer Literwert: "Wert" // neuer km-Wert: siehe DP "value" // 1. a) Spritmenge (in Litern) berechnen: letzter_Listenwert = parseFloat((alter_String.slice(((alter_String.lastIndexOf('{') + 1 + 1) - 1), (alter_String.lastIndexOf(';') + 1) - 1))); if (parseFloat((obj.state ? obj.state.val : '')) == letzter_Listenwert) { // keine Änderung in der Literzahl // --> Abbruch console.warn('keine Änderung in der Literzahl --> weder Neueintrag noch Berechnung'); } else { Liter_Differenz = parseFloat((alter_String.slice(((alter_String.indexOf('{') + 1 + 1) - 1), (alter_String.indexOf(';') + 1) - 1))) - parseFloat((obj.state ? obj.state.val : '')); // 1. b) km-Differenz berechnen km_Differenz = getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val - parseFloat((alter_String.slice(((alter_String.indexOf(';') + 1 + 1) - 1), (alter_String.indexOf('}') + 1) - 1))); // Verbrauchsrechnung: if (km_Differenz > 0) { // neue Berechnung Verbrauch = Math.round(((Liter_Differenz * 100) / km_Differenz) * 10) / 10; setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_je_100km' /* BMW Verbrauch je 100km */, Verbrauch, true); console.warn((['BMW-Verbrauchsrechnung ist erfolgt bei ',getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val,' km mit einem Delta von ',Liter_Differenz,' Litern und ',km_Differenz,'km. Ergebnis: ',Verbrauch,' l/100km'].join(''))); } else { // Fehler, da km-Differenz = 0! setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_je_100km' /* BMW Verbrauch je 100km */, 99.9, true); console.error((['BMW-Verbrauchsrechnung sollte erfolgen bei ',getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val,' km, aber die Entfernungs-Differenz ist Null ','--> FEHLER !!'].join(''))); } // Liste voll --> 2. Werte durchschieben und // neues Wertepaar hinzufügen // Aufbau: 9: {Liter;km},{Liter;km},... // hier: value = bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value neuer_String = alter_String.slice(((alter_String.indexOf('},{') + 1 + 2) - 1), alter_String.length); neuer_String = ['9: ',neuer_String,',{',('' + (obj.state ? obj.state.val : '')),';',('' + getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val),'}'].join(''); setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel' /* BMW Verbrauch km bei l-Wechsel */, neuer_String, true); console.info(('BMW Tankfüllstand hat sich reduziert und Verbrauchsrechnung getriggert; neu: ' + String(neuer_String))); } } else { // Fehler console.error(('Ungültiger Wert für 0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel: ' + String(Anzahl_Werte))); setState('0_userdata.0.Fahrzeuge.BMW_Verbrauch_km_bei_l-Wechsel' /* BMW Verbrauch km bei l-Wechsel */, (['0: {',('' + (obj.state ? obj.state.val : '')),';',('' + getState('bmw.0.WBAxxx.stream.vehicle.vehicle.travelledDistance.value').val),'}'].join('')), true); } } else { // Spritwerte gleich oder geringfügig höher // --> keine Aktion } });@vowill sagte in Test Adapter BMW/Mini v4.x.x:
@stenmic Im alten Adapter fand sich der Verbrauch unter bmw.0.WBAxxx.trips.monthly.totalCombustionConsumption.averageConsumption.
ok, den hab ich nie genutzt, mich interessiert mehr der Verbrauch ab tanken.
-
@silgri said in Test Adapter BMW/Mini v4.x.x:
Hätte aber gerne noch den Ladezustand beim Laden.
Im Moment mache ich das auch per Script, wenn an der Lade-Steckdose (11kW) Strom fließt, mache ich alle 10 Minuten ein API AbrufSoweit ich das bisher verstanden habe, wird beim AC-Laden, wenn das Auto ansonsten aus ist, seitens BMW kein Update per MQTT verschickt.
Während der Fahrt -> SoC Update per MQTT.
Beim AC Laden -> Kein MQTT Update, nur per API-Abfrage.@derdominik said in Test Adapter BMW/Mini v4.x.x:
@silgri said in Test Adapter BMW/Mini v4.x.x:
Hätte aber gerne noch den Ladezustand beim Laden.
Im Moment mache ich das auch per Script, wenn an der Lade-Steckdose (11kW) Strom fließt, mache ich alle 10 Minuten ein API AbrufSoweit ich das bisher verstanden habe, wird beim AC-Laden, wenn das Auto ansonsten aus ist, seitens BMW kein Update per MQTT verschickt.
Während der Fahrt -> SoC Update per MQTT.
Beim AC Laden -> Kein MQTT Update, nur per API-Abfrage.Aber beim Fahren kommt ja auch nix :disappointed:
-
Irgendwie stelle ich mich zu blöd an.
Ich bekomme von meinem E-Mini keine Daten mehr.
Zum CarData kann ich den auch irgendwie nicht hinzufügen.
Wer kann mir helfen?@hantschel sagte in Test Adapter BMW/Mini v4.x.x:
Wer kann mir helfen?
Ohne was halbwegs handfestestes aus z. B. dem Log vermutlich niemand.
-
Problem Solved - Neu Authorisierung über BMW Seite analog LogDatei norwendig...
Wurde aber am Vortag nicht angezeigt.
Hallo
folgendes PRoblem.
Was muss ich tun?
bmw.0 2025-11-19 14:14:47.019 error Token refresh failed with HTTP 400 auth error - starting new device flow bmw.0 2025-11-19 14:14:47.019 error Response status: {"error":"invalid_request","error_description":"The request is missing a required parameter, includes an unsupported parameter value (other than grant type), repeats a parameter, includes multiple credentials, utilizes more than one mechanism for authenticating the client, or is otherwise malformed"} bmw.0 2025-11-19 14:14:47.018 error AxiosError: Request failed with status code 400 -
Sorry für die banale Frage, aber wie bekomme ich meinen Adapter von 4.0.5 (stable) auf 4.31. (beta)?
Ich bin auf Repository Beta und bei dem + (eine bestimmte Version installieren) muss ich was eingeben?
Danke vorab@daruse
Am besten das Repo auf Stable setzen und dann nur diesen einen Adapter aus Beta fischen:
Edit: Reden wir über den gleichen Adapter? Denn der ist nie als stable veröffentlicht worden:
bmw github: 4.3.1 for 29 days latest: 4.3.0 for 45 days stable: -.-.- -
Die sog. 4.3.1. ist ja auch eine GITHUB-'Version'. Die installiert man ohnehin nicht.
-
Hallo,
kann ich den SoH irgendwo in den Datenpunkten sehen?
Beim Durchschauen der Datenpunkte habe ich nur SoC (100% timestamp 17.08.2025) gefunden.bmw.0.WMWxxxxxxxxxxxxx.stream.vehicle.powertrain.electric.battery.stateOfChargeVielleicht habe ich etwas übersehen.
Gruss S.
-
@Steffe.S.
Hab's gefunden:
bmw.0.**********.stream.vehicle.powertrain.electric.battery.stateOfHealth.displayed.value
Bei mir steht da 100 (Fahrzeug hat erst 5000km drauf) -
@Steffe.S. sagte in Test Adapter BMW/Mini v4.x.x:
mach mal Deine Fahrgestellnummer unsichtbar.
bei steht da SoC
ups, danke
meinst Du das: Health status of the high-voltage battery (SOCE) -
@Steffe.S.
aktueller SoC steht in
bmw.0.*****.stream.vehicle.drivetrain.electricEngine.charging.level.value
Bei mir aktuell 80%
Wenn ich das CarData Archiv anfordere steht in den Daten auch SoH 100%
Passend zu
bmw.0.**********.stream.vehicle.powertrain.electric.battery.stateOfHealth.displayed.value -
@Steffe.S.
aktueller SoC steht in
bmw.0.*****.stream.vehicle.drivetrain.electricEngine.charging.level.value
Bei mir aktuell 80%
Wenn ich das CarData Archiv anfordere steht in den Daten auch SoH 100%
Passend zu
bmw.0.**********.stream.vehicle.powertrain.electric.battery.stateOfHealth.displayed.value -
@Steffe.S.
Hast Du schon mal das CarData Archiv angefordert?
Dort ist eine XML Datei enthalten, BMW-CarData-KeyList_*****_24-11-2025.xml
Diese enthält den SoCE (State of Certified Energy), das ist die neue Euro-7-Norm:
<telematicValue>
<name>Gesundheitszustand der Hochvoltbatterie (SOCE)</name>
<value>100</value>
<unit>-</unit>
<fetchTimestamp>22.11.2025 08:10:50 UTC</fetchTimestamp>
<valueTimestamp>22.11.2025 08:10:50 UTC</valueTimestamp>
<dataCategoryType>BEV_PHEV_DATA</dataCategoryType>
<telematicKeyName>vehicle.powertrain.electric.battery.stateOfHealth.displayed</telematicKeyName>
</telematicValue><telematicKeyName> passt dann wieder zum Datenpunkt des Adapters
-
@Steffe.S.
Hast Du schon mal das CarData Archiv angefordert?
Dort ist eine XML Datei enthalten, BMW-CarData-KeyList_*****_24-11-2025.xml
Diese enthält den SoCE (State of Certified Energy), das ist die neue Euro-7-Norm:
<telematicValue>
<name>Gesundheitszustand der Hochvoltbatterie (SOCE)</name>
<value>100</value>
<unit>-</unit>
<fetchTimestamp>22.11.2025 08:10:50 UTC</fetchTimestamp>
<valueTimestamp>22.11.2025 08:10:50 UTC</valueTimestamp>
<dataCategoryType>BEV_PHEV_DATA</dataCategoryType>
<telematicKeyName>vehicle.powertrain.electric.battery.stateOfHealth.displayed</telematicKeyName>
</telematicValue><telematicKeyName> passt dann wieder zum Datenpunkt des Adapters