Aufrufen der Tesla Software API

01.11.2018

Eigentlich ist Tesla ein Autohersteller. Wenn man aber die Struktur des Unternehmens, deren Prozesse und vor allem die hergestellten Produkte genauer ansieht, stellt man schnell fest: Tesla ist auch ein Software-Haus. Sämtliche Produkte wurden so konzipiert, dass sich deren Funktionsumfang im Wesentlichen durch Software definiert. Die darunter liegende Hardware ist generisch und weitestgehend standardisiert. Zur Vernetzung der Plattformkomponenten stellt Tesla eine Software-Programmierschnittstelle (sog. API Application Programmable Interface) zur Verfügung, die eigentlich für den internen Gebrauch bestimmt ist. Allerdings unternimmt Tesla keine Anstrengungen, den Zugriff auf die unkritischen Funktionen auch für außenstehende Entwickler zu verhindern. Deshalb habe auch ich mit damit beschäftigt, meinen Tesla Model S über die Software mit meinem eigenen Ökosystem hundhome zu verbinden.

Was ist eine API?

Gemäß Wikipedia ist eine API eine Schnittstelle zur Programmierung von Anwendungen (API: Application Programming Interface). Das ist also ein Programmteil, der von einem Softwaresystem anderen Programmen zur Anbindung an das System zur Verfügung gestellt wird. Heutzutage stellen insbesondere Online-Dienste Programmierschnittstellen zur Verfügung. Diese werden auch oft Webservices genannt, weil das http-Protokoll zum Einsatz kommt, welches man auch verwendet, um im Browser Internet-Seiten aufzurufen. APIs werden u.a. auch dazu benutzt, Systeme und Komponente miteinander zu verbinden, die ursprünglich nicht im Zusammenhang stehen. Dadurch entstehen End-to-End Funktionen, die ganz neue Möglichkeiten eröffnen.

Die Tesla API

Zur Verknüpfung seiner Fahrzeuge mit den Energiespeichern (Powerwalls) und den Ladesäulen (Super Charger) hat Tesla eine API in seine Produkte eingebaut. Auch die eigene Mobile App für Android und Apple iOS nutzt diese API für den Zugriff auf die Tesla Produkte durch den Kunden. Eigentlich wurde diese API von Tesla nicht veröffentlicht. Aber es wurde auch nicht verhindert, dass findige Entwickler sich die einzelnen Funktionen der API sorgfältig mitnotiert haben, die Ergebnisse dokumentierten und im Internet veröffentlichten. Hervorzuheben ist dabei die Dokumentation von Tim Dorr, dem Cofounder von SalesLoft. Diese Dokumentation ist auch die Grundlage gewesen für meine eigenen Untersuchungen.

Verbindung des Tesla mit dem Internet

Damit man aus der Ferne auf die Daten eines Autos zugreifen kann, hat dieses eine permanente weltweit nutzbare Mobilfunk-Datenverbindung. Darüber sind die Fahrzeuge aber nicht direkt mit dem Internet verbunden, sondern mittels VPN-Technologie (Virtual Private Network) zunächst nur mit dem Tesla-internen Netz. Deshalb sind die Wagen vor direktem Zugriff geschützt und nur gewünschte Verbindungen werden gezielt zugelassen.
Wenn man aus dem Auto nun eine Verbindung mit einem Internet-Dienst herstellt (Spotify, Youtube, Browser, siehe rote Linien im Bild), dann gehen die Daten zunächst zu einem regionalen Gateway und von dort ins Internet. Man erkennt es daran, dass z.B. europäische Teslas mit einer IP-Adresse aus Holland oder Spanien (das sind die europäischen Gateway-Standorte) auf Internet Dienste zugreifen, die darauf hin teilweise ihre Webseiten auf eine fremde Sprache schalten.
Wenn man wiederum mit der App auf sein Auto zugreift, dass erreicht man erst einen zentralen API-Server, der dann die Kommunikation über das zugehörige regionale Gateway an das Fahrzeug weiterleitet, wenn es erreichbar ist (grüne Linien im Bild).

Funktionsumfang der Tesla API

Von der API sind bisher folgende Funktionsgruppen bekannt:

  1. Status und Kommandos
    Diese API basiert auf gewöhnlichen REST Aufrufen und ist primär für die App von Bedeutung. Dazu liefert sie aktuelle Informationen zum Status des Fahrzeugs und bietet Zugriff auf eine Auswahl von Kommandos. Dieser Teil der API ist Gegenstand meiner weiteren Betrachtung.
  • Temperatur innen und außen am Auto auslesen
  • Bedienen der Klimaanlage, Heizung, Defrost
  • Öffnen des Schiebedachs, Kofferräume und der Türen
  • Betätigen von Hupe und Lichthupe
  • Begrenzung von Tempo, Wächtermodus/Valet-Modus
  • Ladestatus und Ladelimit
  • Bestimmung des aktuellen Standorts, der Himmelsrichtung und der Fahrgeschwindigkeit
  • Produktinformationen wie Seriennummer (VIN) und die Fahrzeugkonfiguration bis hin zur Bereifung
  1. Streaming von Telemetriedaten
    Für Tesla-interne Zwecke können während der Fahrt sowie zu jedem anderen Zeitpunkt Datenströme an Tesla Server gesendet werden. Dabei werden in ca. 0,5 Sekunden-Intervallen über HTTP-Streams Daten im JSON-Format übertragen, die dann bei Tesla zur Fehleranalyse und zum maschinellen Lernen verwendet werden können.

  2. Herbeirufen des Fahrzeugs ("Summon")
    Diese Schnittstelle nutzt das Websocket Protokoll für eine stehende bidirektionale Verbindung zwischen Fahrzeug und App während der Ausführung eines sog. Herbeirufs. Dabei bewegt sich das Fahrzeug fahrerlos und wird nur über die App gesteuert. Aus Sicherheitsgründen ist eine latenzfreie Kommunikation erforderlich.

Die API für Status und Kommandos

Vor der Nutzung der eigentlichen API muss dass anfragende System (wie z.B. die App) durch einen Authentifizierungsprozess. Tesla nutzt dabei das gängige OAuth2 Verfahren. Für die späteren API Aufrufe muss nicht jedesmal der Tesla-Username und das Passwort übertragen werden, sondern man verwendet ein sogenanntes Access Token, welches vorher durch einen Authentifizierungsaufruf erzeugt wird und ab dann für max. 45 Tage gültig ist. Die genauen Aufrufe zur Erzeugung können in der o.a. API-Dokumentation nachgelesen werden. Einige kennen möglicherweise andere Anwendungsfälle des Access Tokens zum Beispiel beim Dienst Teslafi. Auch dieser greift im Hintergrund auf die API zu und erlaubt die Verwendung des Access Tokens für die Nutzer, die ihr Passwort nicht an Dritte herausgeben wollen. Bei allen folgenden Aufrufen kann nun mit diesem Token authentifiziert werden, bis man es nach 45 Tagen wieder durch einen entsprechenden OAuth2 Request erneuern muss.

Die zweite Schnittstelle Vehicles" liefert nun eine Liste aller Fahrzeuge, die zu dem entsprechenden Tesla-Konto gehören. Zu jedem Fahrzeug werden zusätzliche statische Informationen gelistet wie die Seriennummer, die werkseitige Farbe, die gültigen Tokens, den ausgesuchten Fahrzeugnamen und die sogenannten Options-Codes. Dahinter verbirgt sich eine Liste von vielen vierstelligen Buchstaben/Ziffern-Codes, die weitere Details zur Konfiguration beschreiben. Das beginnt bei der Bezeichnung des Levels des Autopiloten und geht bis zur Nennung von Länderspezifischen Eigenschaften wie den Ladeanschluss. Eine Liste der Optionscodes findet ihr hier. Die App benötigt diese Informationen, damit das Fahrzeug visuell richtig dargestellt wird (Wagenfarbe und Felgen) und damit die richtigen Funktionen angezeigt werden (z.B. Betätigung des Schiebedaches, nur wenn man eines hat). Wichtig zum Verständnis ist, dass alle diese Daten auf dem Tesla Server in einer Fahrzeug-Datenbank hinterlegt sind. Für diese Anfrage ist keine direkte Verbindung zum Fahrzeug notwendig.

Die dritte Schnittstelle "Vehicle" bezieht sich nun auf ein bestimmtes Fahrzeug aus der vorher gezogenen Liste. Sie erlaubt das Auslesen von Sammel- und Einzeldaten (States) wie Status beim Fahrbetrieb, beim Ladevorgang, GPS-Position, Temperaturen usw. Desweiteren gibt es die Möglichkeit, Kommandos auszuführen (Commands). Damit kann man das Fahrzeug öffnen, Alarm auslösen, Licht- und akustische Hupe usw. Für den Zugriff auf diesen Teil der API muss der Tesla Server direkt nach dem Aufruf Kontakt zu dem Fahrzeug aufnehmen weil der Server selbst diese Informationen bzw. Funktion nicht aktuell zur Verfügung haben kann. Befindet sich das Fahrzeug außerhalb der Funkreichweite des Mobilfunknetzes, dann liefert diese API keine aktuellen Daten zurück. Befindet sich das Fahrzeug im Standby-Modus mit deaktivierter Internet-Verbindung, dann wird eine SMS an das Mobifunkmodul im Fahrzeug gesendet, um das Fahrzeug aufzuwecken. Dementsprechend kann die Beantwortung etwas dauern, was man als Tesla-Fahrer vom langen Ladekreisel nach manchem Start der Tesla-App kennt.

Schwächen der Tesla API

Wenn man die API durchstöbert und die Mechanismen der Aufrufe einmal ausprobiert, dann lässt sich schnell erkennen, dass dieser Teil der API insbesondere für die Verwendung der App konzipiert wurde. Sie ist weniger geeignet für eine intensive Server-to-Server Kommunikation. Es ergeben sich aus meiner Sicht folgende Schwächen:

  1. Polling
    Die API bietet keine Möglichkeit einer Rückwärtskommunikation. Wenn man in einer Anwendung kontinuierlich eine aktuelle Status-Anzeige realisieren will, muss man den Status ständig neu abrufen - ggf. mehrmals pro Sekunde. Eine Rückwärtskommunikation zum Beispiel über Websockets oder Reverse HTTP Requests könnte Events unmittelbarer und Ressourcen-schonender übertragen.
  2. Aufwachen
    Die Tesla Fahrzeuge haben in der Regel einen hohen sog. Vampir-Verlust - also eine stetige Batterieentlehrung während das Auto steht und nicht genutzt wird. Um diesen Verlust gering zu halten, fällt das Fahrzeug je nach Einstellung nach ca. 20 Minuten der Inaktivität in einen Standby-Modus. Wie oben beschrieben kann man das Auto über die API wieder aufwecken, um zum Beispiel mit der App darauf zuzugreifen. Allerdings hat Tesla nicht nur die "Vehicle"-spezifischen Requests so gebaut, dass sie das Auto aufwecken, sondern leider teilweise auch die "Vehicle" Aufrufe, die eigentlich auch über den Server beantwortbar sein müssten. Wenn man nun über den Server versucht herauszufinden, ob das Fahrzeug "schläft" und das Fahrzeug zufällig innerhalb der 20 Minuten Einschlafphase ist, dann wird der 20 Minuten Zähler zurückgesetzt. Wenn man zu häufig diesen Statusaufruf tätigt, dann kommt das Fahrzeug niemals in den Schlafmodus. Wenn man hinreichend selten aktualisiert (> 20 Minuten), dann bekommt man Statusänderungen nur entsprechend zeitverzögert mit. Bei einer gelegentlichen Nutzung der API über die App ist das nicht wesentlich schlimm. Wenn man die API aber für eine kontinuierliche Überwachung von Fahrzeugdaten nutzen möchte, dann muss man mit dynamischen Veränderungen der Update-Frequenz arbeiten, um einerseits eine optimale Informationsdichte zu erhalten ohne das Fahrzeug gleichzeitig vom Standby abzuhalten. Ich habe meine Applikation so eingestellt, dass während der Fahrt alle 30 Sekunden aktualisiert wird, während dem Laden jede Minute und während dem Parken dann alle 21 Minuten, damit das Fahrzeug eine Chance hat, in den Standby-Modus zu gehen ohne durch die Anfragen wach gehalten zu werden.

Fazit

Tesla setzt nicht nur bei der Konstruktion des Fahrzeugs neue Maßstäbe, sondern auch bei der Verwendung von Software. Die Publizierung einer solch mächtigen API zum Zugriff auf relevante Fahrzeugeigenschaften hat bisher kein anderer Autohersteller für seine Fahrzeuge vorgesehen. Inzwischen gibt es einige Entwickler-Projekte zum Beispiel zum Analysieren der Bewegungs- und Energieverwendungsdaten im Fahrzeug. Auch ich plane, diese API anzuzapfen und in meine Heimsteuerung zu integrieren. Man darf auf spannende Projekte gefasst sein.

Zurück