Plugin-Daten | |
---|---|
Autor | Jan Wachsmuth |
Logo | |
Status | BETA |
Version | 0.2.1 |
Min. LB Version | 2.0 |
Pre-Release Download | https://github.com/Jan21493/LoxBerry-Plugin-TeslaCmd/archive/refs/tags/0.2.1.zip |
Beschreibung | Plugin für das von Tesla in 2024 veröffentlichte Tesla Vehicle Command SDK. Über das Plugin können Informationen zu den verwendeten Tesla Produkten abgerufen oder Befehle an die Tesla Produkte gesendet werden. Nachfolger des TeslaConnect Plugins. |
Sprachen | EN |
Diskussion | https://www.loxforum.com/forum/projektforen/loxberry/plugins/437633-neues-plugin-f%C3%BCr-tesla-mit-vehicle-command-api |
Dieses Plugin speichert ein Token, um auf die Tesla API zuzugreifen. Wenn Befehle über Bluetooth Low Energy (BLE) an das Fahrzeug gesendet werden, wird außerdem ein privater Schlüssel gespeichert, über den die Befehle an das Fahrzeug signiert werden. Ich empfehle das Plugin nur zu installieren, wenn der Loxberry gut geschützt und nicht direkt aus dem Internet erreichbar ist.
Gelingt es jemand dieses Token und/oder den privaten Schlüssel auszulesen, kann dieser alle Informationen über das Fahrzeug abrufen und Befehle an das Fahrzeug senden.
Direkter Download-Link: Siehe Tabelle oben
Letzter Entwicklungsstand im Repo: https://github.com/Jan21493/LoxBerry-Plugin-TeslaCmd
Dieses Plugin ist ein Nachfolger des von Marius H. erstellten TeslaConnect Plugins. Da Marius H. die Arbeit an diesem älteren Plugin eingestellt hat, habe ich die Herausforderung angenommen und Unterstützung für die neue API hinzugefügt sowie einige Verbesserungen innerhalb der Benutzeroberfläche zum Senden von Testabfragen vorgenommen. Die neue Version hat einen neuen Namen bekommen (und beginnt mit Version 0.1.1), da es nach der Erstveröffentlichung nicht mehr erlaubt ist, den Namen des Autors eines LoxBerry-Plugins zu ändern.
Tesla hat eine neue API, die [Vehicle Command API](https://github.com/teslamotors/vehicle-command/blob/main/README.md) im Oktober 2023 als Nachfolger der [(inoffiziellen) Owner's API](https://tesla-api.timdorr.com/) veröffentlicht. Fahrzeuge der Modelle S und X, die vor 2021 hergestellt wurden, unterstützen nicht das neue Protokoll, aber alle anderen Fahrzeuge werden in 2024 auf das neue Protokoll umgestellt.
Das Tesla Vehicle Command SDK enthält das [Tesla Control Utility](https://github.com/teslamotors/vehicle-command/tree/main/cmd/tesla-control#tesla-control-utility) über welches Befehle entweder über Bluetooth Low Energy (BLE) oder das Internet über die Tesla Fleet API an das Fahrzeug gesendet werden können. Derzeit ist für das Plugin nur BLE implementiert und es gibt derzeit keine Pläne die Fleet API zu unterstützen.
Bisher (Stand Juli 2024) gibt es in der neuen API nur Befehle zum Steuern von Funktionen, wie z.B. das Ein- oder Ausschalten der Klimaanlage, das Einstellen des maximalen Ladestroms oder zum Öffnen bzw. Schließen des Kofferraumes. Die API enthält einen einzigen Befehl 'body-controller-state', um den Status für diverse Systeme abzufragen, u.a. Schlafzustand, Präsenz, Schließzustand für Türen und Kofferraum.
Diese Plugin unterstützt daher weiterhin die bisherige (inoffizielle) Owner's API für alle Befehle, die darüber noch funktionieren, um z.B. Statusinformationen zum Fahrzeug oder einer Power Wall abzufragen. In den Einstellungen kann man für jedes Fahrzeug bzw. Powerwall festlegen, welche API verwendet wird: - die alte (inoffizielle) Owner's API für ALLE Befehle. Dies ist sinnvoll sofern das Fahrzeug die alten Befehle noch unterstützt oder eine Powerwall verwendet wird. - ein Mix aus der (inoffizielle) Owner's API um Statusinformationen abzufragen und die neue Vehicle Command API, um Befehle über BLE an das Fahrzeug zu senden. Diese werden über das Tool 'Tesla Control Utility' (tesla-control) gesendet.
Alle Daten (Statusinformationen) werden vom Fahrzeug über MQTT zurück an den Loxone Miniserver übertragen. Die Subskription dafür lautet teslacmd/#
und wird im MQTT Gateway Plugin automatisch eingetragen. Beim ersten Öffnen des Plugins muss die Anmeldung bei Tesla durchgeführt werden. Dazu wird bei Tesla ein Token generiert. Das Token wird anschliessend automatisch verlängert. Nach erfolgreicher Anmeldung werden möglichen Abfragen aufgelistet, welche am Miniserver als Virtuelle Ausgänge definiert werden können.
Befehl | Beschreibung |
---|---|
STATUS | Status of the Tesla API. |
PRODUCT_LIST | Returns all products including vehicles, powerwalls, and energy sites. |
VEHICLES | Returns a list of all vehicle registered for the authenticated user. |
Befehl | Beschreibung |
---|---|
VEHICLE_SUMMARY | Summary information of the vehicle. |
VEHICLE_DATA | All information and states of the vehicle. |
CHARGE_STATE | Charge state information including battery limit, charge miles, charge voltage, charge phases, current, charge management, and battery heater status. |
CLIMATE_STATE | Climate settings including seats, vents battery, steering wheel, and preconditioning state. |
CLOSURES_STATE | |
DRIVE_STATE | Drive state including latitude, longitude, and heading of the vehicle. |
GUI_SETTINGS | GUI settings of the car, such as unit format and range display |
LOCATION_DATA | |
VEHICLE_CONFIG | Vehicle configuration information including model, color, badging and wheels |
VEHICLE_STATE | Vehicle state, such as which doors are open, tpms pressure |
Befehl | Beschreibung |
---|---|
WAKE_UP | Wakes up the vehicle from a sleeping state. |
REMOTE_START_DRIVE | Enables keyless driving. There is a two minute window after issuing the command to start driving the car. |
DOOR_UNLOCK | Unlocks the doors to the vehicle. |
DOOR_LOCK | Locks the doors to the vehicle. |
SUN_ROOF_CONTROL | Controls the panoramic sunroof on the Model S. |
WINDOW_CONTROL | Controls the windows. Will vent or close all windows simultaneously. |
ACTUATE_TRUNK | Opens or close either the front or rear trunk. |
HONK_HORN | Honks the horn of the vehicle once. |
FLASH_LIGHTS | Flashes the headlights once. |
AUTO_CONDITIONING_START | Start the climate control (HVAC) system. Will cool or heat automatically, depending on set temperature. |
AUTO_CONDITIONING_STOP | Stop the climate control (HVAC) system. |
SET_PRECONDITIONING_MAX | Toggles the climate controls between Max Defrost and the previous setting. |
REMOTE_SEAT_HEATER_REQUEST | Sets the specified seat's heater level. |
REMOTE_STEERING_WHEEL_HEATER_REQUEST | Turn steering wheel heater on or off. |
SET_TEMPS | Sets the target temperature for the climate control (HVAC) system. (e.g. value 20) |
CHARGE_PORT_DOOR_OPEN | Opens the charge port or unlocks the cable. |
CHARGE_PORT_DOOR_CLOSE | Closes the charge port. |
CHARGE_START | If the car is plugged in but not currently charging, this will start it charging. |
CHARGE_STOP | If the car is currently charging, this will stop it. |
CHARGE_STANDARD | Set vehicle to standard charge limit or ~90%. |
CHARGE_MAX_RANGE | Set the vehicle to max charge limit. |
SET_CHARGE_LIMIT | Set the vehicle to defined charge limit. (e.g. value 80) |
SET_CHARGING_AMPS | Sets the charge amps limit to a custom value. (e.g. value 16) |
SET_SCHEDULED_DEPARTURE | Set the scheduled departure. |
SET_SCHEDULED_CHARGING | Set the scheduled charge. |
SET_VALET_MODE | Activates or deactivates Valet Mode. |
RESET_VALET_PIN | Clears the currently set PIN for Valet Mode when deactivated. A new PIN will be required when activating from the car screen. |
SET_SENTRY_MODE | Turns sentry mode on or off. |
Befehl | Beschreibung |
---|---|
LIVE_STATUS | Retrieves current system information (e.g. solar production, grid export/import, home consumption, etc.). |
SITE_INFO | Retrieves general system information. |
SITE_STATUS | Retrieves general system information. |
SITE_PROGRAMS | Retrieves energy site program information. |
SITE_TARIFF_RATE | Retrieves the user defined Utility Rate Plan used for Time-Based Control mode. It looks like this endpoint is updated every 30 minutes. |
Befehl | Beschreibung |
---|---|
LIST_KEYS | List public keys enrolled on vehicle. |
BODY_CONTROLLER_STATE | Fetch limited vehicle state information. Works over BLE when infotainment / vehicle is asleep. |
BLE_WAKE | Wakes up the vehicle from a sleeping state via Bluetooth Low Energy (BLE). |
PING | Ping the vehicle. |
REMOTE_START_DRIVE | Enables keyless driving. There is a two minute window after issuing the command to start driving the car. |
DOOR_UNLOCK | Unlocks the doors to the vehicle. |
DOOR_LOCK | Locks the doors to the vehicle. |
AUTOSECURE_MODELX | Close falcon-wing doors and lock vehicle. Model X only. |
WINDOWS_CLOSE | Closes all windows simultaneously. |
WINDOWS_VENT | Vent all windows simultaneously. |
TRUNK_CLOSE | Closes vehicle trunk. Only available on certain vehicle types. |
TRUNK_OPEN | Open vehicle trunk. Note that trunk-close only works on certain vehicle types. |
TRUNK_MOVE | Toggle trunk open/closed. Closing is only available on certain vehicle types. |
FRUNK_OPEN | Open vehicle frunk. Note that there's no frunk-close command! |
HONK_HORN | Honks the horn of the vehicle once. |
FLASH_LIGHTS | Flashes the head- and backlights once. |
AUTO_CONDITIONING_START | Start the climate control (HVAC) system. Will cool or heat automatically, depending on set temperature. |
AUTO_CONDITIONING_STOP | Stop the climate control (HVAC) system. |
AUTO_SEAT_AND_CLIMATE | Turn on automatic seat heating and climate control (HVAC). |
SET_TEMPS | Sets the target temperature for the climate control (HVAC) system (e.g. value 20). |
CLIMATE_SET_TEMP | Desired temperature for climate control (HVAC) system. |
SET_PRECONDITIONING_MAX | Toggles the climate controls between Max Defrost and the previous setting. |
SEAT_HEATER | Sets the specified seat's heater level. |
STEERING_WHEEL_HEATER | Turn steering wheel heater on or off. |
CHARGE_PORT_DOOR_OPEN | Opens the charge port or unlocks the cable. |
CHARGE_PORT_DOOR_CLOSE | Closes the charge port. |
CHARGE_START | If the car is plugged in but not currently charging, this will start it charging. |
CHARGE_STOP | If the car is currently charging, this will stop it. |
SET_CHARGE_LIMIT | Set the vehicle to defined charge limit. (e.g. value 80) |
SET_CHARGING_AMPS | Sets the charge amps limit to a custom value. (e.g. value 16) |
CHARGING_SCHEDULE | Schedule charging to MINS minutes after midnight and enable daily scheduling. |
CHARGING_SCHEDULE_CANCEL | Cancel scheduled charge start. |
SENTRY_MODE | Turns sentry mode on or off. |
MEDIA_SET_VOLUME | Set volume. |
MEDIA_TOGGLE_PLAYBACK | Toggle between play/pause. |
SOFTWARE_UPDATE_START | Start software update after DELAY. |
SOFTWARE_UPDATE_CANCEL | Cancel a pending software update. |
Damit der Loxberry Befehle via BLE (Bluetooth Low Energy) an ein Fahrzeug senden kann, muss er sich in der Nähe des Fahrzeugs befinden. Eine maximal mögliche Entfernung kann ich nicht nennen, aber bei mir funktioniert es mit der (nicht besonders guten) kombinierten WLAN/BLE Antenne, die sich auf der Platine des Raspberry PI 3B+ befindet, durch eine Außenwand des Gebäudes (ohne Fenster auf der Seite zum Fahrzeug) über eine Distanz von ca. 7m ziemlich zuverlässig. Wer seinen Loxberry im Verteilerschrank aus Metall eingebaut hat, der sollte die Antenne auf jeden Fall nach außen verlegen, wofür die Platine bearbeitet werden muss. Anleitungen für so eine Modifikation gibt es sehr viele im Internet, u.a. hier. Falls der Raspberry in ein Gehäuse aus Metall eingebaut wurde, ist eine externe Antenne ebenfalls dringend empfohlen. Man kann das Plugin sicherlich auch auf einem eigenen Loxberry installieren, der an einem sicheren Ort in der Nähe des Fahrzeugs installiert wird. Im SDK von Tesla werden Linux und MacOS als mögliche Betriebssysteme bei Verwendung von Bluetooth genannt. Windows wird offiziell nicht unterstützt.
Für das Plugin empfehle ich eine frische Installation eines Loxberries ab Version 3.0, wo das MQTT Gateway bereits enthalten ist. Wenn ein Raspberry 3, 4 oder 5 verwendet wird, empfiehlt sich die Installation mit OS Bookworm 64-Bit auf Basis eines DietPi.
Dieser Schritt kann bei einem Loxberry auf Basis eines Raspberry PI mit 64-Bit (z.B. bei einem Diet-PI mit Version Bookworm) als auch 32-Bit übersprungen werden, weil die beiden benötigten Tools bereits im Binärformat im Plugin enthalten sind. Man benötigt daher weder Golang noch das SDK. Für alle anderen Betriebssysteme und CPUs ist dieser Schritt erforderlich. Die Installation der Tools ist in der README.md des SDKs beschrieben und hier nur ergänzt. Windows wird offiziell nicht unterstützt. Die Installation hat auf einem MacBook mit Sonoma und einem Raspberry PI mit 32 als auch 64-Bit funktioniert. Wenn man die Tools lieber selber erstellen möchte oder Tesla das SDK aktualisiert hat, dann kann man alternativ die nachfolgenden Schritte auch auf einem Raspberry PI ausführen.
Die aktuelle Version von Golang findet man unter https://go.dev/doc/install Für einen Raspberry PI mit 32-Bit sind ergänzend die folgenden Befehle exemplarisch für Version 1.23.2 dargestellt. Für einen Raspberry PI mit 64-Bit muss das Paket go1.23.2.linux-arm64.tar.gz verwendet werden und die beiden Befehle sind entsprechend anzupassen. Für andere Platformen muss das entsprechende Go Paket verwendet werden. Die Version sollte durch die jeweils aktuelle Version ersetzt werden!
mkdir ~/golang cd ~/golang # on 32-Bit Linux ARM wget https://go.dev/dl/go1.23.2.linux-armv6l.tar.gz tar -xzf go1.23.2.linux-armv6l.tar.gz # on 64-Bit Linux ARM wget https://go.dev/dl/go1.23.2.linux-arm64.tar.gz tar -xzf go1.23.2.linux-arm64.tar.gz # export PATH=$PATH:/opt/loxberry/golang/go/bin # Verify that Go is working go version
Die Installation des Tesla Vehicle Command SDK kann über Git erfolgen. Alternativ kann das SDK auch im .zip Format heruntergeladen und ausgepackt werden. Der entscheidende Schritt ist der Befehl 'build' mit dem die beiden benötigten Tools tesla-keygen und tesla-control erstellt werden. Diese Befehle sollten als User 'loxberry' ausgeführt werden.
Anschließend werden die Tools in das Verzeichnis /usr/local/bin kopiert, welches für zusätzliche Befehle bereits vorgesehen und im Suchpfad eingetragen ist. Da der Befehl sudo auf dem Loxberry aus Sicherheitsgründen eingeschränkt ist, muss man sich mit dem Befehl su als Superuser anmelden, um die entsprechenden Tools in die Systemverzeichnisse kopieren zu können. Danach meldet man sich mit exit wieder als Superuser ab.
# install GIT as superuser - only if required # su # apt-get install git # exit cd ~ git clone https://github.com/teslamotors/vehicle-command.git cd vehicle-command/ # if not set yet: export PATH=$PATH:/opt/loxberry/golang/go/bin go get ./... # build tesla-control utility - may take a while cd cmd/tesla-control go build ./... # build tesla-keygen utility - may take a while cd ../tesla-keygen go build ./... cd .. # als Superuser ausführen su mv ./tesla-control/tesla-control /usr/local/bin/ mv ./tesla-keygen/tesla-keygen /usr/local/bin/
Der Zugriff auf Bluetooth erfordert unter Linux ein entsprechendes Recht, welches man dem Tool tesla-control explizit geben muss, damit es von einem 'normalen' User ausgeführt werden kann. Dafür ist eine Anmeldung als Superuser erforderlich.
# als Superuser ausführen setcap 'cap_net_admin=eip' /usr/local/bin/tesla-control exit
Als Ergebnis der oben dargestellen Schritte sind jetzt zwei Tools aus dem Tesla Vehicle Command SDK auf dem Loxberry installiert, die vom User Loxberry ausgeführt werden können. Zur ersten Überprüfung kann man die Tools mit der Hilfe-Funktion aufrufen.
tesla-control -h tesla-keygen -h
Um Befehle sicher via BLE an das Fahrzeug senden zu können, wird ein Schlüsselpaar benötigt, welches aus einem öffentlichen und einem privaten Schlüssel besteht. Der private Schlüssel wird zum Signieren der Befehle verwendet die an das Fahrzeug gesendet werden. Der öffentliche Schlüssel wird im Fahrzeug zur Liste der autorisierten Schlüssel hinzugefügt, damit die empfangenen Befehle auf Echtheit überprüft werden können. Dieses Verfahren im Gegensatz zur alten Owner's API den großen Vorteil, dass Schlüssel individuell zurückgezogen werden können, ohne das der Zugriff für andere Geräte oder Benutzer unterbrochen wird. Ein weiterer Vorteil ist der, dass die Schlüssel nur lokal im Loxberry (der private Schlüssel) und im Fahrzeug (der öffentliche Schlüssel) gespeichert werden und nicht mal in der Cloud von Tesla hinterlegt oder durchgeleitet werden müssen.
Zunächst wird dafür ein Schlüsselpaar erstellt. Damit im Plugin mehrere Fahrzeuge unterschieden werden können, muss das Schlüsselpaar die VIN des Fahrzeugs im Namen enthalten. Diese wird z.B. im 'Settings Menu' für jedes Fahrzeug angezeigt.
Derzeit muss das Schlüsselpaar noch manuell erstellt werden. Für eine spätere Version ist eine Integration in die GUI geplant. Die VIN muss durch die VIN des eigenen Fahrzeugs ersetzt werden. Der öffentliche Schlüssel wird nach der Installation im Fahrzeug nicht mehr benötigt und kann dann gelöscht werden.
cd ~/config/plugins/teslacmd tesla-keygen -f -key-file LRW31234567890123-private.pem create > LRW31234567890123-public.pem
Die Schlüssel, die mit Hilfe des Tools tesla-keygen erstellt wurden, können auch mit OpenSSL Tools verarbeitet werden, um sich z.B. den öffentlichen Schlüssel anzeigen zu lassen openssl ec -in LRW31234567890123-private.pem -pubout
bzw. diesen zu speichernopenssl ec -in LRW31234567890123-private.pem -pubout -out LRW31234567890123-public.pem
.
Erst mit der Installation des öffentlichen Schlüssels eines Schlüsselpaares im Fahrzeug wird der zugehörige private Schlüssel autorisiert und damit schützenswert. Um den Schlüssel zu installieren, empfiehlt es sich ein Laptop zu verwenden und mit diesem eine ssh Verbindung zum Loxberry aufzubauen. So kann man einfach und relativ schnell die notwendigen Schritte im Fahrzeug ausführen, um den öffentlichen Schlüssel zu installieren.
Wichtig ist, dass das Fahrzeug wach ist und sich nicht im Schlafmodus befindet!
Im ersten Schritt wird der Befehl zum Installieren des öffentlichen Schlüssels an das Fahrzeug gesendet. Der Befehl tesla-control add-key-request erfordert dabei die Angabe der VIN, des öffentlichen Schlüssels, der Rolle (entweder owner oder driver) und eines Form-Faktors (entweder //**nfc_card**, **ios_device**, **android_device** //oder// **cloud_key//**). Nachfolgend ist ein Beispiel angegeben.
cd ~/config/plugins/teslacmd/ tesla-control -vin LRW31234567890123 -ble add-key-request ./LRW31234567890123-public.pem owner cloud_key Sent add-key request to LRW31234567890123. Confirm by tapping NFC card on center console.
Nur wenn die Ausgabe Sent add-key request to LRW31234567890123. Confirm by tapping NFC card on center console.
nach einigen Sekunden angezeigt wird, war der Befehl erfolgreich. Eine Meldung wird auf dem Bildschirm im Fahrzeug zunächst nicht angezeigt.
Man muss beim Absenden des Befehls nicht im Fahrzeug sein. Wichtig ist aber, dass sich das Fahrzeug nicht im Schlafmodus befindet.
Der neue Schlüssel wird autorisiert, indem eine der beiden schwarzen NFC Karten, die mit dem Fahrzeug ausgeliefert wurden, auf die Mittelkonsole zwischen Getränkehalter und Armlehne gelegt wird. Dieser Schritt muss innerhalb von 30 Sekunden nach dem o.a. Befehl erfolgen! Erst danach wird eine Meldung angezeigt, die innerhalb von 10 Sekunden bestätigt werden muss.
Der Text der Meldung "Handyschlüssel-Koppelung" ist zumindest in deutsch nicht korrekt, aber wahrscheinlich hat Tesla sich nicht die Mühe gemacht, eine eigene Meldung für API Schlüssel zu erstellen.
Nach der Bestätigung wird der neue Schlüssel in der Liste der autorisierten Schlüssel angezeigt. Das entsprechende Menü heisst Verriegelungen und ist durch ein Schloss aus Symbol gekennzeichnet. Falls der Schlüssel nicht sichtbar ist, kann man auch nach unten scrollen, was grafisch nicht angezeigt wird.
Der neue Schlüssel sollte passend zum Verwendungszweck umbenannt werden. Dafür drückt man auf das Bleistiftsymbol des entsprechenden Schlüssels. Der Typ bleibt "Unbekannter Schlüssel" und kann leider nicht geändert werden.
Zur Sicherheit wird in der Meldungszentrale auf dem Handy und der Tesla App eine Meldung angezeigt, dass ein neuer Schlüssel hinzugefügt wurde. Über den erwähnten Menüpunkt Verriegelungen können Schlüssel nach Bedarf auch wieder gelöscht werden.