Eine Python -Implementierung basiert auf inoffizieller Dokumentation der Client -Seitenschnittstelle zur Tesla Motors -Eigentümer -API, die Funktionen zur Überwachung und Steuerung von Tesla -Produkten bietet aus der Ferne.
Die Eigentümer-API wird nicht mehr arbeiten, da Fahrzeuge mithilfe des Tesla-Fahrzeugbefehlsprotokolls eine End-to-End-Befehlsauthentifizierung benötigen. Modell S und X-Fahrzeuge vor 201021 unterstützen dieses neue Protokoll nicht und bleiben mithilfe von Teslapy kontrollierbar.
Dieses Modul hängt von Python-Anfragen, Requests_oauthlib und WebSocket-Client ab. Es erfordert Python 3.10+ bei Verwendung von Urllib3 2.0, das mit Anfragen 2.30.0+ ausgestattet ist, oder Sie können Urllib3 bis 1.26.x durch Installieren urllib3<2
anhaben.
post()
Tesla
-Klasse get()
requests_oauthlib.OAuth2Session
, die requests.Session
erweitert. Moduleigenschaften:
Teslapy 2.0.0+ implementiert keine kopflose Authentifizierung mehr. Der Konstruktor unterscheidet sich und nimmt folgende Argumente an:
Argument | Beschreibung |
---|---|
email | SSO -Identität |
verify | (Optional) Überprüfen Sie das SSL -Zertifikat |
proxy | (optionale) URL des Proxy -Servers |
retry | (optionale) Anzahl der Verbindungsabsendungen oder Retry |
timeout | (Optional) Timeout anschließen/lesen |
user_agent | (optional) Die Benutzer-Agent-Zeichenfolge |
authenticator | (Optional) Funktion mit einem Argument, der Autorisierungs -URL, die die umgeleitete URL zurückgibt |
cache_file | (Optional) Pfad zur Cache -Datei, die Standardlast und Dumper verwendet |
cache_loader | (optionale) Funktion, die den Cache -Diktat zurückgibt |
cache_dumper | (optional) Funktion mit einem Argument, dem Cache -Diktieren |
sso_base_url | (Optional) URL des SSO -Dienstes, auf https://auth.tesla.cn/ festgelegt, wenn Ihre E -Mail in einer anderen Region registriert ist |
state | (Optional) Statuszeichenfolge für den CSRF -Schutz |
code_verifier | (Optional) PKCE -Code -Verifier -Zeichenfolge |
app_user_agent | (Optional) X-Tesla-Benutzer-Agent-Zeichenfolge |
Teslapy 2.1.0+ implementiert RFC 7523 nicht mehr und verwendet das SSO -Token für alle API -Anforderungen.
Die Klasse wird die SSO -Seite von Tesla auf dem Standard -Webbrowser des Systems zur Authentifizierung öffnen. Nach einer erfolgreichen Authentifizierung wird eine nicht gefundene Seite angezeigt und die URL sollte mit https://auth.tesla.com/void/callback
beginnen, die die umgeleitete URL ist. Die Klasse verwendet stdio
um die vollständige Umleitungs -URL standardmäßig aus dem Webbrowser zu erhalten. Sie müssen die vollständige URL aus dem Webbrowser in die Konsole kopieren und einfügen, um die Aquirering -API -Token fortzusetzen. Sie können eine steckbare Authenticator -Methode verwenden, um dies zu automatisieren, beispielsweise mit PYWebView oder Selenium. Es ist auch möglich, ein SSO -Aktualisierungs -Token zu verwenden, das von einer Authentifizierungs -App von Drittanbietern erhalten wird.
Die Convenience -Methode api()
verwendet benannte Endpunkte, die in Endpoints.json aufgeführt sind, um Anrufe auszuführen. Daher benötigt das Modul keine Änderungen, wenn die API aktualisiert wird. api()
ersetzt Pfadvariablen in der URI und ruft bei Bedarf fetch_token()
auf. Jede von der API zurückgegebene Fehlermeldung wird als HTTPError
-Ausnahme erhoben. Darüber hinaus implementiert die Klasse die folgenden Methoden:
Anruf | Beschreibung |
---|---|
request() | Führen Sie den API -Aufruf mithilfe der relativen oder absoluten URL-, Serialisierungs- und Fehlermeldungsbehandlung durch |
new_code_verifier() | Generiert Code -Verifier für PKCE |
authorization_url() | Formulare Autorisierungs -URL mit PKCE -Erweiterung und versucht, die registrierten Konten zu erkennen |
fetch_token() | fordert ein SSO -Token mit dem Zuschuss von Autorisierungscode mit PKCE -Erweiterung an |
refresh_token() | fordert ein SSO -Token mit dem Aktualisierungstipendium an |
close() | Entfernen Sie alle Anfragen Adapterinstanzen |
logout() | Entfernt Token aus Cache, gibt die URL der Abmeldung zurück und meldet sich optional mit dem Standard -Webbrowser des Systems an |
vehicle_list() | Gibt eine Liste von Fahrzeugobjekten zurück |
battery_list() | Gibt eine Liste von Batterieobjekten zurück |
solar_list() | Gibt eine Liste von Solarpanel -Objekten zurück |
Die Vehicle
erweitert dict
und speichert Fahrzeugdaten, die von der Eigentümer -API zurückgegeben wurden, eine API. Das get_vehicle_summary()
und get_vehicle_data()
ruft auf, die Vehicle
zu aktualisieren und Daten zusammenzufassen. Die Streaming-API drückt nach dem Abonnement die Fahrzeugdaten verändert. Die stream()
-Methode nimmt ein optionales Argument an, eine Rückruffunktion, die mit einem Argument aufgerufen wird, ein Diktat, das die geänderten Daten hält. Das Vehicle
wird immer mit den Pushed -Daten aktualisiert. Wenn innerhalb von 10 Sekunden keine Änderungen vorliegen, stoppt das Fahrzeug Streaming -Daten. Die stream()
-Methode enthält zwei weitere optionale Argumente, um das Neustart zu steuern. Darüber hinaus implementiert die Klasse die folgenden Methoden:
Anruf | Online | Beschreibung |
---|---|---|
api() | Ja | führt einen API -Anruf an den benannten Endpunkt aus, der Vehicle_id mit optionalen Argumenten erfordert |
get_vehicle_summary() | NEIN | bekommt den Zustand des Fahrzeugs (online, schliefe, offline) |
available() | NEIN | Überprüft, ob das Fahrzeug basierend auf zwischengespeicherten Daten oder aktualisierten Status beim Alter online ist |
sync_wake_up() | NEIN | Wacht auf und wartet darauf, dass das Fahrzeug online kommt |
decode_option() | NEIN | Beschreibung der Suchoptionscode (von option_codes.json lesen) |
option_code_list() 1 | NEIN | Listet bekannte Beschreibungen der Fahrzeugoptionscodes auf |
get_vehicle_data() | Ja | Holen Sie sich Fahrzeugdaten für ausgewählte Endpunkte, Standardeinstellungen für alle Endpunkte |
get_vehicle_location_data() | Ja | Ruft die Grund- und Standortdaten für das Fahrzeug ab |
get_nearby_charging_sites() | Ja | Listet in der Nähe von Tesla-betriebenen Ladestationen auf |
get_service_scheduling_data() | NEIN | Ruft den nächsten Service -Termin für dieses Fahrzeug ab |
get_charge_history() 2 | NEIN | Listet die Datenpunkte für Fahrzeugladeverlaufsgeschichte auf |
mobile_enabled() | Ja | Überprüft, ob die Einstellung der mobilen Zugriff im Auto aktiviert ist |
compose_image() 3 | NEIN | Komponiert ein Fahrzeugbild basierend auf Fahrzeugoptionscodes |
dist_units() | NEIN | Konvertiert Entfernungs- oder Geschwindigkeitseinheiten in die GUI -Einstellung des Fahrzeugs |
temp_units() | NEIN | Konvertiert Temperatureinheiten in die GUI -Einstellung des Fahrzeugs |
gui_time() | NEIN | Gibt den Zeitstempel oder aktuelle Zeit zurück, die der GUI -Einstellung formatiert sind |
last_seen() | NEIN | Rückgabesfahrzeug hat zuletzt natürliche Zeit gesehen |
decode_vin() | NEIN | dekodiert die Fahrzeugidentifikationsnummer zu einem Diktat |
command() | Ja | Wrapper um api() für Fahrzeugbefehlsantwort Fehlerbehandlungen |
1 Optionscodes scheinen veraltet zu sein.
2 Auto -Softwareversion 2021.44.25 oder höher erforderlich, müssen die Datenaustausch aktiviert sein und Sie müssen der primäre Fahrzeugbesitzer sein.
3 Fahrzeugoptionscodes an diese Methode weitergeben. Jetzt sind Optionskodes veraltet.
Wenn das Fahrzeug schläft oder offline ist, sind nur Methoden ohne Online -Spalte verfügbar. Diese Methoden verhindern nicht, dass Ihr Fahrzeug schläft. Andere Methoden und API -Aufrufe erfordern, dass das Fahrzeug mithilfe von sync_wake_up()
online gebracht wird und verhindern kann, dass Ihr Fahrzeug in einem zu kurzen Zeitraum in einem zu kurzen Zeitraum aufgerufen wird.
Die Product
erweitert dict
und wird mit Produktdaten von Powerwalls und Sonnenkollektoren initialisiert, die von der API zurückgegeben werden. Darüber hinaus implementiert die Klasse die folgenden Methoden:
Anruf | Beschreibung |
---|---|
api() | Führen Sie einen API -Anruf zum benannten Endpunkt aus, der Battery_id oder Site_ID mit optionalen Argumenten erfordert |
get_history_data() | Live -Status des Produkts abrufen |
get_calendar_history_data() | Live -Status des Produkts abrufen |
command() | Wrapper um api() für den Battery -Befehlsantwortfehlerbehandlungen |
Die Battery
erweitert Product
und speichert Powerwall -Daten, die von der API zurückgegeben wurden, die von get_battery_data()
aktualisiert wird. Darüber hinaus implementiert die Klasse die folgenden Methoden:
Anruf | Beschreibung |
---|---|
get_battery_data() | Rufen Sie den detaillierten Zustand und die Konfiguration des Akkus ab |
set_operation() | Stellen Sie den Batteriebetrieb auf self_conbumption, backup oder autonom |
set_backup_reserve_percent() | Stellen Sie den Mindestprozent für Backup -Reserve für diese Batterie ein |
set_import_export() | Legt die Einstellungen für Batteriekanschläge und Exportieren fest |
get_tariff() | Holen Sie sich die Tarif -Tarif -Daten |
set_tariff() | Legen Sie die Tarif -Rate -Daten fest. Die Daten können manuell erstellt oder von create_tariff generiert werden |
create_tariff() | Erstellt ein korrekt formatiertes Wörterbuch von Tarifendaten |
Die SolarPanel
-Klasse erweitert Product
und speichert Solarpaneldaten, die von der API zurückgegeben wurden, die von get_site_data()
aktualisiert wird. Darüber hinaus implementiert die Klasse die folgenden Methoden:
Anruf | Beschreibung |
---|---|
get_site_data() | Aktuelle Daten zur Erzeugung der Site abrufen |
Grundlegende Verwendung des Moduls:
import teslapy
with teslapy . Tesla ( '[email protected]' ) as tesla :
vehicles = tesla . vehicle_list ()
vehicles [ 0 ]. sync_wake_up ()
vehicles [ 0 ]. command ( 'ACTUATE_TRUNK' , which_trunk = 'front' )
vehicles [ 0 ]. get_vehicle_data ()
print ( vehicles [ 0 ][ 'vehicle_state' ][ 'car_version' ])
Teslapy 2.4.0 und 2.5.0 ruft automatisch get_vehicle_data()
und Teslapy 2.6.0+ auf, automatisch get_latest_vehicle_data()
wenn kein Schlüssel gefunden wird. Dieses Beispiel funktioniert für Teslapy 2.6.0+:
import teslapy
with teslapy . Tesla ( '[email protected]' ) as tesla :
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ][ 'display_name' ] + ' last seen ' + vehicles [ 0 ]. last_seen () +
' at ' + str ( vehicles [ 0 ][ 'charge_state' ][ 'battery_level' ]) + '% SoC' )
Beispielausgabe:
Tim's Tesla last seen 6 hours ago at 87% SoC
Die Tesla
-Klasse implementiert eine steckbare Authentifizierungsmethode. Wenn Sie Ihre eigene Methode implementieren möchten, um die SSO -Seite zu verarbeiten und die umgeleitete URL nach der Authentifizierung abzurufen, können Sie eine Funktion als Argument an den Konstruktor übergeben, das die Authentifizierungs -URL als Argument nimmt und die umgeleitete URL zurückgibt. Das Argument authenticator
ist ebenfalls als Attribut zugänglich.
Beispiel mit einer WebView -Komponente, die die SSO -Seite in einem eigenen nativen GUI -Fenster anzeigt.
import teslapy
import webview
def custom_auth ( url ):
result = [ '' ]
window = webview . create_window ( 'Login' , url )
def on_loaded ():
result [ 0 ] = window . get_current_url ()
if 'void/callback' in result [ 0 ]. split ( '?' )[ 0 ]:
window . destroy ()
window . loaded += on_loaded
webview . start ()
return result [ 0 ]
with teslapy . Tesla ( '[email protected]' , authenticator = custom_auth ) as tesla :
tesla . fetch_token ()
Beispiel mit Selen, um die Webbrowser -Interaktion zu automatisieren. Die SSO -Seite gibt einen 403 zurück, wenn navigator.webdriver
eingestellt ist und derzeit nur Chrom-, Oper- und Kantenchromium verhindern.
import teslapy
from selenium import webdriver
from selenium . webdriver . support import expected_conditions as EC
from selenium . webdriver . support . ui import WebDriverWait
def custom_auth ( url ):
options = webdriver . ChromeOptions ()
options . add_argument ( "--disable-blink-features=AutomationControlled" )
with webdriver . Chrome ( chrome_options = options ) as browser :
browser . get ( url )
WebDriverWait ( browser , 300 ). until ( EC . url_contains ( 'void/callback' ))
return browser . current_url
with teslapy . Tesla ( '[email protected]' , authenticator = custom_auth ) as tesla :
tesla . fetch_token ()
Teslapy 2.2.0 führte die Methode authorization_url()
ein, um die SSO -Seiten -URL und die Option zur Lieferung der umgeleiteten URL als Keyword -Argument authorization_response
an fetch_token()
nach der Authentifizierung zu liefern.
import teslapy
tesla = teslapy . Tesla ( '[email protected]' )
if not tesla . authorized :
print ( 'Use browser to login. Page Not Found will be shown at success.' )
print ( 'Open this URL: ' + tesla . authorization_url ())
tesla . fetch_token ( authorization_response = input ( 'Enter URL after authentication: ' ))
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ])
tesla . close ()
Die Unterstützung für die inszenierte Autorisierung wurde zu Teslapy 2.5.0 hinzugefügt. Die Schlüsselwortargumente state
und code_verifier
werden vom Tesla
-Klasse -Konstruktor, der Methode authorization_url()
und der Methode fetch_token()
akzeptiert.
import teslapy
# First stage
tesla = teslapy . Tesla ( '[email protected]' )
if not tesla . authorized :
state = tesla . new_state ()
code_verifier = tesla . new_code_verifier ()
print ( 'Use browser to login. Page Not Found will be shown at success.' )
print ( 'Open: ' + tesla . authorization_url ( state = state , code_verifier = code_verifier ))
tesla . close ()
# Second stage
tesla = teslapy . Tesla ( '[email protected]' , state = state , code_verifier = code_verifier )
if not tesla . authorized :
tesla . fetch_token ( authorization_response = input ( 'Enter URL after authentication: ' ))
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ])
tesla . close ()
Teslapy 2.4.0+ unterstützt die Verwendung eines Aktualisierungs -Tokens, das von Authentifizierungs -Apps von Drittanbietern erhalten wurde. Der Refresh -Token wird verwendet, um ein Zugangs -Token zu erhalten, und beide werden für die Ausdauer zwischengespeichert. Sie müssen daher nur das Refresh -Token nur einmal liefern.
import teslapy
with teslapy . Tesla ( '[email protected]' ) as tesla :
if not tesla . authorized :
tesla . refresh_token ( refresh_token = input ( 'Enter SSO refresh token: ' ))
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ])
Verwenden Sie den Standard -Webbrowser Ihres Systems, um sich von der SSO -Seite zu unterziehen und das Token vom Cache zu löschen:
tesla . logout ( sign_out = True )
Wenn Sie PYWebView verwenden, können Sie das Token vom Cache löschen und die Abmelde -URL zum Anzeigen eines Schildausschüsse -Fensters erhalten:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
Selenium speichert keine Kekse, löschen Sie einfach das Token aus dem Cache:
tesla . logout ()
Die Tesla
-Klasse implementiert eine steckbare Cache -Methode. Wenn Sie nicht das Standarddiskussionsdatum verwenden möchten, können Sie eine Funktion zum Laden und zurückgeben, um den Cache -Dict zu laden, und eine Funktion, die ein DICT als Argument zum Abwerfen des Cache -Dikts als Argumente an den Konstruktor nimmt. Die Argumente cache_loader
und cache_dumper
sind ebenfalls als Attribute zugänglich.
import json
import sqlite3
import teslapy
def db_load ():
con = sqlite3 . connect ( 'cache.db' )
cur = con . cursor ()
cache = {}
try :
for row in cur . execute ( 'select * from teslapy' ):
cache [ row [ 0 ]] = json . loads ( row [ 1 ])
except sqlite3 . OperationalError :
pass
con . close ()
return cache
def db_dump ( cache ):
con = sqlite3 . connect ( 'cache.db' )
con . execute ( 'create table if not exists teslapy (email text primary key, data json)' )
for email , data in cache . items ():
con . execute ( 'replace into teslapy values (?, ?)' , [ email , json . dumps ( data )])
con . commit ()
con . close ()
with teslapy . Tesla ( '[email protected]' , cache_loader = db_load , cache_dumper = db_dump ) as tesla :
tesla . fetch_token ()
Die Sicherheitswerte werden durch eine weitere API erhalten. Teslapy 2.1.0 führte die absolute URL-Unterstützung für den Zugriff auf Nicht-Eigentümer-API-Endpunkte ein.
from teslapy import Tesla
with Tesla ( '[email protected]' ) as tesla :
vehicles = tesla . vehicle_list ()
url = 'https://akamai-apigateway-vfx.tesla.com/safety-rating/daily-metrics'
print ( tesla . get ( url , params = { 'vin' : vehicles [ 0 ][ 'vin' ], 'deviceLanguage' : 'en' ,
'deviceCountry' : 'US' , 'timezone' : 'UTC' }))
Teslapy verwendet standardmäßig ein einstellbares Verbindungs- und Lesen von 10 Sekunden. Weitere Informationen finden Sie im Abschnitt "Timeouts". Teslapy wird standardmäßig fehlgeschlagen oder zeitgesteuert Verbindungen ausgelöst, die mit dem retry
aktiviert werden können.
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
Ein robustes Programm, das für Netzwerkausfälle berücksichtigt wird, hat eine Wiederholungsstrategie, die die Gesamtzahl der Wiederholungsversuche umfasst, die HTTP -Antwortcodes, die wiederholt werden sollen, und optional einen Backoff -Faktor. Weitere Informationen finden Sie im Wiederholungsmodul.
Beachten Sie, dass Tesla Ihr Konto vorübergehend blockieren kann, wenn Sie die Server zu viel hämmern.
import teslapy
retry = teslapy . Retry ( total = 2 , status_forcelist = ( 500 , 502 , 503 , 504 ))
with teslapy . Tesla ( '[email protected]' , retry = retry ) as tesla :
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ])
vehicles [ 0 ]. command ( 'FLASH_LIGHTS' ) # Raises exception
Die Zeile nach dem Kontext -Manager wird bei Verwendung von Teslapy 2.5.0+ eine Ausnahme anziehen, da der Anforderungsverbindungshandler explizit geschlossen wird, wenn der Kontext -Manager beendet ist. Frühere Versionen würden keine Ausnahme ansprechen und die Wiederholungen würden nicht funktionieren.
Schauen Sie sich Cli.py, Menu.py oder Gui.py an, um weitere Codebeispiele zu erhalten.
Dies sind die Hauptbefehle:
Endpunkt | Parameter | Wert |
---|---|---|
Entsperren | ||
SPERREN | ||
Honk_horn | ||
Flash_Lights | ||
Klima_on | ||
Climate_off | ||
Max_defrost | on | true oder false |
Change_climate_temperature_Setting | driver_temp , passenger_temp | Temperatur in Celcius |
Set_climate_keeper_mode | climate_keeper_mode | 0 = Off, 1 = on, 2 = Hund, 3 = Camp |
HVAC_BIOWEAPON_MODE | on | true oder false |
Afuled_departure 1 | enable , departure_time , preconditioning_enabled , preconditioning_weekdays_only , off_peak_charging_enabled , off_peak_charging_weekdays_only , end_off_peak_time | true oder false , Minuten nach Mitternacht |
Afuled_ading 1 | enable , time | true oder false , Minuten nach Mitternacht |
Lading_amps 1 | charging_amps | Zwischen 0-32 |
Set_cabin_overheat_protection | on , fan_only | true oder false |
Change_charch_limit | percent | Prozentsatz |
Set_vehicle_name | vehicle_name | Name |
Change_sunroof_state | state | vent oder close |
Window_Control 2 | command , lat , lon | vent oder close , 0 , 0 |
Actuate_trunk | which_trunk | rear oder front |
Remote_Start | ||
Trigger_homelink | lat , lon | Aktuelle Lattitude und Logitude |
Lader_port_door_open | ||
Lader_port_door_close | ||
Start_charge | ||
StoP_charge | ||
Set_cop_temp | temp | Temperatur in Celcius |
Media_toggle_playback | ||
Media_Next_track | ||
Media_Previous_track | ||
Media_Next_favorit | ||
Media_Previous_favorit | ||
Media_volume_Up | ||
Media_volume_down | ||
Set_valet_mode | on password | true oder false , 4 -stellige Pin |
Reset_valet_pin | ||
Speed_limit_activate | pin | 4 Ziffer Pin |
Speed_limit_deactivate | pin | 4 Ziffer Pin |
Speed_limit_set_limit | limit_mph | Zwischen 50-90 |
Speed_limit_clear_pin | pin | 4 Ziffer Pin |
Plan_software_update | offset_sec | Sekunden |
Cancel_software_update | ||
Set_sentry_mode | on | true oder false |
Remote_Seat_Heater_Request | heater , level | Sitz 0-5, Stufe 0-3 |
Remote_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true oder false |
Remote_Seat_Cooling_Request | seat_position , seat_cooler_level | |
Remote_steering_wheel_heater_request | on | true oder false |
1 erfordert die Autoversion 2021.36 oder höher. Das Einstellen charging_amps
auf 2 oder 3 führt zu 3a und die Einstellung von 0 oder 1 führt zu 2a.
2 close
erfordert, dass lat
und lon
-Werte in der Nähe des aktuellen Standorts des Autos liegen.
Grundlegende Ausnahmehandhabung:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
Alle requests.exceptions
und oauthlib.oauth2.rfc6749.errors
-Klassen werden vom Modul importiert. Wenn das Fahrzeug schläft oder offline ist und das Fahrzeug online sein muss, damit der API -Endpunkt ausgeführt wird, wird die folgende Ausnahme erhöht: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
. Die Ausnahme kann als teslapy.HTTPError
gefangen werden.
Zusätzlich erhöht sync_wake_up()
teslapy.VehicleError
, wenn das Fahrzeug innerhalb des angegebenen Timeouts nicht online kommt. Und command()
erhöht auch teslapy.VehicleError
Wenn das Ergebnis der Fahrzeugbefehlsreaktion False
ist. Wenn beispielsweise einer der Medienendpunkte aufgerufen wird und im Fahrzeug kein Benutzer vorhanden ist, wird die folgende Ausnahme angehoben: VehicleError: user_not_present
.
Ab dem 29. Januar 2021 hat Tesla diesen Endpunkt so aktualisiert, dass er RFC 7523 folgt und die Verwendung des SSO -Dienstes (auth.tesla.com) zur Authentifizierung benötigt. Wenn Sie eine requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
erhalten.
Zum 3. September 2021 hat Tesla dem Anmeldeformular Recaptcha hinzugefügt. Dies führte dazu, dass das durch Teslapy implementierte Kopfloses Anmeldung zum Brechen implementiert wurde. Wenn Sie einen ValueError: Credentials rejected. Recaptcha is required
und Sie verwenden korrekte Anmeldeinformationen, dann verwenden Sie wahrscheinlich eine alte Version dieses Moduls.
Ab dem 12. Januar 2022 hat Tesla die Verwendung von RFC 7523 -Token veraltet und erfordert, dass die SSO -Token für den API -Zugang verwendet werden. Wenn Sie eine requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
erhalten. Dieses Modul.
Ab dem 7. Januar 2024 hat Tesla den Endpoint Vehicle_List entfernt. Wenn Sie eine requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
dann verwenden Sie wahrscheinlich eine alte Version dieses Moduls.
Das Quell -Repository enthält drei Demo -Anwendungen, die optional PYWebView Version 3.0 oder höher oder Selenium Version 3.13.0 oder höher verwenden, um WebLogin zu automatisieren. Selen 4 4.0.0 oder höher ist für das Kantenchrom erforderlich.
CLI.PY ist eine einfache CLI -Anwendung, die fast die gesamte Funktionalität des Teslapy -Moduls verwenden kann. Mit der Filteroption können Sie ein Produkt auswählen, wenn mehr als ein Produkt mit Ihrem Konto verknüpft ist. Die API -Ausgabe ist json formatiert:
usage: cli.py [-h] -e EMAIL [-f FILTER] [-a API [KEYVALUE ...]] [-k KEYVALUE]
[-c COMMAND] [-t TIMEOUT] [-p PROXY] [-R REFRESH] [-U URL] [-l]
[-o] [-v] [-w] [-g] [-b] [-n] [-m] [-s] [-d] [-r] [-S] [-H] [-V]
[-L] [-u] [--chrome] [--edge]
Tesla Owner API CLI
optional arguments:
-h, --help show this help message and exit
-e EMAIL login email
-f FILTER filter on id, vin, etc.
-a API [KEYVALUE ...]
API call endpoint name
-k KEYVALUE API parameter (key=value)
-c COMMAND product command endpoint
-t TIMEOUT connect/read timeout
-p PROXY proxy server URL
-R REFRESH use this refresh token
-U URL SSO service base URL
-l, --list list all selected vehicles/batteries
-o, --option list vehicle option codes
-v, --vin vehicle identification number decode
-w, --wake wake up selected vehicle(s)
-g, --get get rollup of all vehicle data
-b, --battery get detailed battery state and config
-n, --nearby list nearby charging sites
-m, --mobile get mobile enabled state
-s, --site get current site generation data
-d, --debug set logging level to debug
-r, --stream receive streaming vehicle data on-change
-S, --service get service self scheduling eligibility
-H, --history get charging history data
-B, --basic get basic vehicle data only
-G, --location get location (GPS) data, wake as needed
-V, --verify disable verify SSL certificate
-L, --logout clear token from cache and logout
-u, --user get user account details
--chrome use Chrome WebDriver
--edge use Edge WebDriver
Beispiel Verwendung von cli.py:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
MENU.PY ist eine Menü-basierte Konsolenanwendung, die Fahrzeugdaten in einem tabellarischen Format anzeigt. Die Anwendung hängt von Geopy ab, um GPS -Koordinaten in eine menschliche lesbare Adresse umzuwandeln:
GUI.PY ist eine grafische Benutzeroberfläche mit tkinter
. API -Aufrufe werden asynchron mit Threading durchgeführt. Die GUI unterstützt die automatische Aktualisierung der Fahrzeugdaten und zeigt ein komponiertes Fahrzeugbild an. Beachten Sie, dass das Fahrzeug nicht schlafen wird, wenn die automatische Aktualisierung aktiviert ist. Die Anwendung hängt von Geopy ab, um GPS -Koordinaten in eine menschliche lesbare Adresse umzuwandeln. Wenn die TCL/TK -GUI -Toolkit -Version Ihrer Python -Installation niedriger als 8,6 ist, ist das Kissen erforderlich, um das Fahrzeugbild anzuzeigen. Benutzerpräferenzen, z. B. welcher Webbrowser zur Authentifizierung verwendet werden soll, bestehen bei der Anwendung neu.
Die Fahrzeugladeverlauf kann auch in einer Grafik angezeigt werden.
Die Demo -Anwendungen können mithilfe der bereitgestellten Dockerfile Containerisiert werden. Ein Bindungsvolumen wird verwendet, um cache.json und gui.ini im aktuellen Verzeichnis auf dem Host -Computer zu speichern:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
Beispielausgabe von get_vehicle_data()
oder python cli.py -e [email protected] -w -g
unten:
{
"id" : 12345678901234567 ,
"vehicle_id" : 1234567890 ,
"vin" : " 5YJ3E111111111111 " ,
"display_name" : " Tim's Tesla " ,
"option_codes" : null ,
"color" : null ,
"tokens" : [
" 1234567890abcdef " ,
" abcdef1234567890 "
],
"state" : " online " ,
"in_service" : false ,
"id_s" : " 12345678901234567 " ,
"calendar_enabled" : true ,
"api_version" : 6 ,
"backseat_token" : null ,
"backseat_token_updated_at" : null ,
"user_id" : 123456 ,
"charge_state" : {
"battery_heater_on" : false ,
"battery_level" : 44 ,
"battery_range" : 99.84 ,
"charge_current_request" : 16 ,
"charge_current_request_max" : 16 ,
"charge_enable_request" : true ,
"charge_energy_added" : 14.54 ,
"charge_limit_soc" : 90 ,
"charge_limit_soc_max" : 100 ,
"charge_limit_soc_min" : 50 ,
"charge_limit_soc_std" : 90 ,
"charge_miles_added_ideal" : 66.5 ,
"charge_miles_added_rated" : 66.5 ,
"charge_port_cold_weather_mode" : false ,
"charge_port_door_open" : true ,
"charge_port_latch" : " Engaged " ,
"charge_rate" : 455.7 ,
"charge_to_max_range" : false ,
"charger_actual_current" : 0 ,
"charger_phases" : null ,
"charger_pilot_current" : 16 ,
"charger_power" : 100 ,
"charger_voltage" : 2 ,
"charging_state" : " Charging " ,
"conn_charge_cable" : " IEC " ,
"est_battery_range" : 78.13 ,
"fast_charger_brand" : " Tesla " ,
"fast_charger_present" : true ,
"fast_charger_type" : " Combo " ,
"ideal_battery_range" : 99.84 ,
"managed_charging_active" : false ,
"managed_charging_start_time" : null ,
"managed_charging_user_canceled" : false ,
"max_range_charge_counter" : 1 ,
"minutes_to_full_charge" : 15 ,
"not_enough_power_to_heat" : null ,
"scheduled_charging_pending" : false ,
"scheduled_charging_start_time" : null ,
"time_to_full_charge" : 0.25 ,
"timestamp" : 1569952097456 ,
"trip_charging" : true ,
"usable_battery_level" : 44 ,
"user_charge_enable_request" : null
},
"climate_state" : {
"battery_heater" : false ,
"battery_heater_no_power" : null ,
"climate_keeper_mode" : " off " ,
"driver_temp_setting" : 21.0 ,
"fan_status" : 3 ,
"inside_temp" : 21.0 ,
"is_auto_conditioning_on" : true ,
"is_climate_on" : true ,
"is_front_defroster_on" : false ,
"is_preconditioning" : false ,
"is_rear_defroster_on" : false ,
"left_temp_direction" : 54 ,
"max_avail_temp" : 28.0 ,
"min_avail_temp" : 15.0 ,
"outside_temp" : 13.5 ,
"passenger_temp_setting" : 21.0 ,
"remote_heater_control_enabled" : true ,
"right_temp_direction" : 54 ,
"seat_heater_left" : 0 ,
"seat_heater_right" : 0 ,
"side_mirror_heaters" : false ,
"smart_preconditioning" : false ,
"timestamp" : 1569952097456 ,
"wiper_blade_heater" : false
},
"drive_state" : {
"gps_as_of" : 1569952096 ,
"heading" : 240 ,
"latitude" : 52.531951 ,
"longitude" : 6.156999 ,
"native_latitude" : 52.531951 ,
"native_location_supported" : 1 ,
"native_longitude" : 6.156999 ,
"native_type" : " wgs " ,
"power" : -100 ,
"shift_state" : null ,
"speed" : null ,
"timestamp" : 1569952097456
},
"gui_settings" : {
"gui_24_hour_time" : true ,
"gui_charge_rate_units" : " km/hr " ,
"gui_distance_units" : " km/hr " ,
"gui_range_display" : " Rated " ,
"gui_temperature_units" : " C " ,
"show_range_units" : false ,
"timestamp" : 1569952097456
},
"vehicle_config" : {
"can_accept_navigation_requests" : true ,
"can_actuate_trunks" : true ,
"car_special_type" : " base " ,
"car_type" : " model3 " ,
"charge_port_type" : " CCS " ,
"eu_vehicle" : true ,
"exterior_color" : " SolidBlack " ,
"has_air_suspension" : false ,
"has_ludicrous_mode" : false ,
"key_version" : 2 ,
"motorized_charge_port" : true ,
"plg" : false ,
"rear_seat_heaters" : 0 ,
"rear_seat_type" : null ,
"rhd" : false ,
"roof_color" : " Glass " ,
"seat_type" : null ,
"spoiler_type" : " None " ,
"sun_roof_installed" : null ,
"third_row_seats" : " <invalid> " ,
"timestamp" : 1569952097456 ,
"use_range_badging" : true ,
"wheel_type" : " Pinwheel18 "
},
"vehicle_state" : {
"api_version" : 6 ,
"autopark_state_v2" : " unavailable " ,
"calendar_supported" : true ,
"car_version" : " 2019.32.11.1 d39e85a " ,
"center_display_state" : 2 ,
"df" : 0 ,
"dr" : 0 ,
"fd_window" : 0 ,
"fp_window" : 0 ,
"ft" : 0 ,
"is_user_present" : true ,
"locked" : false ,
"media_state" : {
"remote_control_enabled" : true
},
"notifications_supported" : true ,
"odometer" : 6963.081561 ,
"parsed_calendar_supported" : true ,
"pf" : 0 ,
"pr" : 0 ,
"rd_window" : 0 ,
"remote_start" : false ,
"remote_start_enabled" : true ,
"remote_start_supported" : true ,
"rp_window" : 0 ,
"rt" : 0 ,
"sentry_mode" : false ,
"sentry_mode_available" : true ,
"software_update" : {
"expected_duration_sec" : 2700 ,
"status" : " "
},
"speed_limit_mode" : {
"active" : false ,
"current_limit_mph" : 85.0 ,
"max_limit_mph" : 90 ,
"min_limit_mph" : 50 ,
"pin_code_set" : false
},
"sun_roof_percent_open" : null ,
"sun_roof_state" : " unknown " ,
"timestamp" : 1569952097456 ,
"valet_mode" : false ,
"valet_pin_needed" : true ,
"vehicle_name" : " Tim's Tesla "
}
}
Beispielausgabe von get_service_scheduling_data()
oder python cli.py -e [email protected] --service
unten:
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
Beispielausgabe von get_battery_data()
oder python cli.py -e [email protected] -b
unten:
{
"energy_site_id" : 111110110110 ,
"resource_type" : " battery " ,
"site_name" : " Elon's House " ,
"id" : " STE10110111-00101 " ,
"gateway_id" : " 1111100-11-A--AAA11110A1A111 " ,
"asset_site_id" : " a1100111-1a11-1aaa-a111-1a0011aa1111 " ,
"energy_left" : 0 ,
"total_pack_energy" : 13746 ,
"percentage_charged" : 0 ,
"battery_type" : " ac_powerwall " ,
"backup_capable" : true ,
"battery_power" : 0 ,
"sync_grid_alert_enabled" : false ,
"breaker_alert_enabled" : false ,
"components" : {
"solar" : true ,
"solar_type" : " pv_panel " ,
"battery" : true ,
"grid" : true ,
"backup" : true ,
"gateway" : " teg " ,
"load_meter" : true ,
"tou_capable" : true ,
"storm_mode_capable" : true ,
"flex_energy_request_capable" : false ,
"car_charging_data_supported" : false ,
"off_grid_vehicle_charging_reserve_supported" : false ,
"vehicle_charging_performance_view_enabled" : false ,
"vehicle_charging_solar_offset_view_enabled" : false ,
"battery_solar_offset_view_enabled" : true ,
"show_grid_import_battery_source_cards" : true ,
"battery_type" : " ac_powerwall " ,
"configurable" : false ,
"grid_services_enabled" : false
},
"grid_status" : " Active " ,
"backup" : {
"backup_reserve_percent" : 0 ,
"events" : null
},
"user_settings" : {
"storm_mode_enabled" : false ,
"sync_grid_alert_enabled" : false ,
"breaker_alert_enabled" : false
},
"default_real_mode" : " self_consumption " ,
"operation" : " self_consumption " ,
"installation_date" : " 2020-01-01T10:10:00+08:00 " ,
"power_reading" : [
{
"timestamp" : " 2021-02-24T04:25:39+08:00 " ,
"load_power" : 5275 ,
"solar_power" : 3 ,
"grid_power" : 5262 ,
"battery_power" : 10 ,
"generator_power" : 0
}
],
"battery_count" : 1
}
Beispielausgabe von get_site_data()
oder python cli.py -e [email protected] -s
unten:
{
"energy_site_id" : 111110110110 ,
"resource_type" : " solar " ,
"id" : " 111aaa00-111a-11a1-00aa-00a1aa1aa0aa " ,
"asset_site_id" : " a1100111-1a11-1aaa-a111-1a0011aa1111 " ,
"solar_power" : 11892.01953125 ,
"solar_type" : " pv_panel " ,
"storm_mode_enabled" : null ,
"powerwall_onboarding_settings_set" : null ,
"sync_grid_alert_enabled" : false ,
"breaker_alert_enabled" : false ,
"components" : {
"battery" : false ,
"solar" : true ,
"solar_type" : " pv_panel " ,
"grid" : true ,
"load_meter" : true ,
"market_type" : " residential "
},
"energy_left" : 0 ,
"total_pack_energy" : 1 ,
"percentage_charged" : 0 ,
"battery_power" : 0 ,
"load_power" : 0 ,
"grid_status" : " Unknown " ,
"grid_services_active" : false ,
"grid_power" : -11892.01953125 ,
"grid_services_power" : 0 ,
"generator_power" : 0 ,
"island_status" : " island_status_unknown " ,
"storm_mode_active" : false ,
"timestamp" : " 2022-08-15T17:12:26Z " ,
"wall_connectors" : null
}
Teslapy ist auf PYPI erhältlich:
python -m pip install teslapy 'urllib3<2'
Stellen Sie sicher, dass Sie Python 2.7+ oder 3.5+ auf Ihrem System installiert haben. Alternativ klonen Sie das Repository auf Ihren Computer und führen Sie die Demo -Anwendung CLI.PY, Menu.py oder Gui.py aus, um zu beginnen .0+ (optional) und WebSocket-Client 0,59+ unter Verwendung von PIP wie folgt:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
und installieren Sie Chromedriver, um Selen oder auf Ubuntu wie folgt zu verwenden:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket