Uma implementação do Python baseada na documentação não oficial da interface do lado do cliente à API do proprietário da Tesla Motors, que fornece funcionalidade para monitorar e controlar os produtos Tesla remotamente.
A API do proprietário parará de funcionar, pois os veículos começarem a exigir autenticação de comando de ponta a ponta usando o protocolo de comando do veículo Tesla. Os veículos modelo S e X pré-2021 não suportam esse novo protocolo e permanecem controláveis usando teslapes.
Este módulo depende de solicitações do Python, solicitações_oauthlib e websocket-client. Requer Python 3.10+ ao usar o URLLIB3 2.0, que vem com solicitações 2.30.0+, ou você pode fixar o urllib3 a 1.26.x instalando urllib3<2
.
A classe Tesla
estende requests_oauthlib.OAuth2Session
que estende requests.Session
e, portanto, herda métodos como get()
e post()
que podem ser usados para executar chamadas de API. Características do módulo:
O Teslapy 2.0.0+ não implementa mais a autenticação sem cabeça. O construtor difere e leva esses argumentos:
Argumento | Descrição |
---|---|
email | Identidade SSO |
verify | (Opcional) Verifique o certificado SSL |
proxy | (opcional) URL do servidor proxy |
retry | (Opcional) Número de tentativas de conexão ou instância Retry |
timeout | (Opcional) Conecte/Leia Timeout |
user_agent | (Opcional) A sequência de agente de usuário |
authenticator | (Opcional) Função com um argumento, o URL da autorização, que retorna o URL redirecionado |
cache_file | (opcional) caminho para o arquivo de cache usado por carregador e dumper padrão |
cache_loader | (opcional) função que retorna o ditado de cache |
cache_dumper | (Opcional) Funciona com um argumento, o ditado de cache |
sso_base_url | (Opcional) URL do serviço SSO, definido como https://auth.tesla.cn/ se seu email estiver registrado em outra região |
state | (opcional) State String para proteção de CSRF |
code_verifier | (opcional) string de verificador de código PKCE |
app_user_agent | (opcional) string x-tesla-user-agent |
O Teslapy 2.1.0+ não implementa mais o RFC 7523 e usa o token SSO para todas as solicitações da API.
A classe abrirá a página SSO da Tesla no navegador da Web padrão do sistema para autenticar. Após a autenticação bem -sucedida, uma página não encontrada será exibida e o URL deve começar com https://auth.tesla.com/void/callback
, que é o URL redirecionado. A classe usará stdio
para obter o URL redirecionado completo do navegador da web por padrão. Você precisa copiar e colar o URL completo do navegador da Web para o console para continuar os tokens de API em aquiramento. Você pode usar um método de autenticador flugable para automatizar isso, por exemplo, usando o PywebView ou o Selenium. Também é possível usar um token de atualização do SSO obtido por um aplicativo de autenticação de terceiros.
O método de conveniência api()
usa pontos de extremidade nomeados listados no endpoints.json para executar chamadas, para que o módulo não requer alterações se a API for atualizada. api()
substitui as variáveis do caminho no URI e chamadas fetch_token()
quando necessário. Qualquer mensagem de erro retornada pela API é aumentada como uma exceção HTTPError
. Além disso, a classe implementa os seguintes métodos:
Chamar | Descrição |
---|---|
request() | Executa a chamada da API usando URL relativo ou absoluto, serialização e manipulação de mensagens de erro |
new_code_verifier() | gera verificador de código para PKCE |
authorization_url() | Formulários URL de autorização com extensão PKCE e tenta detectar a região registrada de contas |
fetch_token() | Solicita um token SSO usando a concessão do código de autorização com extensão PKCE |
refresh_token() | Solicita um token SSO usando o Atual Token Grant |
close() | Remova todas as instâncias do adaptador de solicitações |
logout() | Remove o token do cache, retorna URL de logout e opcionalmente assina usando o navegador da web padrão do sistema |
vehicle_list() | Retorna uma lista de objetos de veículo |
battery_list() | Retorna uma lista de objetos de bateria |
solar_list() | Retorna uma lista de objetos solarpanel |
A classe Vehicle
estende os dados do veículo dict
and Store retornados pela API do proprietário, que é uma API de tração. Os chamadas get_vehicle_summary()
e get_vehicle_data()
atualizam a instância Vehicle
, mesclando dados. A API de streaming empurra os dados do veículo na mudança após a assinatura. O método stream()
pega um argumento opcional, uma função de retorno de chamada que é chamada com um argumento, um dicto mantendo os dados alterados. O objeto Vehicle
é sempre atualizado com os dados pressionados. Se não houver alterações em 10 segundos, o veículo para de transmitir dados. O método stream()
possui mais dois argumentos opcionais para controlar a reinicialização. Além disso, a classe implementa os seguintes métodos:
Chamar | On-line | Descrição |
---|---|---|
api() | Sim | Executa uma chamada de API para o endpoint nomeado que exige veículo_id com argumentos opcionais |
get_vehicle_summary() | Não | Obtém o estado do veículo (online, dormindo, offline) |
available() | Não | Verifica se o veículo está online com base em dados em cache ou status atualizado quando envelhecido |
sync_wake_up() | Não | acorda e espera que o veículo fique online |
decode_option() | Não | Código da opção de pesquisa Descrição (Leia de option_codes.json ) |
option_code_list() 1 | Não | lista as descrições conhecidas dos códigos de opção do veículo |
get_vehicle_data() | Sim | Obtenha dados do veículo para pontos de extremidade selecionados, padrões para todos os pontos de extremidade |
get_vehicle_location_data() | Sim | obtém os dados básicos e de localização para o veículo |
get_nearby_charging_sites() | Sim | Lista as estações de carregamento operadas por Tesla nas proximidades |
get_service_scheduling_data() | Não | Recupera a próxima consulta de serviço para este veículo |
get_charge_history() 2 | Não | Lista pontos de dados do histórico de carregamento do veículo |
mobile_enabled() | Sim | Verifica se a configuração de acesso móvel está ativada no carro |
compose_image() 3 | Não | Compõe uma imagem de veículo com base nos códigos de opção do veículo |
dist_units() | Não | converte a distância ou as unidades de velocidade em configuração da GUI do veículo |
temp_units() | Não | converte unidades de temperatura em configuração da GUI do veículo |
gui_time() | Não | Retorna o registro de data e hora ou o tempo atual formatado para a configuração da GUI |
last_seen() | Não | Retorna o veículo visto pela última vez no tempo natural |
decode_vin() | Não | decodifica o número de identificação do veículo para um ditado |
command() | Sim | Wrapper em torno api() para manuseio de erros de resposta ao comando do veículo |
1 Códigos de opção parecem estar depreciados.
2 Software de carro versão 2021.44.25 ou superior, o compartilhamento de dados deve ser ativado e você deve ser o proprietário do veículo principal.
3 Passe os códigos de opção do veículo para este método agora os códigos de opções são preteridos.
Somente métodos sem nenhum na coluna on -line estão disponíveis quando o veículo está dormindo ou offline. Esses métodos não impedirão que seu veículo dormisse. Outros métodos e chamadas de API exigem que o veículo seja trazido on -line usando sync_wake_up()
e pode impedir que seu veículo dormisse se chamado em um período muito curto.
A classe Product
estende dict
e é inicializada com dados do produto de paredes de powerwalls e painéis solares retornados pela API. Além disso, a classe implementa os seguintes métodos:
Chamar | Descrição |
---|---|
api() | Executa uma chamada de API para o endpoint nomeado que exige bateria_id ou site_id com argumentos opcionais |
get_history_data() | Recuperar o status ao vivo do produto |
get_calendar_history_data() | Recuperar o status ao vivo do produto |
command() | Wrapper em torno api() para manuseio de erros de resposta ao comando da bateria |
A classe Battery
estende Product
e armazena os dados do PowerWall retornados pela API, atualizados por get_battery_data()
. Além disso, a classe implementa os seguintes métodos:
Chamar | Descrição |
---|---|
get_battery_data() | Recuperar o estado detalhado e a configuração da bateria |
set_operation() | Defina a operação da bateria como auto_consumor, backup ou autônomo |
set_backup_reserve_percent() | Defina a porcentagem de reserva de backup mínima para essa bateria |
set_import_export() | Define as configurações de importação e exportação da grade da bateria |
get_tariff() | Obtenha os dados da taxa tarifária |
set_tariff() | Defina os dados da taxa tarifária. Os dados podem ser criados manualmente, ou gerados por create_tariff |
create_tariff() | Cria um dicionário de dados tarifários formatados corretamente |
A classe SolarPanel
estende os dados do painel solar Product
e armazena retornados pela API, atualizados por get_site_data()
. Além disso, a classe implementa os seguintes métodos:
Chamar | Descrição |
---|---|
get_site_data() | Recuperar dados atuais de geração do site |
Uso básico do 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' ])
O Teslapy 2.4.0 e 2.5.0 chama automaticamente get_vehicle_data()
e teslapy 2.6.0+ chama automaticamente get_latest_vehicle_data()
quando uma chave não é encontrada. Este exemplo 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' )
Exemplo de saída:
Tim's Tesla last seen 6 hours ago at 87% SoC
A classe Tesla
implementa um método de autenticação travável. Se você deseja implementar seu próprio método para lidar com a página SSO e recuperar o URL redirecionado após a autenticação, pode passar uma função como um argumento para o construtor, que toma o URL de autenticação como um argumento e retorna o URL redirecionado. O argumento authenticator
também é acessível como atributo.
Exemplo usando um componente WebView que exibe a página SSO em sua própria janela nativa da GUI.
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 ()
Exemplo usando o selênio para automatizar a interação do navegador da Web. A página do SSO retorna um 403 quando navigator.webdriver
está definido e atualmente apenas o Chrome, Opera e Edge Chromium podem impedir isso.
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 ()
O Teslapy 2.2.0 introduziu o método authorization_url()
para obter o URL da página SSO e a opção de fornecer o URL redirecionado como palavra -chave authorization_response
para fetch_token()
após a autenticação.
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 ()
O suporte à autorização encenada foi adicionado ao Teslapy 2.5.0. O state
dos argumentos da palavra -chave e code_verifier
são aceitos pelo construtor da classe Tesla
, pelo método authorization_url()
e o 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 ()
A Teslapy 2.4.0+ suporta o uso de um token de atualização obtido por aplicativos de autenticação de terceiros. O token de atualização é usado para obter um token de acesso e ambos são armazenados em cache para persistência; portanto, você só precisa fornecer o token de atualização apenas uma 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 o navegador da web padrão do seu sistema para assinar a página SSO e limpar o token do cache:
tesla . logout ( sign_out = True )
Se estiver usando o PywebView, você pode limpar o token do cache e obter o URL de logout para exibir uma janela de sinal:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
O selênio não armazena cookies, apenas limpe o token do cache:
tesla . logout ()
A classe Tesla
implementa um método de cache travesso. Se você não deseja usar o cache de disco padrão, pode passar uma função para carregar e retornar o ditado do cache e uma função que toma um ditado como um argumento para despejar o ditado do cache, como argumentos para o construtor. Os argumentos cache_loader
e cache_dumper
também são acessíveis 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 ()
As pontuações de segurança são obtidas por outra API. A Teslapy 2.1.0 introduziu suporte absoluto de URL para acessar pontos de extremidade da API não proprietária.
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' }))
A Teslapy usa um tempo de conexão ajustável e leitura de 10 segundos por padrão. Consulte a seção Timeouts para obter mais detalhes. A teslapia não repetiu as conexões falhadas ou cronometradas por padrão, que podem ser ativadas com o parâmetro retry
.
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
Um programa robusto que contabiliza as falhas da rede possui uma estratégia de tentativa, que inclui o número total de tentativas de nova tentativa de fazer, os códigos de resposta HTTP para tentar novamente e opcionalmente um fator de retirada. Consulte o módulo de nova tentativa para obter mais detalhes.
Esteja ciente de que a Tesla pode bloquear temporariamente sua conta se você estiver muito martelando os 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
A linha após o gerenciador de contexto aumentará uma exceção ao usar o Teslapy 2.5.0+ porque fecha explicitamente o manipulador de conexão de solicitações quando o gerenciador de contexto sair. As versões anteriores não aumentariam uma exceção e as tentativas não funcionariam.
Dê uma olhada no cli.py, menu.py ou gui.py para obter mais exemplos de código.
Estes são os principais comandos:
Endpoint | Parâmetros | Valor |
---|---|---|
Desbloquear | ||
TRANCAR | ||
Honk_horn | ||
Flash_lights | ||
Climate_on | ||
Climate_off | ||
Max_defrost | on | true ou false |
Change_climate_temperature_setting | driver_temp , passenger_temp | Temperatura em Celcius |
Set_climate_keeper_mode | climate_keeper_mode | 0 = desligado, 1 = on, 2 = cachorro, 3 = acampamento |
Hvac_bioweapon_mode | on | true ou false |
Programado_departe 1 | enable , departure_time , preconditioning_enabled , preconditioning_weekdays_only , off_peak_charging_enabled , off_peak_charging_weekdays_only , end_off_peak_time | true ou false , minutos depois da meia -noite |
Programado_charging 1 | enable time | true ou false , minutos depois da meia -noite |
Charging_amps 1 | charging_amps | entre 0-32 |
Set_cabin_overheat_protection | on , fan_only | true ou false |
Change_charge_limit | percent | percentagem |
Set_vehicle_name | vehicle_name | nome |
Change_sunroof_state | state | vent ou close |
Window_control 2 | command , lat , lon | vent ou close , 0 , 0 |
Actate_trunk | which_trunk | rear ou front |
Remote_start | ||
Trigger_homelink | lat , lon | Lattura e logitude atuais |
Charge_port_door_open | ||
Charge_port_door_close | ||
Start_charge | ||
Stop_Charge | ||
Set_cop_temp | temp | Temperatura em 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 ou false , 4 dígitos pino |
Reset_valet_pin | ||
Speed_limit_activate | pin | Pino de 4 dígitos |
Speed_limit_deactivate | pin | Pino de 4 dígitos |
Speed_limit_set_limit | limit_mph | entre 50-90 |
Speed_limit_clear_pin | pin | Pino de 4 dígitos |
Schedule_software_update | offset_sec | segundos |
Cancel_software_update | ||
Set_sentry_mode | on | true ou false |
REMOTE_SEAT_HEATR_REQUEST | heater , level | assento 0-5, nível 0-3 |
REMOTE_AUTO_SEAT_CLIMA_REQUEST | auto_seat_position , auto_climate_on | 1-2, true ou false |
REMOTE_SEAT_COOLING_REQUEST | seat_position , seat_cooler_level | |
Remote_steering_wheel_heater_request | on | true ou false |
1 Requer versão do carro 2021.36 ou superior. A definição de charging_amps
para 2 ou 3 resulta em 3A e a configuração para 0 ou 1 resulta em 2A.
2 close
requer que os valores lat
e lon
estejam próximos da localização atual do carro.
Manipulação básica de exceção:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
Todos requests.exceptions
e oauthlib.oauth2.rfc6749.errors
Classes são importadas pelo módulo. Quando o veículo está dormindo ou offline e o veículo precisa estar online para que o terminal da API seja executado, a seguinte exceção é levantada: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
. A exceção pode ser capturada como teslapy.HTTPError
.
Além disso, sync_wake_up()
levanta teslapy.VehicleError
quando o veículo não fica on -line dentro do tempo limite especificado. E command()
também levanta teslapy.VehicleError
False
Por exemplo, se um dos pontos de extremidade da mídia for chamado e não houver um usuário presente no veículo, a seguinte exceção será aumentada: VehicleError: user_not_present
.
Em 29 de janeiro de 2021, a Tesla atualizou esse endpoint para seguir a RFC 7523 e requer o uso do serviço SSO (auth.tesla.com) para autenticação. Se você obtiver um requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
então provavelmente está usando uma versão antiga deste módulo.
Em 3 de setembro de 2021, a Tesla adicionou recaptcha ao formulário de login. Isso fez com que o login sem cabeça implementado pela Teslapy quebrasse. Se você receber um ValueError: Credentials rejected. Recaptcha is required
e você está usando credenciais corretas, provavelmente está usando uma versão antiga deste módulo.
Em 12 de janeiro de 2022, a Tesla depreciou o uso de tokens RFC 7523 e exige que os tokens SSO sejam usados para acesso à API. Se você receber um requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
e você está usando credenciais corretas, provavelmente está usando uma versão antiga de este módulo.
Em 7 de janeiro de 2024, a Tesla removeu o ponto final do veículo_list. Se você receber um requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
, então você provavelmente está usando uma versão antiga deste módulo.
O repositório de origem contém três aplicativos de demonstração que opcionalmente usam o PywebView versão 3.0 ou superior ou selênio versão 3.13.0 ou superior para automatizar o WebLogin. O selênio 4.0.0 ou superior é necessário para o cromo de borda.
O CLI.PY é um aplicativo CLI simples que pode usar quase toda a funcionalidade do módulo teslapy. A opção de filtro permite selecionar um produto se mais de um produto estiver vinculado à sua conta. A saída da API é formatada 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
Exemplo de uso de cli.py:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
MENU.PY é um aplicativo de console baseado em menu que exibe dados do veículo em um formato tabular. O aplicativo depende da geopy para converter coordenadas de GPS em um endereço legível humano:
O GUI.PY é uma interface gráfica do usuário usando tkinter
. As chamadas de API são executadas de forma assíncrona usando o Threading. A GUI suporta refrescamento automático dos dados do veículo e exibe uma imagem de veículo composta. Observe que o veículo não vai dormir, se a atualização automática estiver ativada. O aplicativo depende da geopy para converter coordenadas de GPS em um endereço legível humano. Se a versão TCL/TK GUI Toolkit da instalação do Python for menor que 8.6, o travesseiro será necessário para exibir a imagem do veículo. Preferências do usuário, como qual navegador da Web usar para autenticação, persiste após o reinício do aplicativo.
O histórico de carregamento do veículo também pode ser exibido em um gráfico.
Os aplicativos de demonstração podem ser contêineidos usando o Dockerfile fornecido. Um volume de ligação é usado para armazenar cache.json e gui.ini no diretório atual na máquina host:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
Exemplo de saída de get_vehicle_data()
ou python cli.py -e [email protected] -w -g
abaixo:
{
"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 "
}
}
Exemplo de saída de get_service_scheduling_data()
ou python cli.py -e [email protected] --service
abaixo:
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
Exemplo de saída de get_battery_data()
ou python cli.py -e [email protected] -b
abaixo:
{
"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
}
Exemplo de saída de get_site_data()
ou python cli.py -e [email protected] -s
abaixo:
{
"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
}
A teslapia está disponível no Pypi:
python -m pip install teslapy 'urllib3<2'
Certifique -se de ter o Python 2.7+ ou 3.5+ instalado no seu sistema. Como alternativa, clone o repositório da sua máquina e execute o aplicativo de demonstração cli.py, menu.py ou gui.py para começar, depois de instalar requests_oauthlib 0.8.0+, geopy 1.14.0+, pywebview 3.0+ (opcional), selenium 3.13 .0+ (opcional) e websocket-client 0,59+ usando o PIP da seguinte forma:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
e instale o Chromedriver para usar o selênio ou no Ubuntu da seguinte maneira:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket