Une implémentation Python basée sur une documentation non officielle de l'interface côté client à l'API du propriétaire Tesla Motors, qui fournit des fonctionnalités pour surveiller et contrôler à distance les produits Tesla.
L'API du propriétaire cessera de travailler alors que les véhicules commencent à nécessiter une authentification de commande de bout en bout à l'aide du protocole de commande de véhicule Tesla. Les véhicules des modèles S et X avant 2021 ne soutiennent pas ce nouveau protocole et restent contrôlables à l'aide de Tesloty.
Ce module dépend des demandes Python, de requêtes_oauthlib et de WebSocket-Client. Il nécessite Python 3.10+ lors de l'utilisation d'Urllib3 2.0, qui est livré avec des demandes 2.30.0+, ou vous pouvez épingler UrLlib3 à 1.26.x en installant urllib3<2
.
La classe Tesla
étend requests_oauthlib.OAuth2Session
qui étend requests.Session
et hérite donc de méthodes comme get()
et post()
qui peuvent être utilisées pour effectuer des appels d'API. Caractéristiques du module:
Tesloty 2.0.0+ n'implémente plus l'authentification sans tête. Le constructeur diffère et prend ces arguments:
Argument | Description |
---|---|
email | Identité SSO |
verify | (facultatif) Vérifiez le certificat SSL |
proxy | (facultatif) URL du serveur proxy |
retry | (Facultatif) Nombre de tentatives de connexion ou d'instance Retry |
timeout | (Facultatif) Connecter / Lire le délai d'expiration |
user_agent | (Facultatif) La chaîne d'agent utilisateur |
authenticator | fonction (facultative) avec un argument, l'URL d'autorisation, qui renvoie l'URL redirigé |
cache_file | (facultatif) Chemin vers le fichier de cache utilisé par le chargeur et le dumper par défaut |
cache_loader | (Facultatif) Fonction qui renvoie le dict de cache |
cache_dumper | fonction (facultative) avec un argument, le cache dict |
sso_base_url | (facultatif) URL du service SSO, réglé sur https://auth.tesla.cn/ si votre e-mail est enregistré dans une autre région |
state | (facultatif) State String pour la protection CSRF |
code_verifier | (Facultatif) PKCE Code Verifier String |
app_user_agent | (Facultatif) X-Tesla-User-Agent String |
TesLapy 2.1.0+ n'implémente plus RFC 7523 et utilise le jeton SSO pour toutes les demandes d'API.
La classe ouvrira la page SSO de Tesla dans le navigateur Web par défaut du système à s'authentifier. Après une authentification réussie, une page introuvable sera affichée et l'URL devrait commencer par https://auth.tesla.com/void/callback
, qui est l'URL redirigé. La classe utilisera stdio
pour obtenir l'URL redirigé complète du navigateur Web par défaut. Vous devez copier et coller l'URL complète du navigateur Web à la console pour continuer les jetons API d'observation. Vous pouvez utiliser une méthode Authenticatrice enfichable pour automatiser cela, par exemple en utilisant PyWebView ou Selenium. Il est également possible d'utiliser un jeton de rafraîchissement SSO obtenu par une application d'authentification tierce.
La méthode de commodité api()
utilise des points de terminaison nommés répertoriés dans Endpoints.json pour effectuer des appels, le module ne nécessite donc pas de modifications si l'API est mise à jour. api()
remplace les variables de chemin dans l'uri et les appels fetch_token()
en cas de besoin. Tout message d'erreur renvoyé par l'API est soulevé en tant qu'exception HTTPError
. De plus, la classe met en œuvre les méthodes suivantes:
Appel | Description |
---|---|
request() | Effectue l'appel de l'API à l'aide de l'URL relative ou absolue, de sérialisation et de gestion des messages d'erreur |
new_code_verifier() | génère du vérificateur de code pour PKCE |
authorization_url() | Forms URL d'autorisation avec extension PKCE et essaie de détecter la région enregistrée des comptes |
fetch_token() | demande un jeton SSO utilisant une subvention de code d'autorisation avec une extension PKCE |
refresh_token() | demande un jeton SSO utilisant une subvention de jeton de rafraîchissement |
close() | supprimer toutes les instances de l'adaptateur de demandes |
logout() | Supprime le jeton du cache, renvoie une URL de déconnexion et se connecte éventuellement à l'aide du navigateur Web par défaut du système |
vehicle_list() | Renvoie une liste d'objets de véhicule |
battery_list() | Renvoie une liste d'objets de batterie |
solar_list() | Renvoie une liste d'objets solarpanels |
La classe Vehicle
étend dict
et stocke les données sur les véhicules renvoyés par l'API propriétaire, qui est une API de traction. Les appels get_vehicle_summary()
et get_vehicle_data()
mettent à jour l'instance Vehicle
, fusionnant les données. L'API de streaming pousse les données de véhicule au changement après l'abonnement. La méthode stream()
prend un argument facultatif, une fonction de rappel qui est appelée avec un argument, un dict tenant les données modifiées. L'objet Vehicle
est toujours mis à jour avec les données poussées. S'il n'y a pas de modifications dans les 10 secondes, le véhicule cesse de diffuser des données. La méthode stream()
a deux autres arguments facultatifs pour contrôler le redémarrage. De plus, la classe met en œuvre les méthodes suivantes:
Appel | En ligne | Description |
---|---|---|
api() | Oui | effectue un appel API à un point de terminaison nommé nécessitant un véhicule_id avec des arguments facultatifs |
get_vehicle_summary() | Non | Obtient l'état du véhicule (en ligne, endormi, hors ligne) |
available() | Non | vérifie si le véhicule est en ligne sur la base de données en cache ou un statut rafraîchi lorsque vous avez vieilli |
sync_wake_up() | Non | se réveille et attend que le véhicule se mette en ligne |
decode_option() | Non | Description du code d'option de recherche (Lire à partir d' option_codes.json ) |
option_code_list() 1 | Non | Répertorie les descriptions connues des codes d'option de véhicule |
get_vehicle_data() | Oui | Obtenez des données sur les véhicules pour les points de terminaison sélectionnés, par défaut à tous les points de terminaison |
get_vehicle_location_data() | Oui | Obtient les données de base et de localisation pour le véhicule |
get_nearby_charging_sites() | Oui | Listes à proximité des bornes de recharge Tesla-opérées |
get_service_scheduling_data() | Non | Récupère le prochain rendez-vous sur le service pour ce véhicule |
get_charge_history() 2 | Non | Répertorie les points de données sur l'historique de charge des véhicules |
mobile_enabled() | Oui | vérifie si le paramètre d'accès mobile est activé dans la voiture |
compose_image() 3 | Non | Compose une image de véhicule basée sur les codes d'option de véhicule |
dist_units() | Non | convertit la distance ou les unités de vitesse en réglage de l'interface graphique du véhicule |
temp_units() | Non | convertit les unités de température en réglage de l'interface graphique du véhicule |
gui_time() | Non | Renvoie l'horodatage ou l'heure actuelle formatée sur l'interface graphique |
last_seen() | Non | Retourne le véhicule pour la dernière fois le temps naturel vu |
decode_vin() | Non | Décode le numéro d'identification du véhicule à un dict |
command() | Oui | wrapper autour de api() pour la gestion des erreurs de réponse aux commandes de véhicule |
1 Les codes d'option semblent être obsolètes.
2 voitures Version 2021.44.25 ou plus requise, le partage de données doit être activé et vous devez être le principal propriétaire du véhicule.
3 Les codes d'option de véhicule passants à cette méthode maintenant les codes d'options sont obsolètes.
Seules les méthodes avec non dans la colonne en ligne sont disponibles lorsque le véhicule est endormi ou hors ligne. Ces méthodes n'empêcheront pas votre véhicule de dormir. D'autres méthodes et appels API nécessitent que le véhicule soit mis en ligne à l'aide de sync_wake_up()
et peut empêcher votre véhicule de dormir s'il est appelé dans un délai trop court.
La classe Product
étend dict
et est initialisée avec les données du produit des murs de puissance et des panneaux solaires renvoyés par l'API. De plus, la classe met en œuvre les méthodes suivantes:
Appel | Description |
---|---|
api() | Effectue un appel API à un point de terminaison nommé nécessitant Battery_id ou Site_id avec des arguments facultatifs |
get_history_data() | Récupérer l'état du produit en direct |
get_calendar_history_data() | Récupérer l'état du produit en direct |
command() | wrapper autour de api() pour la gestion des erreurs de réponse de la commande de la batterie |
La classe Battery
étend Product
et stocke les données Powerwall renvoyées par l'API, mises à jour par get_battery_data()
. De plus, la classe met en œuvre les méthodes suivantes:
Appel | Description |
---|---|
get_battery_data() | Récupérer l'état détaillé et la configuration de la batterie |
set_operation() | Définissez le fonctionnement de la batterie sur l'auto-onsomption, la sauvegarde ou l'autonomie |
set_backup_reserve_percent() | Réglez le pourcentage de réserve de sauvegarde minimale pour cette batterie |
set_import_export() | Définit les paramètres d'importation et d'exportation du réseau de batterie |
get_tariff() | Obtenez les données de taux de tarif |
set_tariff() | Définissez les données de taux de tarif. Les données peuvent être créées manuellement ou générées par create_tariff |
create_tariff() | Crée un dictionnaire de données tarifaires correctement formaté |
La classe SolarPanel
étend Product
et stocke les données du panneau solaire renvoyées par l'API, mises à jour par get_site_data()
. De plus, la classe met en œuvre les méthodes suivantes:
Appel | Description |
---|---|
get_site_data() | Récupérer les données actuelles de génération de sites |
Utilisation de base du module:
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 et 2.5.0 appelle automatiquement get_vehicle_data()
et TesLapy 2.6.0+ appelle automatiquement get_latest_vehicle_data()
lorsqu'une clé n'est pas trouvée. Cet exemple fonctionne pour 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' )
Exemple de sortie:
Tim's Tesla last seen 6 hours ago at 87% SoC
La classe Tesla
met en œuvre une méthode d'authentification enfichable. Si vous souhaitez implémenter votre propre méthode pour gérer la page SSO et récupérer l'URL redirigée après l'authentification, vous pouvez transmettre une fonction comme un argument au constructeur, cela prend l'URL d'authentification comme argument et renvoie l'URL redirigé. L'argument authenticator
est également accessible en tant qu'attribut.
Exemple à l'aide d'un composant WebView qui affiche la page SSO dans sa propre fenêtre GUI native.
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 ()
Exemple utilisant le sélénium pour automatiser l'interaction du navigateur Web. La page SSO renvoie un 403 lorsque navigator.webdriver
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 a introduit la méthode authorization_url()
pour obtenir l'URL de la page SSO et l'option de fournir l'URL redirigé en tant qu'argument clé authorization_response
sur fetch_token()
après l'authentification.
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 ()
Un soutien à l'autorisation mis en scène a été ajouté à Teslapy 2.5.0. Les arguments de mots clés state
et code_verifier
sont acceptés par le constructeur de classe Tesla
, la méthode authorization_url()
et la méthode fetch_token()
.
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+ prend en charge l'utilisation d'un jeton de rafraîchissement obtenu par les applications d'authentification tierce. Le jeton de rafraîchissement est utilisé pour obtenir un jeton d'accès et les deux sont mis en cache pour la persistance, vous n'avez donc qu'à fournir le jeton de rafraîchissement qu'une seule fois.
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 ])
Pour utiliser le navigateur Web par défaut de votre système pour vous déconnecter de la page SSO et effacer le jeton à partir du cache:
tesla . logout ( sign_out = True )
Si vous utilisez PyWebView, vous pouvez effacer le jeton à partir du cache et obtenir l'URL de déconnexion pour afficher une fenêtre de déconnexion:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
Le sélénium ne stocke pas les cookies, il suffit de dégager le jeton du cache:
tesla . logout ()
La classe Tesla
implémente une méthode de cache enfichable. Si vous ne souhaitez pas utiliser la mise en cache de disque par défaut, vous pouvez transmettre une fonction pour charger et renvoyer le dict de cache, et une fonction qui prend un dict comme argument pour vider le dict du cache, comme arguments au constructeur. Les arguments cache_loader
et cache_dumper
sont également accessibles en tant qu'attributs.
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 ()
Les scores de sécurité sont obtenus par une autre API. Tesloty 2.1.0 a introduit la prise en charge absolue d'URL pour accéder aux points de terminaison API non propriétaires.
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 utilise un délai d'attente de connexion et de lecture réglable de 10 secondes par défaut. Reportez-vous à la section Timeought pour plus de détails. TesLapy ne réessaye pas les connexions échouées ou chronométrées par défaut, qui peuvent être activées avec le paramètre retry
.
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
Un programme robuste tenant compte des défaillances du réseau a une stratégie de réessayer, qui comprend le nombre total de tentatives de réessayer à faire, les codes de réponse HTTP à réessayer et éventuellement un facteur de revers. Reportez-vous au module RETRY pour plus de détails.
Sachez que Tesla peut bloquer temporairement votre compte si vous martelez trop les serveurs.
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
La ligne après le gestionnaire de contexte soulèvera une exception lors de l'utilisation de TesLapy 2.5.0+ car elle ferme explicitement le gestionnaire de connexion des demandes lorsque le gestionnaire de contexte sort. Les versions antérieures n'augmenteraient pas une exception et les tentatives ne fonctionneraient pas.
Jetez un œil à Cli.py, menu.py ou gui.py pour plus d'exemples de code.
Ce sont les principales commandes:
Point final | Paramètres | Valeur |
---|---|---|
OUVRIR | ||
VERROUILLAGE | ||
Honk_horn | ||
Flash_lights | ||
Climat_on | ||
Climat_off | ||
Max_defrost | on | true ou false |
Change_climate_temperature_setting | driver_temp , passenger_temp | Température dans Celcius |
Set_climate_keeper_mode | climate_keeper_mode | 0 = off, 1 = on, 2 = chien, 3 = camp |
HVAC_BIOWEAPON_MODE | on | true ou false |
Scheduled_deParture 1 | enable end_off_peak_time departure_time , preconditioning_enabled , preconditioning_weekdays_only off_peak_charging_weekdays_only off_peak_charging_enabled | true ou false , quelques minutes après minuit |
Scheduled_Charging 1 | enable , time | true ou false , quelques minutes après minuit |
Charge_amps 1 | charging_amps | entre 0-32 |
Set_cabin_overheat_protection | on , fan_only | true ou false |
Change_CHARGE_LIMIT | percent | pourcentage |
Set_vehicle_name | vehicle_name | nom |
Change_sunroof_state | state | vent ou close |
Window_Control 2 | command , lat , lon | vent ou close , 0 , 0 |
Actuate_trunk | which_trunk | rear ou front |
Remote_start | ||
Trigger_homelink | lat , lon | Lattitude et logitude actuelles |
Charge_port_door_open | ||
Charge_port_door_close | ||
Start_charge | ||
Stop_coffice | ||
Set_cop_temp | temp | Température dans Celcius |
Media_toggle_playback | ||
Media_next_track | ||
Media_previous_track | ||
Media_next_favorite | ||
Media_previous_favorite | ||
Media_volume_up | ||
Media_volume_down | ||
Set_valet_mode | on , password | Pin true ou false , 4 chiffres |
Reset_valet_pin | ||
Speed_limit_activate | pin | Pin de 4 chiffres |
Speed_limit_deactiver | pin | Pin de 4 chiffres |
Speed_limit_set_limit | limit_mph | entre 50 et 90 |
Speed_limit_clear_pin | pin | Pin de 4 chiffres |
Calendrier_software_update | offset_sec | secondes |
Annuler_software_update | ||
Set_sentry_mode | on | true ou false |
Distote_seat_heater_request | heater , level | siège 0-5, niveau 0-3 |
Distote_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true ou false |
Distote_seat_cooling_request | seat_position , seat_cooler_level | |
Remote_stering_wheel_heater_request | on | true ou false |
1 nécessite la version de la voiture 2021.36 ou plus. La définition charging_amps
sur 2 ou 3 se traduit en 3A et la définition de 0 ou 1 résulte en 2A.
2 close
nécessite que les valeurs lat
et lon
soient près de l'emplacement actuel de la voiture.
Gestion des exceptions de base:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
Toutes requests.exceptions
et oauthlib.oauth2.rfc6749.errors
Les classes Errors sont importées par le module. Lorsque le véhicule est endormi ou hors ligne et que le véhicule doit être en ligne pour que le point de terminaison de l'API soit exécuté, l'exception suivante est soulevée: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
. L'exception peut être capturée comme teslapy.HTTPError
.
De plus, sync_wake_up()
augmente teslapy.VehicleError
. Et command()
augmente également teslapy.VehicleError
False
Par exemple, si l'un des points de terminaison multimédia est appelé et qu'aucun utilisateur n'est présent dans le véhicule, l'exception suivante est soulevée: VehicleError: user_not_present
.
Au 29 janvier 2021, Tesla a mis à jour ce point de terminaison pour suivre RFC 7523 et nécessite l'utilisation du service SSO (auth.tesla.com) pour l'authentification. Si vous obtenez une requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
, vous utilisez probablement une ancienne version de ce module.
Au 3 septembre 2021, Tesla a ajouté Recaptcha au formulaire de connexion. Cela a provoqué la rupture de la connexion sans tête mise en œuvre par Tesloty. Si vous obtenez une ValueError: Credentials rejected. Recaptcha is required
et vous utilisez des informations d'identification correctes, puis vous utilisez probablement une ancienne version de ce module.
Au 12 janvier 2022, Tesla a obsolète l'utilisation de jetons RFC 7523 et nécessite que les jetons SSO soient utilisés pour l'accès à l'API. Si vous obtenez une requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
et que vous utilisez des informations d'identification correctes, vous utilisez probablement une ancienne version de la version de ce module.
Au 7 janvier 2024, Tesla a supprimé le point de terminaison de véhicule_list. Si vous obtenez une requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
, vous utilisez probablement une ancienne version de ce module.
Le référentiel source contient trois applications de démonstration qui utilisent éventuellement PyWebView version 3.0 ou supérieure ou Selenium version 3.13.0 ou plus pour automatiser Weblogin. Le sélénium 4.0.0 ou plus est nécessaire pour le chrome de bord.
CLI.py est une application CLI simple qui peut utiliser presque toutes les fonctionnalités du module Teslapy. L'option Filtre vous permet de sélectionner un produit si plusieurs produits sont liés à votre compte. La sortie de l'API est formatée JSON:
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
Exemple d'utilisation de Cli.py:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
Menu.py est une application de console basée sur le menu qui affiche les données du véhicule dans un format tabulaire. L'application dépend de Geopy pour convertir les coordonnées GPS en une adresse lisible par l'homme:
Gui.py est une interface utilisateur graphique utilisant tkinter
. Les appels API sont effectués de manière asynchrone à l'aide de filetage. L'interface graphique prend en charge la rafraîchissement automatique des données du véhicule et affiche une image de véhicule composée. Notez que le véhicule ne s'endormera pas, si la rafraîchissement automatique est activée. L'application dépend de Geopy pour convertir les coordonnées GPS en une adresse lisible par l'homme. Si la version à outils TCL / TK GUI de votre installation Python est inférieure à 8,6, l'oreiller est nécessaire pour afficher l'image du véhicule. Les préférences des utilisateurs, telles que le navigateur Web à utiliser pour l'authentification, persistent lors du redémarrage de l'application.
L'historique de charge du véhicule peut également être affiché dans un graphique.
Les applications de démonstration peuvent être contenerisées à l'aide du DockerFile fourni. Un volume de liaison est utilisé pour stocker Cache.json et Gui.ini dans le répertoire actuel de la machine hôte:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
Exemple de sortie de get_vehicle_data()
ou python cli.py -e [email protected] -w -g
ci-dessous:
{
"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 "
}
}
Exemple de sortie de get_service_scheduling_data()
ou python cli.py -e [email protected] --service
ci-dessous:
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
Exemple de sortie de get_battery_data()
ou python cli.py -e [email protected] -b
ci-dessous:
{
"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
}
Exemple de sortie de get_site_data()
ou python cli.py -e [email protected] -s
ci-dessous:
{
"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
}
Tesloty est disponible sur PYPI:
python -m pip install teslapy 'urllib3<2'
Assurez-vous que Python 2.7+ ou 3.5+ est installé sur votre système. Alternativement, clonez le référentiel de votre machine et exécutez l'application de démonstration Cli.py, menu.py ou gui.py pour démarrer, après avoir installé requêtes_oauthlib 0.8.0+, Geopy 1.14.0+, pywebview 3.0+ (facultatif), Selenium 3.13 .0+ (facultatif) et WebSocket-Client 0.59+ à l'aide de PIP comme suit:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
et installer Chromedriver pour utiliser le sélénium ou sur Ubuntu comme suit:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket