基于Tesla Motors所有者API的客户端接口的非官方文档的Python实现,该文档提供了远程监视和控制Tesla产品的功能。
所有者API将停止使用Tesla车辆命令协议的车辆开始需要端到端命令身份验证。 2021年以前的S型和X车辆不支持该新协议,并使用Teslapy可以控制。
该模块取决于Python请求,requests_oauthlib和websocket-client。使用Urllib3 2.0时,它需要Python 3.10+,该请求随附2.30.0+,也可以通过安装urllib3<2
将Urllib3固定在1.26.x。
Tesla
类扩展了requests_oauthlib.OAuth2Session
,该sessess扩展了requests.Session
。因此继承了可用于执行API调用的方法,例如get()
和post()
。模块特征:
TESLAPY 2.0.0+不再实施无头认证。构造函数有所不同,并采用了这些论点:
争论 | 描述 |
---|---|
email | SSO身份 |
verify | (可选)验证SSL证书 |
proxy | (可选)代理服务器的URL |
retry | (可选)连接重试或Retry 实例的数量 |
timeout | (可选)连接/读取超时 |
user_agent | (可选)用户代理字符串 |
authenticator | (可选的)函数使用一个参数,即授权URL返回重定向的URL |
cache_file | (可选的)默认加载程序和Dumper使用的缓存文件的路径 |
cache_loader | (可选)返回缓存dict的功能 |
cache_dumper | (可选)一个参数,缓存dict的函数 |
sso_base_url | (可选) https://auth.tesla.cn/ 服务的URL,如果您的电子邮件在另一个区域注册 |
state | (可选)CSRF保护状态字符串 |
code_verifier | (可选)PKCE代码验证者字符串 |
app_user_agent | (可选)X-Tesla-user-Agent String |
TESLAPY 2.1.0+不再实现RFC 7523,并且使用SSO令牌来满足所有API请求。
该类将在系统的默认Web浏览器中打开Tesla的SSO页面以进行身份验证。成功身份验证后,将显示一个未找到的页面,URL应从https://auth.tesla.com/void/callback
开始,这是重定向的URL。该类将使用stdio
默认情况下从Web浏览器中获取完整的重定向URL。您需要将完整的URL从Web浏览器复制并粘贴到控制台,以继续播放API令牌。您可以使用可插入的身份验证方法来自动化此功能,例如使用Pywebview或Selenium。也可以使用第三方身份验证应用程序获得的SSO刷新令牌。
便利方法api()
使用端点中列出的命名端点。 api()
替换URI中的路径变量,并在需要时调用fetch_token()
。 API返回的任何错误消息都作为HTTPError
异常提出。此外,该类实现以下方法:
称呼 | 描述 |
---|---|
request() | 使用相对或绝对URL,序列化和错误消息处理执行API调用 |
new_code_verifier() | 生成PKCE的代码验证程序 |
authorization_url() | 带有PKCE扩展名的表单授权URL,并试图检测注册的帐户 |
fetch_token() | 使用PKCE扩展名请求使用授权代码授予的SSO令牌 |
refresh_token() | 请求使用刷新令牌赠款的SSO令牌 |
close() | 删除所有请求适配器实例 |
logout() | 从缓存中删除令牌,返回注销URL并使用System的默认Web浏览器登录 |
vehicle_list() | 返回车辆对象列表 |
battery_list() | 返回电池对象列表 |
solar_list() | 返回Solarpanel对象的列表 |
Vehicle
类扩展了dict
,并存储由所有者API返回的车辆数据,该数据是拉动API。 get_vehicle_summary()
和get_vehicle_data()
调用更新Vehicle
实例,合并数据。流媒体API在订阅后将车辆数据推动。 stream()
方法采用可选参数,一个带有一个参数调用的回调函数,一个持有更改的数据的dict。 Vehicle
对象始终使用推送数据更新。如果在10秒内没有更改,则车辆停止流媒体数据。 stream()
方法还有两个可选的参数可以控制重新启动。此外,该类实现以下方法:
称呼 | 在线的 | 描述 |
---|---|---|
api() | 是的 | 执行对命名端点的API调用,需要使用可选参数 |
get_vehicle_summary() | 不 | 获取车辆状态(在线,入睡,离线) |
available() | 不 | 检查车辆在衰老时是否基于缓存的数据或刷新状态进行检查 |
sync_wake_up() | 不 | 醒来,等待车辆上网 |
decode_option() | 不 | 查找选项代码描述(从option_codes.json读取) |
option_code_list() 1 | 不 | 列出了车辆选项代码的已知描述 |
get_vehicle_data() | 是的 | 获取选定端点的车辆数据,默认为所有端点 |
get_vehicle_location_data() | 是的 | 获取车辆的基本和位置数据 |
get_nearby_charging_sites() | 是的 | 列表特斯拉经营的充电站附近 |
get_service_scheduling_data() | 不 | 检索该车辆的下一个服务约会 |
get_charge_history() 2 | 不 | 列出车辆充电历史数据点 |
mobile_enabled() | 是的 | 检查在汽车中是否启用了移动访问设置 |
compose_image() 3 | 不 | 根据车辆期权代码组成车辆图像 |
dist_units() | 不 | 将距离或速度单元转换为车辆的GUI设置 |
temp_units() | 不 | 将温度单位转换为车辆的GUI设置 |
gui_time() | 不 | 返回时间戳或格式为GUI设置的当前时间 |
last_seen() | 不 | 返回车辆最后一次自然时间 |
decode_vin() | 不 | 将车辆识别号解码为dict |
command() | 是的 | 围绕api() 包装器,用于车辆命令响应错误处理 |
1个选项代码似乎被弃用。
2 CAR软件版本2021.44.25或更高要求,必须启用数据共享,并且必须是主要车主。
3将车辆选项代码传递给此方法现在,将选项代码弃用。
当车辆入睡或离线时,只有在线列中没有没有的方法。这些方法不会阻止您的车辆睡觉。其他方法和API呼叫要求使用sync_wake_up()
在线上进行车辆,并且如果在太短的一段时间内被调用,则可以防止车辆睡觉。
Product
类扩展了dict
,并使用API返回的PowerWalls和太阳能电池板的产品数据初始化。此外,该类实现以下方法:
称呼 | 描述 |
---|---|
api() | 执行对需要电池_ID或SITE_ID的命名端点的API调用,并具有可选参数 |
get_history_data() | 检索产品的现场状态 |
get_calendar_history_data() | 检索产品的现场状态 |
command() | 电池命令响应错误处理围绕api() 包装器 |
Battery
类扩展Product
,并存储由API返回的PowerWall数据,由get_battery_data()
更新。此外,该类实现以下方法:
称呼 | 描述 |
---|---|
get_battery_data() | 检索电池的详细状态和配置 |
set_operation() | 将电池操作设置为self_cosmapting,备份或自动 |
set_backup_reserve_percent() | 设置该电池的最低备份储备百分比 |
set_import_export() | 设置电池电网导入和导出设置 |
get_tariff() | 获取关税率数据 |
set_tariff() | 设置关税数据。数据可以手动创建或由Create_tariff生成 |
create_tariff() | 创建正确格式的关税数据字典 |
SolarPanel
类扩展Product
,并存储由API返回的太阳能电池板数据,由get_site_data()
更新。此外,该类实现以下方法:
称呼 | 描述 |
---|---|
get_site_data() | 检索当前的现场生成数据 |
模块的基本用法:
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和2.5.0自动调用get_vehicle_data()
和Teslapy 2.6.0+在找不到键时自动调用get_latest_vehicle_data()
。此示例适用于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' )
示例输出:
Tim's Tesla last seen 6 hours ago at 87% SoC
Tesla
类实施了一种可插入的身份验证方法。如果要实现自己的方法来处理SSO页面并在身份验证后检索重定向的URL,则可以将函数作为参数传递给构造函数,该函数将身份验证URL作为参数并返回重定向的URL。 authenticator
参数也可以作为属性访问。
示例使用WebView组件在其自己的本机GUI窗口中显示SSO页面。
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 ()
示例使用硒来自动化Web浏览器交互。设置navigator.webdriver
时,SSO页面将返回403,目前只有Chrome,Opera和Edge Chromium可以防止这种情况。
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引入了authorization_url()
方法,以获取SSO页面URL,并在身份验证后将重定向URL作为关键字参数authorization_response
提供给fetch_token()
的选项。
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 ()
对分阶段授权的支持已添加到Teslapy 2.5.0中。 Tesla
类构造函数, authorization_url()
方法和fetch_token()
方法接受了关键字参数state
和code_verifier
。
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+支持使用第三方身份验证应用程序获得的刷新令牌。刷新令牌用于获得访问令牌,并且两者都经过持久性,因此您只需要仅提供一次刷新令牌即可。
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 ])
要使用系统的默认Web浏览器登录SSO页面并清除CACHE的令牌:
tesla . logout ( sign_out = True )
如果使用pywebview,则可以从缓存中清除令牌,并获取注销URL以显示一个签名窗口:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
硒不存储cookie,只需清除cache的令牌:
tesla . logout ()
Tesla
类实现了可插的缓存方法。如果您不想使用默认磁盘缓存,则可以传递函数以加载和返回缓存dict,以及将dict作为参数丢弃缓存dict的函数,作为对构造函数的参数。 cache_loader
和cache_dumper
参数也可以作为属性访问。
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 ()
安全得分是通过另一个API获得的。 Teslapy 2.1.0引入了绝对URL支持,以访问非所有者API端点。
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默认情况下使用可调节的连接和读取10秒的超时。有关更多详细信息,请参阅超时部分。默认情况下,Teslapy不会重试连接失败或定时连接,可以通过retry
参数启用。
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
对网络失败的强大程序会计,具有重试策略,其中包括重试尝试的总数,HTTP响应代码重试的代码以及可选的退缩因素。有关更多详细信息,请参阅重试模块。
请注意,如果您过多地敲击服务器,则特斯拉可能会暂时阻止您的帐户。
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
上下文管理器使用Teslapy 2.5.0+时,上下文管理器之后的行将引起异常,因为它在上下文管理器退出时明确关闭了请求连接处理程序。较早的版本不会引起例外,并且检索将不起作用。
查看cli.py,menu.py或gui.py的更多代码示例。
这些是主要命令:
端点 | 参数 | 价值 |
---|---|---|
开锁 | ||
锁 | ||
Honk_horn | ||
flash_lights | ||
climate_on | ||
climate_off | ||
max_defrost | on | true 还是false |
change_climate_temperature_setting | driver_temp , passenger_temp | Celcius的温度 |
set_climate_keeper_mode | climate_keeper_mode | 0 = off,1 = on,2 =狗,3 =营地 |
HVAC_BIOWEAPON_MODE | on | true 还是false |
计划_departure 1 | enable , departure_time , preconditioning_enabled , preconditioning_weekdays_only , off_peak_charging_enabled , off_peak_charging_weekdays_only , end_off_peak_time | true ,或false ,午夜后几分钟 |
计划_Charging 1 | enable , time | true ,或false ,午夜后几分钟 |
charging_amp 1 | charging_amps | 在0-32之间 |
set_cabin_overheat_protection | on , fan_only | true 还是false |
change_charge_limit | percent | 百分比 |
set_vehicle_name | vehicle_name | 姓名 |
change_sunroof_state | state | vent 或close |
window_control 2 | command , lat , lon | vent 或close 0 0 |
Actuate_trunk | which_trunk | rear 或front |
远程_start | ||
trigger_homelink | lat , lon | 当前的频率和逻辑 |
chard_port_door_open | ||
chard_port_door_close | ||
start_charge | ||
stop_charge | ||
set_cop_temp | temp | 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 或false ,4位数别针 |
reset_valet_pin | ||
speed_limit_activate | pin | 4位数销 |
speed_limit_deactivate | pin | 4位数销 |
speed_limit_set_limit | limit_mph | 在50-90之间 |
speed_limit_clear_pin | pin | 4位数销 |
Schedue_software_update | offset_sec | 秒 |
cancel_software_update | ||
set_sentry_mode | on | true 还是false |
远程_seat_heater_request | heater , level | 座位0-5,级别0-3 |
远程_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true 还是false |
远程_seat_cooling_request | seat_position , seat_cooler_level | |
远程_STEERIN_WHEEL_HEATER_REQUEST | on | true 还是false |
1需要汽车版本2021.36或更高。将charging_amps
设置为2或3个结果,结果为3A,并设置为0或1的结果2a。
2 close
需要lat
和lon
值接近汽车的当前位置。
基本异常处理:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
所有requests.exceptions
oauthlib.oauth2.rfc6749.errors
当车辆入睡或离线时,要执行API端点时,车辆需要在线上进行在线时,请提高以下例外: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
。例外可以被视为teslapy.HTTPError
。
此外, sync_wake_up()
提出了teslapy.VehicleError
,当车辆在指定的超时内未在线时。和command()
也会False
teslapy.VehicleError
。例如,如果调用了媒体端点之一,并且车辆中没有用户,则提出以下例外: VehicleError: user_not_present
。
截至2021年1月29日,特斯拉更新了此端点以遵循RFC 7523,并需要使用SSO服务(auth.tesla.com)进行身份验证。如果您获得了requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
。
截至2021年9月3日,特斯拉已向登录表添加了recaptcha。这导致Teslapy实施的无头登录破裂。如果您得到一个ValueError: Credentials rejected. Recaptcha is required
,并且您使用的是正确的凭据,然后您可能正在使用此模块的旧版本。
截至2022年1月12日,特斯拉已经弃用了RFC 7523令牌的使用,并要求SSO令牌用于API访问。如果您收到requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
,您使用的是正确的凭据,那么您可能正在使用旧版本的旧版本这个模块。
截至2024年1月7日,特斯拉已删除了车辆列表端点。如果您获得了requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
然后您可能正在使用此模块的旧版本。
源存储库包含三个演示应用程序,可选地使用Pywebview版本3.0或更高版本或硒版3.13.0或更高版本以自动化Weblogin。边缘铬所需的硒4.0.0或更高。
CLI.PY是一个简单的CLI应用程序,可以使用Teslapy模块的几乎所有功能。过滤器选项允许您选择一个产品,如果多个产品链接到您的帐户。 API输出是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
cli.py的用法:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
菜单。Py是一个基于菜单的控制台应用程序,该应用程序以表格格式显示车辆数据。该应用程序取决于将GPS坐标转换为人类可读地址的地址:
GUI.PY是使用tkinter
图形用户界面。 API调用使用线程异步执行。 GUI支持自动刷新车辆数据并显示组合的车辆图像。请注意,如果启用了自动刷新,车辆将不会入睡。该应用程序取决于地理的将GPS坐标转换为人类可读地址。如果您的Python安装的TCL/TK GUI工具包低于8.6,则需要枕头才能显示车辆图像。用户首选项(例如要用于身份验证的哪个Web浏览器)在应用程序重新启动时会持续存在。
车辆充电历史记录也可以显示在图中。
演示应用程序可以使用提供的Dockerfile进行集装。绑定量用于将CACH.JSON和GUI.INI存储在主机机器上的当前目录中:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
get_vehicle_data()
或python cli.py -e [email protected] -w -g
下面的示例输出:
{
"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 "
}
}
get_service_scheduling_data()
或python cli.py -e [email protected] --service
的示例输出
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
示例输出get_battery_data()
或python cli.py -e [email protected] -b
下面:
{
"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
}
示例输出get_site_data()
或python cli.py -e [email protected] -s
下面:
{
"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在PYPI上可用:
python -m pip install teslapy 'urllib3<2'
确保系统上安装了Python 2.7+或3.5+。或者,将存储库克隆到您的机器上并运行演示应用程序cli.py,菜单。 .0+(可选)和websocket-client 0.59+使用PIP如下:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
并安装Chromedriver以使用硒或在Ubuntu上,如下所示:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket