Tesla Motors 소유자 API에 대한 클라이언트 측 인터페이스의 비공식 문서를 기반으로 한 Python 구현은 Tesla 제품을 원격으로 모니터링하고 제어하는 기능을 제공합니다.
소유자 API는 Tesla 차량 명령 프로토콜을 사용하여 차량이 엔드 투 엔드 명령 인증을 요구하기 시작함에 따라 작동을 중단합니다. 2021 년 이전 모델 S 및 X 차량은이 새로운 프로토콜을 지원하지 않으며 테슬레이를 사용하여 제어 할 수 있습니다.
이 모듈은 Python 요청, requests_oauthlib 및 webSocket-client에 따라 다릅니다. urllib3 2.0을 사용할 때는 Python 3.10+가 필요합니다. 2.30.0+ 요청이 포함되어 있거나 urllib3<2
설치하여 urllib3를 1.26.x로 고정 할 수 있습니다.
Tesla
클래스는 requests_oauthlib.OAuth2Session
확장하여 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 | (선택 사항) 기본 로더 및 덤퍼가 사용하는 캐시 파일로가는 경로 |
cache_loader | (선택 사항) 캐시 dict를 반환하는 함수 |
cache_dumper | (선택 사항) 하나의 인수, 캐시 dict가있는 기능 |
sso_base_url | (선택 사항) SSO Service의 URL, https://auth.tesla.cn/ 로 설정된 이메일이 다른 지역에 등록 된 경우 |
state | (선택 사항) CSRF 보호를위한 상태 문자열 |
code_verifier | (선택 사항) PKCE 코드 검증 자 문자열 |
app_user_agent | (선택 사항) x-tesla-user-agent 문자열 |
Teslapy 2.1.0+는 더 이상 RFC 7523을 구현하지 않고 모든 API 요청에 SSO 토큰을 사용합니다.
클래스는 시스템의 기본 웹 브라우저에서 Tesla의 SSO 페이지를 열어 인증을합니다. 성공적인 인증 후에는 찾을 수없는 페이지가 표시되고 URL은 https://auth.tesla.com/void/callback
으로 시작해야합니다. 이는 리디렉션 된 URL입니다. 클래스는 stdio
사용하여 기본적으로 웹 브라우저에서 전체 리디렉션 된 URL을 얻습니다. API 토큰을 계속해서 계속해서 웹 브라우저에서 콘솔로 전체 URL을 복사하여 붙여 넣어야합니다. 플러그 가능한 인증기 방법을 사용하여 Pywebview 또는 Selenium을 사용하여이를 자동화 할 수 있습니다. 제 3 자 인증 앱에서 얻은 SSO 새로 고침 토큰을 사용할 수도 있습니다.
편의 메소드 api()
endPoints.json 에 나열된 이름의 엔드 포인트를 사용하여 호출을 수행하므로 API가 업데이트되면 모듈이 변경되지 않아야합니다. api()
URI에서 경로 변수를 대체하고 필요할 때 fetch_token()
호출합니다. API에 의해 반환 된 오류 메시지는 HTTPError
예외로 제기됩니다. 또한 클래스는 다음 방법을 구현합니다.
부르다 | 설명 |
---|---|
request() | 상대 또는 절대 URL, 직렬화 및 오류 메시지 처리를 사용하여 API 호출을 수행합니다. |
new_code_verifier() | PKCE 용 코드 검증자를 생성합니다 |
authorization_url() | PKCE 확장 기능을 갖춘 양식 승인 URL 및 등록 된 계정을 감지하려고합니다. |
fetch_token() | PKCE Extension과 함께 권한 부여 코드 보조금을 사용하여 SSO 토큰을 요청합니다. |
refresh_token() | 새로 고침 토큰 보조금을 사용하여 SSO 토큰을 요청합니다 |
close() | 모든 요청 어댑터 인스턴스를 제거합니다 |
logout() | 캐시에서 토큰을 제거하고 로그 아웃 URL을 반환하고 시스템의 기본 웹 브라우저를 사용하여 선택적으로 서명합니다. |
vehicle_list() | 차량 객체 목록을 반환합니다 |
battery_list() | 배터리 객체 목록을 반환합니다 |
solar_list() | Solarpanel 객체 목록을 반환합니다 |
Vehicle
클래스는 dict
확장하고 소유자 API가 반환 한 차량 데이터를 PULL API입니다. get_vehicle_summary()
및 get_vehicle_data()
호출은 Vehicle
인스턴스를 업데이트하고 데이터를 병합합니다. 스트리밍 API는 구독 후 차량 데이터를 중독합니다. stream()
메소드는 선택적 인수, 하나의 인수로 호출되는 콜백 함수, 변경된 데이터를 보유하는 덕트를 취합니다. Vehicle
객체는 항상 푸시 된 데이터로 업데이트됩니다. 10 초 이내에 변경 사항이 없으면 차량은 스트리밍을 중지합니다. stream()
메소드에는 재시작을 제어하기위한 두 가지 선택 인수가 있습니다. 또한 클래스는 다음 방법을 구현합니다.
부르다 | 온라인 | 설명 |
---|---|---|
api() | 예 | 옵션 인수와 함께 Vehicle_id를 요구하는 명명 된 Endpoint에 API 호출을 수행합니다. |
get_vehicle_summary() | 아니요 | 차량의 상태를 얻습니다 (온라인, 잠들기, 오프라인) |
available() | 아니요 | 차량이 캐시 된 데이터를 기준으로 온라인 상태인지 확인하거나 노화 된 경우 새로 고침 상태를 확인합니다. |
sync_wake_up() | 아니요 | 일어나서 차량이 온라인으로 올 때까지 기다립니다. |
decode_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 자동차 소프트웨어 버전 2021.44.25 이상 필수, 데이터 공유를 활성화해야하며 기본 차량 소유자 여야합니다.
3 전 패스 차량 옵션 코드이 방법으로 옵션 코드는 더 이상 사용되지 않습니다.
차량이 잠 들어 있거나 오프라인 상태 일 때 온라인 칼럼에 없는 방법 만 사용할 수 있습니다. 이 방법은 차량의 수면을 방해하지 않습니다. 다른 방법과 API 호출은 sync_wake_up()
사용하여 차량을 온라인으로 가져와야하며 너무 짧은 기간 내에 호출되면 차량이 수면을 방지 할 수 있습니다.
Product
클래스는 dict
확장하고 API에 의해 반환 된 Powerwall 및 태양 전지판의 제품 데이터로 초기화됩니다. 또한 클래스는 다음 방법을 구현합니다.
부르다 | 설명 |
---|---|
api() | 옵션 인수와 함께 배터리 _id 또는 site_id를 요구하는 이름의 endpoint에 API 호출을 수행합니다. |
get_history_data() | 제품의 라이브 상태를 검색합니다 |
get_calendar_history_data() | 제품의 라이브 상태를 검색합니다 |
command() | 배터리 명령 응답 오류 처리의 경우 api() 주변의 래퍼 |
Battery
클래스는 Product
확장하고 API가 반환 한 파워 월 데이터를 get_battery_data()
로 업데이트합니다. 또한 클래스는 다음 방법을 구현합니다.
부르다 | 설명 |
---|---|
get_battery_data() | 배터리의 자세한 상태 및 구성을 검색하십시오 |
set_operation() | 배터리 작동을 self_consumption, 백업 또는 자율로 설정하십시오 |
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_latest_vehicle_data()
get_vehicle_data()
및 Teslapy 2.6.0+를 자동으로 호출합니다. 이 예제는 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
인수는 속성으로도 액세스 할 수 있습니다.
예제 자체 기본 GUI 창에 SSO 페이지를 표시하는 WebView 구성 요소를 사용합니다.
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 ()
셀레늄을 사용하여 웹 브라우저 상호 작용을 자동화합니다. navigator.webdriver
가 설정되면 SSO 페이지는 403을 반환하며 현재 크롬, 오페라 및 에지 크롬만이이를 방지 할 수 있습니다.
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은 SSO 페이지 URL을 가져 오기위한 authorization_url()
메소드를 소개하고 fetch_token()
후 리디렉션 된 URL을 키워드 authorization_response
로 제공하는 옵션.
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 ()
Staged Authorization에 대한 지원이 Teslapy 2.5.0에 추가되었습니다. 키워드 인수 state
및 code_verifier
Tesla
클래스 생성자, authorization_url()
메소드 및 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+는 타사 인증 앱에서 얻은 새로 고침 토큰의 사용을 지원합니다. 새로 고침 토큰은 액세스 토큰을 얻는 데 사용되며 둘 다 지속성을 위해 캐시되어 있으므로 새로 고침 토큰을 한 번만 공급하면됩니다.
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 ])
시스템의 기본 웹 브라우저를 사용하여 SSO 페이지에서 가입하고 캐시에서 토큰을 지우려면 다음과 같습니다.
tesla . logout ( sign_out = True )
PywebView를 사용하는 경우 캐시에서 토큰을 지우고 로그 아웃 URL을 가져와 로그 아웃 창을 표시 할 수 있습니다.
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
셀레늄은 쿠키를 저장하지 않고 캐시에서 토큰을 지우는 것입니다.
tesla . logout ()
Tesla
클래스는 플러그 가능한 캐시 방법을 구현합니다. 기본 디스크 캐싱을 사용하지 않으려면 함수를 전달하여 캐시 DICT를로드하고 반환하는 기능과 Cache 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은 비 소유자 API 엔드 포인트에 액세스하기위한 절대 URL 지원을 도입했습니다.
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 )
네트워크 실패를 설명하는 강력한 프로그램에는 재 시도 전략이 있으며,이 전략은 총 재 시도 시도 수, 재 시도 및 선택적으로 백 오프 계수를 포함하는 총 재 시도 수가 포함됩니다. 자세한 내용은 레트리 모듈을 참조하십시오.
서버를 너무 많이 망치면 Tesla가 일시적으로 계정을 차단할 수 있습니다.
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
Context Manager의 라인은 Teslapy 2.5.0+를 사용할 때 예외가 발생합니다. Context Manager가 종료 될 때 요청 연결 처리기를 명시 적으로 닫으므로 예외가 발생합니다. 이전 버전은 예외를 제기하지 않으며 재시는 작동하지 않습니다.
더 많은 코드 예제를 보려면 cli.py, menu.py 또는 gui.py를 살펴보십시오.
이것들은 주요 명령입니다.
엔드 포인트 | 매개 변수 | 값 |
---|---|---|
터놓다 | ||
잠그다 | ||
Honk_horn | ||
Flash_lights | ||
기후 _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 |
scheduled_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 , 자정 이후 몇 분 |
Scheduled_Charging 1 | enable , time | true 또는 false , 자정 이후 몇 분 |
충전 _amps 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 |
remote_start | ||
트리거 _homelink | lat , lon | 현재의 격자와 로지 |
Charge_port_door_open | ||
Charge_port_door_close | ||
start_parch | ||
stop_pharge | ||
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 자리 핀 |
schedule_software_update | offset_sec | 초 |
취소 _software_update | ||
set_sentry_mode | on | true 또는 false |
remote_seat_heater_request | heater , level | 좌석 0-5, 레벨 0-3 |
remote_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true 또는 false |
remote_seat_cooling_request | seat_position , seat_cooler_level | |
remote_steering_wheel_heater_request | on | true 또는 false |
1 자동차 버전 2021.36 이상이 필요합니다. charging_amps
2 또는 3으로 설정하면 3A가 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 일 현재 Tesla는이 엔드 포인트를 업데이트하여 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 일 현재, Tesla는 로그인 양식에 recaptcha를 추가했습니다. 이로 인해 Teslapy가 구현 한 헤드리스 로그인이 중단되었습니다. ValueError: Credentials rejected. Recaptcha is required
올바른 자격 증명을 사용하고 있으며이 모듈의 이전 버전을 사용하고있을 것입니다.
2022 년 1 월 12 일 현재, Tesla는 RFC 7523 토큰의 사용을 더 이상 사용하지 않았으며 SSO 토큰을 API 액세스에 사용해야합니다. requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
사용하고 올바른 자격 증명을 사용하고있는 경우 이전 버전을 사용하고있을 것입니다. 이 모듈.
2024 년 1 월 7 일 현재 Tesla는 Vehicle_List 엔드 포인트를 제거했습니다. 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 이상을 사용하여 웹 로그를 자동화하는 세 가지 데모 애플리케이션이 포함되어 있습니다. 에지 크롬에는 셀레늄 4.0.0 이상이 필요합니다.
Cli.py는 Teslapy 모듈의 거의 모든 기능을 사용할 수있는 간단한 CLI 애플리케이션입니다. 필터 옵션을 사용하면 하나 이상의 제품이 계정에 연결된 경우 제품을 선택할 수 있습니다. 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
Menu.py는 차량 데이터를 표 형식으로 표시하는 메뉴 기반 콘솔 애플리케이션입니다. 응용 프로그램은 GEOPY에 의존하여 GPS 좌표를 사람이 읽을 수있는 주소로 변환합니다.
Gui.py는 tkinter
사용하는 그래픽 사용자 인터페이스입니다. API 호출은 스레딩을 사용하여 비동기 적으로 수행됩니다. GUI는 차량 데이터의 자동 새로 고침을 지원하고 구성된 차량 이미지를 표시합니다. 자동 새로 고침이 활성화되면 차량이 잠들지 않습니다. 응용 프로그램은 GEOPY에 의존하여 GPS 좌표를 인간 읽기 가능한 주소로 변환합니다. Python 설치의 TCL/TK GUI 툴킷 버전이 8.6보다 낮은 경우 차량 이미지를 표시하려면 Pillow가 필요합니다. 인증에 사용할 웹 브라우저와 같은 사용자 기본 설정은 응용 프로그램 재시작시 지속됩니다.
차량 충전 이력은 그래프로 표시 될 수 있습니다.
데모 응용 프로그램은 제공된 Dockerfile을 사용하여 컨테이너 화 될 수 있습니다. 바인드 볼륨은 호스트 컴퓨터의 현재 디렉토리에 cache.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, Menu.py 또는 Gui.py를 실행하려면 requests_oauthlib 0.8.0+, Geopy 1.14.0+, Pywebview 3.0+ (선택 사항), Selenium 3.13을 설치 한 후 시작하십시오. .0+ (선택 사항) 및 WebSocket-Client 0.59+를 사용하여 PIP를 사용합니다.
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
Chromedriver를 설치하여 Selenium 또는 Ubuntu에 다음과 같이 사용하십시오.
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket