Una implementación de Python basada en la documentación no oficial de la interfaz del lado del cliente a la API del propietario de Tesla Motors, que proporciona funcionalidad para monitorear y controlar los productos Tesla de forma remota.
La API del propietario dejará de trabajar a medida que los vehículos comiencen a requerir la autenticación de comandos de extremo a extremo utilizando el protocolo de comando del vehículo TESLA. Los vehículos Modelos S y X anteriores a 2011 no admiten este nuevo protocolo y siguen siendo controlables utilizando teslapy.
Este módulo depende de las solicitudes de Python, las requests_oauthlib y WebSocket-Client. Requiere Python 3.10+ cuando se usa Urllib3 2.0, que viene con las solicitudes 2.30.0+, o puede fijar URLLIB3 a 1.26.x instalando urllib3<2
.
La post()
Tesla
extiende requests_oauthlib.OAuth2Session
que extiende get()
requests.Session
. Características del módulo:
Teslapy 2.0.0+ ya no implementa la autenticación sin cabeza. El constructor difiere y toma estos argumentos:
Argumento | Descripción |
---|---|
email | Identidad SSO |
verify | (opcional) Verifique el certificado SSL |
proxy | (opcional) URL del servidor proxy |
retry | (opcional) Número de reintentos de conexión o instancia Retry |
timeout | (opcional) Conecte/lea el tiempo de espera |
user_agent | (opcional) la cadena de agente de usuario |
authenticator | (opcional) Función con un argumento, la URL de autorización, que devuelve la URL redirigida |
cache_file | (opcional) ruta al archivo de caché utilizado por cargador predeterminado y dumper |
cache_loader | (opcional) Función que devuelve el DICT de caché |
cache_dumper | (opcional) Función con un argumento, el Cache Dict |
sso_base_url | (opcional) URL del servicio SSO, establecido en https://auth.tesla.cn/ si su correo electrónico está registrado en otra región |
state | (opcional) Cadena de estado para protección CSRF |
code_verifier | (opcional) cadena de verificador de código PKCE |
app_user_agent | (opcional) cadena de agente de usuario x-tesla |
Teslapy 2.1.0+ ya no implementa RFC 7523 y usa el token SSO para todas las solicitudes de API.
La clase abrirá la página SSO de Tesla en el navegador web predeterminado del sistema para autenticarse. Después de la autenticación exitosa, se mostrará una página que no se encontrará y la URL debe comenzar con https://auth.tesla.com/void/callback
, que es la URL redirigida. La clase usará stdio
para obtener la URL redirigida completa del navegador web de forma predeterminada. Debe copiar y pegar la URL completa del navegador web a la consola para continuar con los tokens API de acuadricación. Puede usar un método de autenticador conectable para automatizar esto, por ejemplo, utilizando PywebView o Selenium. También es posible utilizar un token de actualización SSO obtenido por una aplicación de autenticación de terceros.
El método de conveniencia api()
usa puntos finales nombrados en Listado en EndPoints.json para realizar llamadas, por lo que el módulo no requiere cambios si se actualiza la API. api()
sustituye las variables de ruta en el URI y las llaman a fetch_token()
cuando sea necesario. Cualquier mensaje de error devuelto por la API se plantea como una excepción HTTPError
. Además, la clase implementa los siguientes métodos:
Llamar | Descripción |
---|---|
request() | Realiza una llamada API utilizando URL relativa o absoluta, serialización y manejo de mensajes de error |
new_code_verifier() | genera verificador de código para PKCE |
authorization_url() | URL de autorización de formularios con extensión PKCE e intenta detectar la región registrada de cuentas |
fetch_token() | Solicita un token SSO utilizando la subvención del código de autorización con la extensión PKCE |
refresh_token() | Solicita un token SSO usando la subvención de token de actualización |
close() | Eliminar todas las solicitudes de adaptador de solicitudes |
logout() | Elimina el token de la caché, devuelve la URL de sesión y opcionalmente firma con el navegador web predeterminado del sistema |
vehicle_list() | Devuelve una lista de objetos de vehículos |
battery_list() | Devuelve una lista de objetos de batería |
solar_list() | Devuelve una lista de objetos SolarPanel |
La clase Vehicle
extiende dict
y almacena los datos del vehículo devueltos por la API del propietario, que es una API de extracción. get_vehicle_summary()
y get_vehicle_data()
llama a actualizar la instancia Vehicle
, fusionando datos. La API de transmisión empuja los datos del vehículo en cambio después de la suscripción. El método stream()
toma un argumento opcional, una función de devolución de llamada que se llama con un argumento, un dict que contiene los datos cambiados. El objeto Vehicle
siempre se actualiza con los datos empujados. Si no hay cambios en 10 segundos, el vehículo deja de transmitir datos. El método stream()
tiene dos argumentos más opcionales para controlar el reinicio. Además, la clase implementa los siguientes métodos:
Llamar | En línea | Descripción |
---|---|---|
api() | Sí | Realiza una llamada API al punto final llamado que requiere vehículo_id con argumentos opcionales |
get_vehicle_summary() | No | Obtiene el estado del vehículo (en línea, dormido, fuera de línea) |
available() | No | Comprueba si el vehículo está en línea en función de los datos en caché o el estado renovado cuando envejece |
sync_wake_up() | No | se despierta y espera a que el vehículo se conecte en línea |
decode_option() | No | Descripción del código de opción de búsqueda (lea en option_codes.json ) |
option_code_list() 1 | No | Enumera descripciones conocidas de los códigos de opción de vehículo |
get_vehicle_data() | Sí | Obtenga datos del vehículo para puntos finales seleccionados, predeterminado a todos los puntos finales |
get_vehicle_location_data() | Sí | Obtiene los datos básicos y de ubicación para el vehículo |
get_nearby_charging_sites() | Sí | Listas cercanas estaciones de carga operadas por Tesla |
get_service_scheduling_data() | No | Recupera la próxima cita de servicio para este vehículo |
get_charge_history() 2 | No | Enumera los puntos de datos del historial de carga del vehículo |
mobile_enabled() | Sí | Comprueba si la configuración de acceso móvil está habilitado en el automóvil |
compose_image() 3 | No | compone una imagen de vehículo basada en códigos de opción de vehículo |
dist_units() | No | Convierte las unidades de distancia o de velocidad a la configuración de la GUI del vehículo |
temp_units() | No | Convierte las unidades de temperatura a la configuración de la GUI del vehículo |
gui_time() | No | Devuelve la marca de tiempo o la hora actual formateada a la configuración de la GUI |
last_seen() | No | Devuelve el vehículo por última vez que se ve el tiempo natural |
decode_vin() | No | decodifica el número de identificación del vehículo a un dict |
command() | Sí | envoltura alrededor de api() para el manejo de errores de respuesta al comando del vehículo |
1 Los códigos de opción parecen estar en desuso.
Versión del software de 2 automóviles 2021.44.25 o más requerido, el intercambio de datos debe estar habilitado y debe ser el propietario principal del vehículo.
Códigos de opción de vehículo de 3 pases a este método Los códigos de opciones están en desuso.
Solo los métodos sin NO en la columna en línea están disponibles cuando el vehículo está dormido o fuera de línea. Estos métodos no evitarán que su vehículo duerma. Otros métodos y llamadas de API requieren que el vehículo se ponga en línea utilizando sync_wake_up()
y puede evitar que su vehículo duerma si se le llama en un período demasiado corto.
La clase Product
se dict
y se inicializa con los datos del producto de paredes eléctricas y paneles solares devueltos por la API. Además, la clase implementa los siguientes métodos:
Llamar | Descripción |
---|---|
api() | Realiza una llamada API al punto final llamado que requiere Battery_ID o Site_id con argumentos opcionales |
get_history_data() | Recuperar el estado en vivo del producto |
get_calendar_history_data() | Recuperar el estado en vivo del producto |
command() | envoltura alrededor de api() para el manejo de errores de respuesta al comando de la batería |
La clase Battery
extiende Product
y almacena los datos de PowerWall devueltos por la API, actualizados por get_battery_data()
. Además, la clase implementa los siguientes métodos:
Llamar | Descripción |
---|---|
get_battery_data() | Recuperar estado detallado y configuración de la batería |
set_operation() | Establezca el funcionamiento de la batería en self_consuming, copia de seguridad o autónomo |
set_backup_reserve_percent() | Establezca el porcentaje de reserva de respaldo mínimo para esa batería |
set_import_export() | Establece la configuración de importación y exportación de la red de la batería |
get_tariff() | Obtenga los datos de la tarifa de la tarifa |
set_tariff() | Establezca los datos de la tasa de tarifa. Los datos pueden ser creados manualmente o generados por create_tariff |
create_tariff() | Crea un diccionario de datos arancelarios correctamente formateados |
La clase SolarPanel
extiende Product
y almacena datos del panel solar devueltos por la API, actualizados por get_site_data()
. Además, la clase implementa los siguientes métodos:
Llamar | Descripción |
---|---|
get_site_data() | Recuperar datos actuales de generación de sitios |
Uso básico del módulo:
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 y 2.5.0 llama automáticamente get_vehicle_data()
y teslapy 2.6.0+ llaman automáticamente get_latest_vehicle_data()
cuando no se encuentra una clave. Este ejemplo funciona para 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' )
Salida de ejemplo:
Tim's Tesla last seen 6 hours ago at 87% SoC
La clase Tesla
implementa un método de autenticación conectable. Si desea implementar su propio método para manejar la página SSO y recuperar la URL redirigida después de la autenticación, puede pasar una función como argumento al constructor, que toma la URL de autenticación como un argumento y devuelve la URL redirigida. El argumento authenticator
también es accesible como atributo.
Ejemplo utilizando un componente WebView que muestra la página SSO en su propia ventana de GUI nativa.
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 ()
Ejemplo usando Selenium para automatizar la interacción del navegador web. La página SSO devuelve un 403 cuando navigator.webdriver
está configurado y actualmente solo Chrome, Opera y Edge Chromium pueden evitar esto.
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 introdujo el método authorization_url()
para obtener la URL de la página SSO y la opción de proporcionar la URL redirigida como argumento de palabras clave authorization_response
a fetch_token()
después de la autenticación.
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 ()
Se ha agregado apoyo para la autorización escenificada a Teslapy 2.5.0. Los argumentos de palabras clave state
y code_verifier
son aceptados por el constructor de clase Tesla
, el método authorization_url()
y el método 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+ admite el uso de un token de actualización obtenido por aplicaciones de autenticación de terceros. El token de actualización se usa para obtener un token de acceso y ambos están en caché para la persistencia, por lo que solo necesita suministrar el token de actualización solo una vez.
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 ])
Para usar el navegador web predeterminado de sus sistemas para cerrar la página de SSO y borrar el token de Cache:
tesla . logout ( sign_out = True )
Si usa pywebview, puede borrar el token de la caché y obtener la URL de cierre de sesión para mostrar una ventana de sesión de cierre de sesión:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
Selenium no almacena cookies, solo borre el token de Cache:
tesla . logout ()
La clase Tesla
implementa un método de caché conectable. Si no desea utilizar el almacenamiento en caché de disco predeterminado, puede pasar una función para cargar y devolver el DICT del caché, y una función que toma un dict como argumento para descargar el DICT del caché, como argumentos al constructor. Los argumentos cache_loader
y cache_dumper
también son accesibles como atributos.
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 ()
Los puntajes de seguridad se obtienen a través de otra API. Teslapy 2.1.0 introdujo el soporte de URL absoluto para acceder a los puntos finales de API que no son propietarios.
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 utiliza un tiempo de espera ajustable de conexión y lectura de 10 segundos de forma predeterminada. Consulte la sección Tiempo de espera para obtener más detalles. TesLapy no vuelve a intentar las conexiones fallidas o de tiempo de tiempo por defecto, lo que puede habilitarse con el parámetro retry
.
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
Un programa sólido que representa las fallas de la red tiene una estrategia de reintento, que incluye el número total de intentos de reintento de hacer, los códigos de respuesta HTTP para volver a intentarlo y opcionalmente un factor de retroceso. Consulte el módulo de reintento para obtener más detalles.
Tenga en cuenta que Tesla puede bloquear temporalmente su cuenta si está golpeando demasiado los servidores.
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 línea después del gerente de contexto planteará una excepción al usar TesLapy 2.5.0+ porque cierra explícitamente el controlador de conexión de solicitudes cuando el gerente de contexto sale. Las versiones anteriores no plantearían una excepción y los reintentos no funcionarían.
Eche un vistazo a Cli.py, Menu.py o Gui.py para obtener más ejemplos de código.
Estos son los principales comandos:
Punto final | Parámetros | Valor |
---|---|---|
DESCUBRIR | ||
CERRAR | ||
Honk_horn | ||
Flash_lights | ||
Clima_on | ||
Clima_Off | ||
Max_defrost | on | true o false |
Change_climate_temperature_setting | driver_temp , passenger_temp | Temperatura en Celcius |
Set_climate_keeper_mode | climate_keeper_mode | 0 = apagado, 1 = encendido, 2 = perro, 3 = campamento |
HVAC_BIOWEPON_MODE | on | true o false |
Prochuled_departure 1 | enable , departure_time , preconditioning_enabled , preconditioning_weekdays_only , off_peak_charging_enabled , off_peak_charging_weekdays_only , end_off_peak_time | true o false , minutos después de la medianoche |
Programado_carging 1 | enable , time | true o false , minutos después de la medianoche |
Carging_amps 1 | charging_amps | entre 0-32 |
Set_cabin_overheat_protection | on , fan_only | true o false |
Change_charge_limit | percent | porcentaje |
Set_vehicle_name | vehicle_name | nombre |
Change_sunroof_state | state | vent o close |
Window_control 2 | command , lat , lon | vent o close , 0 , 0 |
Actuate_trunk | which_trunk | rear o front |
Remoto_start | ||
Gatillo_homelink | lat , lon | Lattitud y logitud actuales |
CARGE_PORT_DOOR_OPEN | ||
CARGE_PORT_DOOR_CLOSE | ||
Start_charge | ||
Stop_charge | ||
Set_cop_temp | temp | Temperatura en 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 | true o false , Pin de 4 dígitos |
Restablecer_valet_pin | ||
Speed_limit_activate | pin | Pin de 4 dígitos |
Speed_limit_deactivate | pin | Pin de 4 dígitos |
Speed_limit_set_limit | limit_mph | entre 50-90 |
Speed_limit_clear_pin | pin | Pin de 4 dígitos |
Programar_software_update | offset_sec | artículos de segunda clase |
Cancel_software_update | ||
Set_sentry_mode | on | true o false |
Remoto_seat_heater_request | heater , level | asiento 0-5, nivel 0-3 |
Remota_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true o false |
Remoto_seat_cooling_request | seat_position , seat_cooler_level | |
Remota_steering_wheel_heater_request | on | true o false |
1 requiere la versión del automóvil 2021.36 o superior. La configuración de charging_amps
en 2 o 3 da como resultado 3a y la configuración en 0 o 1 da como resultado 2a.
2 close
requiere que los valores lat
y lon
estén cerca de la ubicación actual del automóvil.
Manejo de excepciones básicas:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
Todas requests.exceptions
y oauthlib.oauth2.rfc6749.errors
Las clases de los Strors son importadas por el módulo. Cuando el vehículo está dormido o fuera de línea y el vehículo debe estar en línea para que se ejecute el punto final de la API, se plantea la siguiente excepción: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
. La excepción se puede atrapar como teslapy.HTTPError
.
Además, sync_wake_up()
eleva teslapy.VehicleError
cuando el vehículo no se encuentra en el tiempo de espera especificado. Y command()
también aumenta teslapy.VehicleError
cuando el resultado de la respuesta al comando del vehículo es False
. Por ejemplo, si se llama a uno de los puntos finales de medios y no hay un usuario presente en el vehículo, se eleva la siguiente excepción: VehicleError: user_not_present
.
Al 29 de enero de 2021, Tesla actualizó este punto final para seguir a RFC 7523 y requiere el uso del servicio SSO (auth.tesla.com) para la autenticación. Si obtiene una requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
entonces probablemente esté usando una versión antigua de este módulo.
Al 3 de septiembre de 2021, Tesla ha agregado recaptcha al formulario de inicio de sesión. Esto provocó que el inicio de sesión sin cabeza implementado por Teslapy se rompiera. Si obtiene un ValueError: Credentials rejected. Recaptcha is required
y está utilizando credenciales correctas, entonces probablemente esté utilizando una versión anterior de este módulo.
A partir del 12 de enero de 2022, Tesla ha desaprobado el uso de tokens RFC 7523 y requiere que los tokens SSO se usen para el acceso a la API. Si obtiene una requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
este módulo.
A partir del 7 de enero de 2024, Tesla ha eliminado el punto final vehículo_list. Si obtiene una requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
de lo que probablemente esté usando una versión anterior de este módulo.
El repositorio de origen contiene tres aplicaciones de demostración que opcionalmente usan PywebView versión 3.0 o superior o selenio versión 3.13.0 o más para automatizar el weblogin. Se requiere selenio 4.0.0 o superior para el cromo de borde.
Cli.py es una aplicación CLI simple que puede usar casi toda la funcionalidad del módulo de Teslapy. La opción de filtro le permite seleccionar un producto si se vincula más de un producto a su cuenta. La salida de API está formateada por 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
Ejemplo de uso de cli.py:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
Menu.py es una aplicación de consola basada en menú que muestra los datos del vehículo en formato tabular. La aplicación depende de Geopy para convertir las coordenadas GPS en una dirección legible por humanos:
Gui.py es una interfaz gráfica de usuario que usa tkinter
. Las llamadas API se realizan de forma asincrónica utilizando subprocesos. La GUI admite la actualización automática de los datos del vehículo y muestra una imagen de vehículo compuesta. Tenga en cuenta que el vehículo no se va a dormir, si la actualización automática está habilitada. La aplicación depende de Geopy para convertir las coordenadas GPS en una dirección legible por humanos. Si la versión TCL/TK GUI Toolkit de su instalación de Python es inferior a 8.6, entonces se requiere almohada para mostrar la imagen del vehículo. Las preferencias del usuario, como qué navegador web usar para la autenticación, persisten al reiniciar la aplicación.
El historial de carga del vehículo también se puede mostrar en un gráfico.
Las aplicaciones de demostración se pueden contenedor utilizando DockerFile proporcionado. Se utiliza un volumen de enlace para almacenar cache.json y gui.ini en el directorio actual en la máquina host:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
Ejemplo de salida de get_vehicle_data()
o python cli.py -e [email protected] -w -g
a continuación:
{
"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 "
}
}
Ejemplo de salida de get_service_scheduling_data()
o python cli.py -e [email protected] --service
a continuación:
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
Ejemplo de salida de get_battery_data()
o python cli.py -e [email protected] -b
a continuación:
{
"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
}
Ejemplo de salida de get_site_data()
o python cli.py -e [email protected] -s
a continuación:
{
"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 está disponible en PYPI:
python -m pip install teslapy 'urllib3<2'
Asegúrese de tener Python 2.7+ o 3.5+ instalado en su sistema. Alternativamente, clone el repositorio a su máquina y ejecute la aplicación de demostración cli.py, menu.py o gui.py para comenzar, después de instalar las solicitudes_oauthlib 0.8.0+, Geopy 1.14.0+, Pywebview 3.0+ (opcional), Selenium 3.13 .0+ (opcional) y WebSocket-Client 0.59+ usando PIP de la siguiente manera:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
e instale ChromedRiver para usar Selenium o en Ubuntu de la siguiente manera:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket