การใช้ Python ตามเอกสารที่ไม่เป็นทางการของอินเทอร์เฟซด้านไคลเอนต์ไปยัง API เจ้าของ Tesla Motors ซึ่งให้ฟังก์ชั่นการตรวจสอบและควบคุมผลิตภัณฑ์เทสลาจากระยะไกล
API เจ้าของจะหยุดทำงานเมื่อยานพาหนะเริ่มต้องใช้การรับรองความถูกต้องของคำสั่งแบบ end-to-end โดยใช้โปรโตคอลคำสั่งยานพาหนะของ Tesla ก่อน -2021 รุ่น S และ X ยานพาหนะไม่สนับสนุนโปรโตคอลใหม่นี้และยังคงควบคุมได้โดยใช้ teslapy
โมดูลนี้ขึ้นอยู่กับคำขอ Python, requests_oauthlib และ websocket-client มันต้องใช้ Python 3.10+ เมื่อใช้ urllib3 2.0 ซึ่งมาพร้อมกับคำขอ 2.30.0+ หรือคุณสามารถตรึง urllib3 ได้ที่ 1.26.x โดยการติดตั้ง urllib3<2
คลาส Tesla
ขยาย requests_oauthlib.OAuth2Session
ซึ่งขยาย requests.Session
และดังนั้นจึงสืบทอดวิธีการเช่น get()
และ post()
ที่สามารถใช้ในการโทร API ลักษณะของโมดูล:
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 | (ไม่บังคับ) URL ของบริการ SSO ตั้งค่าเป็น https://auth.tesla.cn/ หากอีเมลของคุณลงทะเบียนในภูมิภาคอื่น |
state | (ไม่บังคับ) สตริงสถานะสำหรับการป้องกัน CSRF |
code_verifier | (ไม่บังคับ) สตริง Verifier รหัส PKCE |
app_user_agent | (ไม่บังคับ) สตริง X-Tesla-user-Agent |
Teslapy 2.1.0+ ไม่ได้ใช้ RFC 7523 อีกต่อไปและใช้โทเค็น SSO สำหรับคำขอ API ทั้งหมด
คลาสจะเปิดหน้า SSO ของ Tesla ในเว็บเบราว์เซอร์เริ่มต้นของระบบเพื่อตรวจสอบสิทธิ์ หลังจากการรับรองความถูกต้องที่ประสบความสำเร็จจะพบ หน้าเว็บที่ไม่พบ และ URL ควรเริ่มต้นด้วย https://auth.tesla.com/void/callback
ซึ่งเป็น URL ที่เปลี่ยนเส้นทาง คลาสจะใช้ stdio
เพื่อรับ URL ที่เปลี่ยนเส้นทางเต็มรูปแบบจากเว็บเบราว์เซอร์โดยค่าเริ่มต้น คุณต้องคัดลอกและวาง URL เต็มรูปแบบจากเว็บเบราว์เซอร์ไปยังคอนโซลเพื่อดำเนินการต่อ Aquirering API Tokens ต่อไป คุณสามารถใช้วิธีการตรวจสอบความถูกต้องที่สามารถทำได้เพื่อทำให้เป็นไปโดยอัตโนมัติเช่นการใช้ PyWebView หรือ Selenium นอกจากนี้ยังเป็นไปได้ที่จะใช้โทเค็นรีเฟรช SSO ที่ได้รับจากแอพการรับรองความถูกต้องของบุคคลที่สาม
วิธีการอำนวยความสะดวก api()
ใช้จุดปลายชื่อที่แสดงใน จุดสิ้นสุด json เพื่อทำการโทรดังนั้นโมดูลไม่จำเป็นต้องมีการเปลี่ยนแปลงหาก API ได้รับการอัปเดต api()
ตัวแปรเส้นทางทดแทนใน URI และเรียก fetch_token()
เมื่อจำเป็น ข้อความแสดงข้อผิดพลาดใด ๆ ที่ส่งคืนโดย API จะถูกยกขึ้นเป็นข้อยกเว้น HTTPError
นอกจากนี้คลาสใช้วิธีการต่อไปนี้:
เรียก | คำอธิบาย |
---|---|
request() | ดำเนินการโทร API โดยใช้ URL สัมพัทธ์หรือแบบสัมบูรณ์การทำให้เป็นอนุกรมและการจัดการข้อความแสดงข้อผิดพลาด |
new_code_verifier() | สร้างตัวตรวจสอบรหัสสำหรับ PKCE |
authorization_url() | แบบฟอร์ม URL การอนุญาตด้วยการขยาย PKCE และพยายามตรวจสอบภูมิภาคที่ลงทะเบียนบัญชี |
fetch_token() | ขอโทเค็น SSO โดยใช้การให้รหัสการอนุญาตด้วยส่วนขยาย PKCE |
refresh_token() | ขอโทเค็น SSO โดยใช้การรีเฟรชโทเค็นแกรนท์ |
close() | ลบอินสแตนซ์อะแดปเตอร์คำขอทั้งหมด |
logout() | ลบโทเค็นออกจากแคชส่งคืน URL ออกจากระบบและลงชื่อเข้าใช้โดยใช้เว็บเบราว์เซอร์เริ่มต้นของระบบ |
vehicle_list() | ส่งคืนรายการวัตถุยานพาหนะ |
battery_list() | ส่งคืนรายการวัตถุแบตเตอรี่ |
solar_list() | ส่งคืนรายการวัตถุ SolarPanel |
คลาส Vehicle
ขยาย dict
และเก็บข้อมูลยานพาหนะที่ส่งคืนโดย API เจ้าของซึ่งเป็น API แบบดึง get_vehicle_summary()
และ get_vehicle_data()
การโทรอัปเดตอินสแตนซ์ Vehicle
รวมข้อมูล สตรีมมิ่ง API ผลักดันข้อมูลยานพาหนะในการเปลี่ยนแปลงหลังจากการสมัครสมาชิก เมธอด stream()
ใช้อาร์กิวเมนต์เสริมฟังก์ชั่นการโทรกลับที่เรียกด้วยอาร์กิวเมนต์หนึ่งตัวซึ่งเป็นคำสั่งที่ถือข้อมูลที่เปลี่ยนแปลง วัตถุ Vehicle
ได้รับการอัปเดตเสมอด้วยข้อมูลที่ผลักดัน หากไม่มีการเปลี่ยนแปลงภายใน 10 วินาทียานพาหนะจะหยุดการสตรีมข้อมูล เมธอด stream()
มีอาร์กิวเมนต์เสริมอีกสองข้อเพื่อควบคุมการรีสตาร์ท นอกจากนี้คลาสใช้วิธีการต่อไปนี้:
เรียก | ออนไลน์ | คำอธิบาย |
---|---|---|
api() | ใช่ | ทำการเรียก API ไปยังจุดสิ้นสุดที่มีชื่อต้องใช้ยานพาหนะ _id พร้อมอาร์กิวเมนต์เสริม |
get_vehicle_summary() | เลขที่ | รับสถานะของยานพาหนะ (ออนไลน์หลับออฟไลน์) |
available() | เลขที่ | ตรวจสอบว่ายานพาหนะออนไลน์ตามข้อมูลแคชหรือสถานะรีเฟรชเมื่ออายุมากขึ้น |
sync_wake_up() | เลขที่ | ตื่นขึ้นมาและรอให้ยานพาหนะออนไลน์ |
decode_option() | เลขที่ | ค้นหารหัสตัวเลือกการค้นหาคำอธิบาย (อ่านจาก optive_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() | ใช่ | wrapper รอบ api() สำหรับการจัดการข้อผิดพลาดในการตอบกลับคำสั่งยานพาหนะ |
1 รหัสตัวเลือกดูเหมือนจะเลิกใช้แล้ว
2 รุ่นซอฟต์แวร์รถยนต์รุ่น 2021.44.25 หรือสูงกว่าจำเป็นต้องเปิดใช้งานการแบ่งปันข้อมูลและคุณต้องเป็นเจ้าของยานพาหนะหลัก
รหัสตัวเลือกยานพาหนะ 3 รายการไปยังวิธีนี้ตอนนี้รหัสตัวเลือกจะเลิกใช้แล้ว
มีเพียงวิธีการที่ ไม่มี ในคอลัมน์ ออนไลน์ เท่านั้นเมื่อยานพาหนะหลับหรือออฟไลน์ วิธีการเหล่านี้จะไม่ป้องกันไม่ให้ยานพาหนะของคุณนอนหลับ วิธีการอื่น ๆ และการโทร API ต้องการให้ยานพาหนะออนไลน์โดยใช้ sync_wake_up()
และสามารถป้องกันไม่ให้ยานพาหนะของคุณนอนหลับหากเรียกว่าภายในระยะเวลาสั้นเกินไป
คลาส Product
ขยาย dict
และเริ่มต้นด้วยข้อมูลผลิตภัณฑ์ของ PowerWalls และแผงเซลล์แสงอาทิตย์ที่ส่งคืนโดย API นอกจากนี้คลาสใช้วิธีการต่อไปนี้:
เรียก | คำอธิบาย |
---|---|
api() | ทำการเรียก API ไปยังจุดสิ้นสุดที่มีชื่อต้องใช้ battery_id หรือ site_id พร้อมอาร์กิวเมนต์เสริม |
get_history_data() | รับสถานะสดของผลิตภัณฑ์ |
get_calendar_history_data() | รับสถานะสดของผลิตภัณฑ์ |
command() | wrapper รอบ api() สำหรับการจัดการข้อผิดพลาดการตอบสนองของแบตเตอรี่คำสั่ง |
คลาส Battery
ขยาย Product
และเก็บข้อมูล PowerWall ที่ส่งคืนโดย 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_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 ที่แสดงหน้า SSO ในหน้าต่าง 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 ()
ตัวอย่างการใช้ซีลีเนียมเพื่อทำให้การโต้ตอบกับเว็บเบราว์เซอร์เป็นไปโดยอัตโนมัติ หน้า SSO ส่งคืน 403 เมื่อตั้งค่า navigator.webdriver
และปัจจุบันมีเฉพาะโครเมียมโอเปร่าและโครเมียมขอบเท่านั้นที่สามารถป้องกันสิ่งนี้ได้
import teslapy
from selenium import webdriver
from selenium . webdriver . support import expected_conditions as EC
from selenium . webdriver . support . ui import WebDriverWait
def custom_auth ( url ):
options = webdriver . ChromeOptions ()
options . add_argument ( "--disable-blink-features=AutomationControlled" )
with webdriver . Chrome ( chrome_options = options ) as browser :
browser . get ( url )
WebDriverWait ( browser , 300 ). until ( EC . url_contains ( 'void/callback' ))
return browser . current_url
with teslapy . Tesla ( '[email protected]' , authenticator = custom_auth ) as tesla :
tesla . fetch_token ()
Teslapy 2.2.0 แนะนำวิธี authorization_url()
เพื่อรับ URL หน้า SSO และตัวเลือกในการจัดหา 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 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 และฟังก์ชั่นที่ใช้ 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 = ปิด, 1 = on, 2 = dog, 3 = camp |
HVAC_BIOWEAPON_MODE | on | true หรือ false |
scheduled_departure 1 | enable departure_time _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 นาทีที่ผ่านมาเที่ยงคืน |
Charging_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 |
รีโมท _start | ||
trigger_homelink | lat , lon | ช่องว่างปัจจุบันและโลจินเตอร์ |
charge_port_door_open | ||
charge_port_door_close | ||
start_charge | ||
หยุด _ 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 หลัก |
scheduce_software_update | offset_sec | ไม่กี่วินาที |
cancel_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 และการตั้งค่าเป็น 0 หรือ 1 ผลลัพธ์ใน 2a
2 close
ต้องการค่า lat
และ lon
ที่จะอยู่ใกล้กับตำแหน่งปัจจุบันของรถ
การจัดการข้อยกเว้นพื้นฐาน:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
requests.exceptions
ทั้งหมด Exceptions และ oauthlib.oauth2.rfc6749.errors
คลาส ERRORS นำเข้าโดยโมดูล เมื่อยานพาหนะหลับหรือออฟไลน์และยานพาหนะจะต้องออนไลน์สำหรับจุดสิ้นสุด API ที่จะดำเนินการข้อยกเว้นดังต่อไปนี้จะเพิ่มขึ้น: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
ข้อยกเว้นสามารถถูกจับได้ว่าเป็น teslapy.HTTPError
นอกจากนี้ sync_wake_up()
จะเพิ่ม teslapy.VehicleError
เมื่อยานพาหนะไม่ได้มาออนไลน์ภายในการหมดเวลาที่กำหนด และ command()
ยังเพิ่ม teslapy.VehicleError
เมื่อผลการตอบสนองคำสั่งยานพาหนะเป็น False
ตัวอย่างเช่นหากมีการเรียกจุดสิ้นสุดของสื่อและไม่มีผู้ใช้อยู่ในยานพาหนะข้อยกเว้นดังต่อไปนี้จะถูกยกขึ้น: VehicleError: user_not_present
เมื่อวันที่ 29 มกราคม 2564 เทสลาอัปเดตจุดสิ้นสุดนี้เพื่อติดตาม 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
แล้วคุณอาจใช้โมดูลรุ่นเก่านี้
ณ วันที่ 3 กันยายน 2564 เทสลาได้เพิ่ม recaptcha ลงในแบบฟอร์มการเข้าสู่ระบบ สิ่งนี้ทำให้เกิดการเข้าสู่ระบบแบบไม่มีหัวโดย teslapy ที่จะทำลาย หากคุณได้รับ ValueError: Credentials rejected. Recaptcha is required
และคุณกำลังใช้ข้อมูลรับรองที่ถูกต้องจากนั้นคุณอาจใช้โมดูลรุ่นเก่านี้
เมื่อวันที่ 12 มกราคม 2565 เทสลาเลิกใช้โทเค็น RFC 7523 และต้องใช้โทเค็น SSO ที่จะใช้สำหรับการเข้าถึง API หากคุณได้รับ requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
และคุณกำลังใช้ข้อมูลรับรองที่ถูกต้อง โมดูลนี้
ณ วันที่ 7 มกราคม 2567 เทสลาได้ลบจุดสิ้นสุดของยานพาหนะ หากคุณได้รับ 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 เป็นแอปพลิเคชั่น 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
menu.py เป็นแอปพลิเคชันคอนโซลที่ใช้เมนูที่แสดงข้อมูลยานพาหนะในรูปแบบตาราง แอปพลิเคชันขึ้นอยู่กับ geopy ในการแปลงพิกัด GPS เป็นที่อยู่ที่อ่านได้ของมนุษย์:
Gui.py เป็นส่วนต่อประสานผู้ใช้กราฟิกโดยใช้ tkinter
การโทร API จะดำเนินการแบบอะซิงโครนัสโดยใช้เธรด GUI รองรับการรีเฟรชอัตโนมัติของข้อมูลยานพาหนะและแสดงภาพยานพาหนะที่แต่งขึ้น โปรดทราบว่ายานพาหนะจะไม่เข้านอนหากเปิดใช้งานการรีเฟรชอัตโนมัติ แอปพลิเคชันขึ้นอยู่กับ Geopy ในการแปลงพิกัด GPS เป็นที่อยู่ที่มนุษย์อ่านได้ หาก TCL/TK GUI Toolkit การติดตั้ง Python ของคุณต่ำกว่า 8.6 ต้องใช้หมอนเพื่อแสดงภาพยานพาหนะ การตั้งค่าผู้ใช้เช่นเว็บเบราว์เซอร์ที่จะใช้สำหรับการตรวจสอบความถูกต้องคงอยู่เมื่อแอปพลิเคชันรีสตาร์ท
ประวัติการชาร์จยานพาหนะสามารถแสดงในกราฟได้เช่นกัน
แอปพลิเคชั่นสาธิตสามารถบรรจุได้โดยใช้ 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, เมนูหรือ gui.py เพื่อเริ่มต้นหลังจากติดตั้ง requests_oauthlib 0.8.0+, geopy 1.14.0+, pywebview 3.0+ .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