Hallo Zusammen,
BMW hat eine Änderung am Connected Drive Backend vorgenommen.
Damit wurden die bisherigen Wege für eine Smart Home Integration geschlossen und BMW bietet nun eine offizielle Schnittstelle an.
Die zuvor genutzte Schnittstelle war nicht offiziell und wurde mittels Reverse Engineering entwickelt.
Die neue Schnittstelle basiert auf MQTT und liefert, im Gegensatz zur vorherigen Schnittstelle, nahezu Livedaten.
In einem Test habe ich fast jeden gefahrenen Kilometer ein Update über MQTT erhalten.
Jetzt gibt es noch ein Problem...
Man muss erst einen Car Client erstellen, diesen autorisieren und anschließend Tokens abfragen.
Diese Tokens haben unterschiedliche Gültigkeiten und müssen vor Ablauf erneuert werden.
Access und ID Token sind lediglich eine Stunde gültig, während der Refresh Token 14 Tage gültig ist.
Soweit ich es verstehe, werden alle drei Tokens beim refresh aktualisiert und starten mit einer frischen Gültigkeit.
Ich bin grade noch dabei das ganze in meiner openHAB Installation einzurichten.
Manuell bekomme ich das hin und auch die Aktualisierung vor Ablauf der Gültigkeit funktioniert.
Gestern wurde der Zugang trotzdem nach ein paar Stunden geschlossen, wobei es heute problemlos funktioniert und die Tokens verlängert werden.
Wer sich für sowas interessiert kann mal in die Doku schauen:
Zur Einrichtung sind folgende Schritte nötig, dabei dürfen die Tabs NICHT geschlossen werden!
1. Öffnen der Fahrzeugübersicht und Auswahl "BMW CarData"
https://www.bmw.de/de-de/mybmw/vehicle-overview
2. Unter "Technischer Zugang zu BMW CarData" die Option "CarData Client erstellen" wählen
Hier die Client_ID kopieren und beide Schalter aktivieren, wobei man einen Moment warten muss, bevor man den zweiten Schalter aktiviert.
Sollte man eine Fehlermeldung erhalten, muss man den Tab schließen und die Seite neu laden.
3. Öffnen des "CarData Customer Portals" und Auswahl der "Device Code Flow API"
4. "Device Flow with PKCE" aufklappen und "gcdm/oauth/device/code" (Starts the device code flow) aufklappen
5. "Try it out" anklicken, die Client_ID aus 2 einfügen und auf Execute klicken.
6. Weiter unten sollte die Antwort unter Responses mit Code 200 angezeigt werden.
Hier findet ihr zwei weitere Informationen: Den User_Code und den Device_Code, beide müssen erneut kopiert werden.
Diese Daten benötigt ihr zur Autorisierung und der Anfrage des MQTT Passworts.
7. Im Tab aus Schritt 2 klickt ihr nun auf "Gerät authentifizieren", loggt euch mit eurem Connected Drive Account ein und gebt im neuen Tab den User_Code aus 6 ein.
Die Eingabe sollte mit "Gerät autorisiert" bestätigt werden.
8. Geht zurück auf die BMW CarData Seite, scrollt runter zu "CarData Streaming" und erstellt einen Stream.
9. Klappt die Verbindungsdetails auf und kopiert euch den Benutzernamen (gcid)
10. Unter "Datenauswahl ändern" könnt ihr nun alle nötigen Daten auswählen.
Hinweis: Es gibt über 200 Datenpunkte, wobei nicht alle von jedem Fahrzeug unterstützt werden.
Wer möchte, kann das per Console des Browsers automatisieren, siehe Skript am Ende des Beitrags.
11. Geht zurück zum "CarData Customer Portal" und klappt "/gcdm/oauth/token" (Request a token for the device) auf.
12. Klickt auf "Try it out", fügt eure Client_ID und den Device_Code ein. Bestätigt die Eingabe mit "Execute".
Ihr solltet erneut eine Antwort mit Response Code 200 sehen.
13. In der Antwort findet ihr nun mehrere IDs und Tokens.
gcid = Benutzername, identisch zu Schritt 9
access_token = Wird zur Verwendung der CarData API genutzt
refresh_token = Token mit dem alle Tokens erneuert werden können
id_token = Das Passwort für MQTT
Abschließend könnt ihr die Daten mit dem MQTTX Client testen.
Hier eine Anleitung:
Für den Subscriber verwendet man seine gcid/VIN, also "12345678-1234-1234-123456789012/WBA1AB23456CD78901".
Anschließend kann man ein Update per MyBMW App anstoßen, z.B. das Fahrzeug abschließen.
Nur sollte man die Datenpakete erhalten.
Im zweiten Post füge ich noch eine Liste der verfügbaren Datenpunkte ein.
Edit: Leider ist die Gesamtliste aller verfügbaren Punkte zu lang, daher nur die Daten welche mein Auto bisher sendet.
Quelle Skript:
(() => {
const labels = document.querySelectorAll('.css-k008qs label.chakra-checkbox');
let changed = 0;
labels.forEach(label => {
const input = label.querySelector('input.chakra-checkbox__input[type="checkbox"]');
if (!input || input.disabled || input.checked) return;
label.click();
if (!input.checked) {
const ctrl = label.querySelector('.chakra-checkbox__control');
if (ctrl) ctrl.click();
}
if (!input.checked) {
input.checked = true;
['click', 'input', 'change'].forEach(type =>
input.dispatchEvent(new Event(type, { bubbles: true }))
);
}
if (input.checked) changed++;
});
console.log(`Checked ${changed} of ${labels.length} checkboxes.`);
})();
Alles anzeigen