Implementasi Python berdasarkan dokumentasi tidak resmi antarmuka sisi klien ke API pemilik Tesla Motors, yang menyediakan fungsionalitas untuk memantau dan mengontrol produk Tesla dari jarak jauh.
Pemilik API akan berhenti bekerja saat kendaraan mulai membutuhkan otentikasi perintah end-to-end menggunakan protokol perintah kendaraan Tesla. Kendaraan Pra-2021 Model S dan X tidak mendukung protokol baru ini dan tetap dapat dikendalikan menggunakan Teslapy.
Modul ini tergantung pada permintaan Python, Requests_OAuthlib dan WebSocket-Client. Dibutuhkan Python 3.10+ saat menggunakan Urllib3 2.0, yang dilengkapi dengan permintaan 2.30.0+, atau Anda dapat menyematkan urllib3 hingga 1.26.x dengan menginstal urllib3<2
.
Kelas Tesla
memperluas requests_oauthlib.OAuth2Session
yang memperluas requests.Session
Sesi dan karenanya mewarisi metode seperti get()
dan post()
yang dapat digunakan untuk melakukan panggilan API. Karakteristik modul:
Teslapy 2.0.0+ tidak lagi mengimplementasikan otentikasi tanpa kepala. Konstruktor berbeda dan mengambil argumen ini:
Argumen | Keterangan |
---|---|
email | Identitas SSO |
verify | (Opsional) Verifikasi Sertifikat SSL |
proxy | URL (opsional) dari server proxy |
retry | (Opsional) Jumlah koneksi yang diulang atau Retry |
timeout | (Opsional) Hubungkan/baca batas waktu |
user_agent | (Opsional) String agen pengguna |
authenticator | Fungsi (opsional) dengan satu argumen, URL otorisasi, yang mengembalikan URL yang dialihkan |
cache_file | (Opsional) Path to Cache File yang Digunakan oleh Loader Default dan Dumper |
cache_loader | fungsi (opsional) yang mengembalikan dikt cache |
cache_dumper | fungsi (opsional) dengan satu argumen, dikt cache |
sso_base_url | (Opsional) URL Layanan SSO, diatur ke https://auth.tesla.cn/ Jika email Anda terdaftar di wilayah lain |
state | (Opsional) Status string untuk perlindungan CSRF |
code_verifier | (Opsional) PKCE Code Verifier String |
app_user_agent | (Opsional) X-Tesla-User-Agent String |
Teslapy 2.1.0+ tidak lagi mengimplementasikan RFC 7523 dan menggunakan token SSO untuk semua permintaan API.
Kelas akan membuka halaman SSO Tesla di browser web default sistem untuk mengotentikasi. Setelah otentikasi yang berhasil, halaman yang tidak ditemukan akan ditampilkan dan URL harus dimulai dengan https://auth.tesla.com/void/callback
, yang merupakan URL yang dialihkan. Kelas akan menggunakan stdio
untuk mendapatkan URL yang dialihkan penuh dari browser web secara default. Anda perlu menyalin dan menempelkan URL lengkap dari browser web ke konsol untuk melanjutkan token API akuiring. Anda dapat menggunakan metode authenticator pluggable untuk mengotomatisasi ini, misalnya menggunakan pywebview atau selenium. Dimungkinkan juga untuk menggunakan token refresh SSO yang diperoleh oleh aplikasi otentikasi pihak ke -3.
Metode kenyamanan api()
menggunakan titik akhir bernama yang tercantum di endpoints.json untuk melakukan panggilan, sehingga modul tidak memerlukan perubahan jika API diperbarui. api()
Variabel jalur pengganti di URI dan panggilan fetch_token()
bila diperlukan. Setiap pesan kesalahan yang dikembalikan oleh API dinaikkan sebagai pengecualian HTTPError
. Selain itu, kelas mengimplementasikan metode berikut:
Panggilan | Keterangan |
---|---|
request() | melakukan panggilan API menggunakan URL relatif atau absolut, serialisasi dan penanganan pesan kesalahan |
new_code_verifier() | Menghasilkan Verifier Kode untuk PKCE |
authorization_url() | Formulir URL otorisasi dengan PKCE Extension dan mencoba mendeteksi wilayah terdaftar akun |
fetch_token() | Meminta token SSO menggunakan hibah kode otorisasi dengan ekstensi PKCE |
refresh_token() | meminta token SSO menggunakan hibah token refresh |
close() | Hapus semua permintaan adaptor permintaan |
logout() | menghapus token dari cache, mengembalikan URL logout dan secara opsional keluar menggunakan browser web default sistem |
vehicle_list() | Mengembalikan daftar benda kendaraan |
battery_list() | Mengembalikan daftar objek baterai |
solar_list() | Mengembalikan daftar objek SolarPanel |
Kelas Vehicle
memperluas dict
dan menyimpan data kendaraan yang dikembalikan oleh API pemilik, yang merupakan API tarik. get_vehicle_summary()
dan get_vehicle_data()
panggilan memperbarui instance Vehicle
, menggabungkan data. API streaming mendorong data kendaraan secara langsung setelah berlangganan. Metode stream()
mengambil argumen opsional, fungsi panggilan balik yang dipanggil dengan satu argumen, sebuah dikt yang memegang data yang diubah. Objek Vehicle
selalu diperbarui dengan data yang didorong. Jika tidak ada perubahan dalam waktu 10 detik, kendaraan menghentikan data streaming. Metode stream()
memiliki dua argumen opsional lagi untuk mengontrol restart. Selain itu, kelas mengimplementasikan metode berikut:
Panggilan | On line | Keterangan |
---|---|---|
api() | Ya | Melakukan panggilan API ke titik akhir bernama yang membutuhkan vehicle_id dengan argumen opsional |
get_vehicle_summary() | TIDAK | Mendapatkan keadaan kendaraan (online, tertidur, offline) |
available() | TIDAK | Periksa apakah kendaraan online berdasarkan data yang di -cache atau status yang disegarkan saat berumur |
sync_wake_up() | TIDAK | bangun dan menunggu kendaraan online |
decode_option() | TIDAK | Pencarian Kode Opsi Deskripsi (Baca dari option_codes.json ) |
option_code_list() 1 | TIDAK | daftar deskripsi yang diketahui dari kode opsi kendaraan |
get_vehicle_data() | Ya | Dapatkan data kendaraan untuk titik akhir yang dipilih, default ke semua titik akhir |
get_vehicle_location_data() | Ya | Mendapat data dasar dan lokasi untuk kendaraan |
get_nearby_charging_sites() | Ya | Daftar stasiun pengisian yang dioperasikan Tesla di dekatnya |
get_service_scheduling_data() | TIDAK | mengambil janji temu layanan berikutnya untuk kendaraan ini |
get_charge_history() 2 | TIDAK | Daftar Poin Data Sejarah Pengisian Kendaraan |
mobile_enabled() | Ya | memeriksa apakah pengaturan akses seluler diaktifkan di dalam mobil |
compose_image() 3 | TIDAK | menyusun gambar kendaraan berdasarkan kode opsi kendaraan |
dist_units() | TIDAK | mengubah jarak atau unit kecepatan ke pengaturan kendaraan GUI |
temp_units() | TIDAK | mengubah unit suhu ke pengaturan kendaraan GUI |
gui_time() | TIDAK | Mengembalikan stempel waktu atau waktu saat ini diformat ke pengaturan GUI |
last_seen() | TIDAK | Kembali Kendaraan Terakhir Melihat Waktu Alami |
decode_vin() | TIDAK | Decodes Nomor Identifikasi Kendaraan ke Dikt |
command() | Ya | Pembungkus di sekitar api() untuk penanganan kesalahan respons perintah kendaraan |
1 kode opsi tampaknya sudah usang.
2 Perangkat Lunak Mobil Versi 2021.44.25 atau lebih tinggi diperlukan, berbagi data harus diaktifkan dan Anda harus menjadi pemilik kendaraan utama.
3 Lulus Kode Opsi Kendaraan ke Metode Ini Sekarang Kode Opsi sudah usang.
Hanya metode tanpa di kolom online yang tersedia saat kendaraan tertidur atau offline. Metode ini tidak akan mencegah kendaraan Anda tidur. Metode lain dan panggilan API mengharuskan kendaraan untuk dibawa online dengan menggunakan sync_wake_up()
dan dapat mencegah kendaraan Anda tidur jika dipanggil dalam waktu yang terlalu singkat.
Kelas Product
memperluas dict
dan diinisialisasi dengan data produk powerwall dan panel surya yang dikembalikan oleh API. Selain itu, kelas mengimplementasikan metode berikut:
Panggilan | Keterangan |
---|---|
api() | Melakukan panggilan API ke titik akhir bernama yang membutuhkan baterai_id atau site_id dengan argumen opsional |
get_history_data() | Ambil status langsung produk |
get_calendar_history_data() | Ambil status langsung produk |
command() | Pembungkus di sekitar api() untuk penanganan kesalahan respons perintah baterai |
Kelas Battery
memperluas Product
dan menyimpan data powerwall yang dikembalikan oleh API, diperbarui oleh get_battery_data()
. Selain itu, kelas mengimplementasikan metode berikut:
Panggilan | Keterangan |
---|---|
get_battery_data() | Ambil status terperinci dan konfigurasi baterai |
set_operation() | Atur operasi baterai ke self_consumption, cadangan atau otonom |
set_backup_reserve_percent() | Atur persen cadangan cadangan minimum untuk baterai itu |
set_import_export() | Menetapkan Pengaturan Impor Baterai dan Ekspor |
get_tariff() | Dapatkan Data Tarif Tarif |
set_tariff() | Atur data tarif tarif. Data dapat dibuat secara manual, atau dihasilkan oleh create_tariff |
create_tariff() | Membuat kamus data tarif yang diformat dengan benar |
Kelas SolarPanel
memperluas Product
dan menyimpan data panel surya yang dikembalikan oleh API, diperbarui oleh get_site_data()
. Selain itu, kelas mengimplementasikan metode berikut:
Panggilan | Keterangan |
---|---|
get_site_data() | Ambil data pembuatan situs saat ini |
Penggunaan dasar modul:
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 dan 2.5.0 secara otomatis memanggil get_vehicle_data()
dan teslapy 2.6.0+ panggilan otomatis get_latest_vehicle_data()
Ketika kunci tidak ditemukan. Contoh ini berfungsi untuk 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' )
Output contoh:
Tim's Tesla last seen 6 hours ago at 87% SoC
Kelas Tesla
mengimplementasikan metode otentikasi pluggable. Jika Anda ingin mengimplementasikan metode Anda sendiri untuk menangani halaman SSO dan mengambil URL yang dialihkan setelah otentikasi, Anda dapat melewati fungsi sebagai argumen kepada konstruktor, yang mengambil URL otentikasi sebagai argumen dan mengembalikan URL yang diarahkan. Argumen authenticator
dapat diakses sebagai atribut juga.
Contoh Menggunakan komponen WebView yang menampilkan halaman SSO di jendela GUI aslinya.
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 ()
Contoh Menggunakan Selenium untuk Mengotomatiskan Interaksi Browser Web. Halaman SSO mengembalikan 403 ketika navigator.webdriver
diatur dan saat ini hanya chrome, opera dan kromium tepi yang dapat mencegahnya.
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 memperkenalkan metode authorization_url()
untuk mendapatkan URL halaman SSO dan opsi untuk memasok URL yang diarahkan sebagai argumen kata kunci authorization_response
untuk fetch_token()
setelah otentikasi.
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 ()
Dukungan untuk otorisasi bertahap telah ditambahkan ke Teslapy 2.5.0. state
argumen kata kunci dan code_verifier
diterima oleh konstruktor kelas Tesla
, metode authorization_url()
dan metode 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+ mendukung penggunaan token refresh yang diperoleh oleh aplikasi otentikasi pihak ke -3. Token refresh digunakan untuk mendapatkan token akses dan keduanya di -cache untuk kegigihan, jadi Anda hanya perlu menyediakan token refresh hanya sekali.
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 ])
Untuk menggunakan browser web default sistem Anda untuk keluar dari halaman SSO dan menghapus token dari cache:
tesla . logout ( sign_out = True )
Jika menggunakan pywebview, Anda dapat menghapus token dari cache dan mendapatkan URL logout untuk menampilkan jendela masuk:
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
Selenium tidak menyimpan cookie, hapus saja token dari cache:
tesla . logout ()
Kelas Tesla
mengimplementasikan metode cache pluggable. Jika Anda tidak ingin menggunakan caching disk default, Anda dapat melewati fungsi untuk memuat dan mengembalikan dikt cache, dan fungsi yang mengambil dikt sebagai argumen untuk membuang dikt cache, sebagai argumen kepada konstruktor. Argumen cache_loader
dan cache_dumper
juga dapat diakses sebagai atribut.
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 ()
Skor keamanan diperoleh melalui API lain. Teslapy 2.1.0 memperkenalkan dukungan URL absolut untuk mengakses titik akhir API non-pemilik.
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 menggunakan batas waktu koneksi dan baca 10 detik yang dapat disesuaikan secara default. Lihat bagian Timeout untuk lebih jelasnya. Teslapy tidak mencoba lagi koneksi gagal atau waktunya secara default, yang dapat diaktifkan dengan parameter retry
.
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
Akuntansi program yang kuat untuk kegagalan jaringan memiliki strategi coba lagi, yang mencakup jumlah total upaya coba lagi, kode respons HTTP untuk mencoba lagi dan secara opsional merupakan faktor backoff. Lihat Modul RETRY untuk detail lebih lanjut.
Ketahuilah bahwa Tesla dapat untuk sementara waktu memblokir akun Anda jika Anda terlalu memalu server.
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
Garis setelah Context Manager akan meningkatkan pengecualian saat menggunakan Teslapy 2.5.0+ karena secara eksplisit menutup pawang koneksi permintaan ketika manajer konteks keluar. Versi sebelumnya tidak akan meningkatkan pengecualian dan coba lagi tidak akan berhasil.
Lihatlah cli.py, menu.py atau gui.py untuk lebih banyak contoh kode.
Ini adalah perintah utama:
Titik akhir | Parameter | Nilai |
---|---|---|
MEMBUKA KUNCI | ||
KUNCI | ||
Honk_horn | ||
Flash_lights | ||
Iklim_on | ||
Iklim_off | ||
MAX_DEFROST | on | true atau false |
Change_climate_temperature_setting | driver_temp , passenger_temp | Suhu di Celcius |
Set_climate_keeper_mode | climate_keeper_mode | 0 = OFF, 1 = ON, 2 = DOG, 3 = CAMP |
Hvac_bioweapon_mode | on | true atau false |
Terjadwal_Departure 1 | enable , departure_time , preconditioning_enabled , preconditioning_weekdays_only , off_peak_charging_enabled , off_peak_charging_weekdays_only , end_off_peak_time | true atau false , beberapa menit melewati tengah malam |
Terjadwal_Charging 1 | enable , time | true atau false , beberapa menit melewati tengah malam |
Pengisian daya_amps 1 | charging_amps | antara 0-32 |
Set_cabin_overheat_protection | on , fan_only | true atau false |
Change_charge_limit | percent | persentase |
Set_vehicle_name | vehicle_name | nama |
Change_sunroof_state | state | vent atau close |
Window_control 2 | command , lat , lon | vent atau close , 0 , 0 |
Actuate_trunk | which_trunk | rear atau front |
Remote_start | ||
Trigger_homelink | lat , lon | Lattitude dan Logitude saat ini |
CAILG_PORT_DOOR_OPEN | ||
CAILG_PORT_DOOR_CLOSE | ||
Start_charge | ||
Stop_charge | ||
Set_cop_temp | temp | Suhu di 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 atau false , pin 4 digit |
Reset_valet_pin | ||
Speed_limit_activate | pin | Pin 4 digit |
Speed_limit_deactivate | pin | Pin 4 digit |
Speed_limit_set_limit | limit_mph | antara 50-90 |
Speed_limit_clear_pin | pin | Pin 4 digit |
Jadwal_software_update | offset_sec | detik |
Cancel_software_update | ||
Set_sentry_mode | on | true atau false |
Remote_seat_heater_request | heater , level | Kursi 0-5, Level 0-3 |
Remote_auto_seat_climate_request | auto_seat_position , auto_climate_on | 1-2, true atau false |
Remote_seat_cooling_request | seat_position , seat_cooler_level | |
Remote_steering_wheel_heater_request | on | true atau false |
1 membutuhkan versi mobil 2021.36 atau lebih tinggi. Pengaturan charging_amps
ke 2 atau 3 menghasilkan 3a dan pengaturan ke 0 atau 1 menghasilkan 2a.
2 close
membutuhkan nilai lat
dan lon
untuk berada di dekat lokasi saat ini dari mobil.
Penanganan Pengecualian Dasar:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
Semua requests.exceptions
dan oauthlib.oauth2.rfc6749.errors
kelas diimpor oleh modul. Ketika kendaraan tertidur atau offline dan kendaraan perlu online agar titik akhir API dieksekusi, pengecualian berikut dinaikkan: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
. Pengecualian dapat ditangkap sebagai teslapy.HTTPError
.
Selain itu, sync_wake_up()
meningkatkan teslapy.VehicleError
ketika kendaraan tidak online dalam batas waktu yang ditentukan. Dan command()
juga meningkatkan teslapy.VehicleError
ketika hasil respons perintah kendaraan False
. Misalnya, jika salah satu titik akhir media dipanggil dan tidak ada pengguna yang ada di dalam kendaraan, pengecualian berikut dinaikkan: VehicleError: user_not_present
.
Pada tanggal 29 Januari 2021, Tesla memperbarui titik akhir ini untuk mengikuti RFC 7523 dan mensyaratkan penggunaan layanan SSO (auth.tesla.com) untuk otentikasi. Jika Anda mendapatkan requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
maka Anda mungkin menggunakan versi lama modul ini.
Pada 3 September 2021, Tesla telah menambahkan Recaptcha ke formulir login. Hal ini menyebabkan login tanpa kepala yang diimplementasikan oleh Teslapy pecah. Jika Anda mendapatkan ValueError: Credentials rejected. Recaptcha is required
dan Anda menggunakan kredensial yang benar maka Anda mungkin menggunakan versi lama dari modul ini.
Pada 12 Januari 2022, Tesla telah mencela penggunaan token RFC 7523 dan mengharuskan token SSO untuk digunakan untuk akses API. Jika Anda mendapatkan requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
modul ini.
Pada 7 Januari 2024, Tesla telah menghapus titik akhir kendaraan_list. Jika Anda mendapatkan requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
maka Anda mungkin menggunakan versi lama dari modul ini.
Repositori sumber berisi tiga aplikasi demo yang secara opsional menggunakan PyWebView versi 3.0 atau lebih tinggi atau Selenium versi 3.13.0 atau lebih tinggi untuk mengotomatisasi weblogin. Selenium 4.0.0 atau lebih tinggi diperlukan untuk kromium tepi.
Cli.py adalah aplikasi CLI sederhana yang dapat menggunakan hampir semua fungsionalitas modul teslapy. Opsi filter memungkinkan Anda untuk memilih produk jika lebih dari satu produk ditautkan ke akun Anda. Output API diformat 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
Contoh penggunaan cli.py:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
menu.py adalah aplikasi konsol berbasis menu yang menampilkan data kendaraan dalam format tabel. Aplikasi tergantung pada geopy untuk mengonversi koordinat GPS ke alamat manusia yang dapat dibaca:
Gui.py adalah antarmuka pengguna grafis menggunakan tkinter
. Panggilan API dilakukan secara tidak sinkron menggunakan Threading. GUI mendukung penyegaran data kendaraan secara otomatis dan menampilkan gambar kendaraan yang disusun. Perhatikan bahwa kendaraan tidak akan tidur, jika penyegaran otomatis diaktifkan. Aplikasi tergantung pada geopy untuk mengonversi koordinat GPS ke alamat manusia yang dapat dibaca. Jika TCL/TK GUI Toolkit versi instalasi Python Anda lebih rendah dari 8.6 maka bantal diperlukan untuk menampilkan gambar kendaraan. Preferensi pengguna, seperti browser web mana yang akan digunakan untuk otentikasi, bertahan saat restart aplikasi.
Riwayat pengisian kendaraan dapat ditampilkan dalam grafik juga.
Aplikasi demo dapat dikemukakan menggunakan DockerFile yang disediakan. Volume ikatan digunakan untuk menyimpan cache.json dan gui.ini di direktori saat ini pada mesin host:
sudo docker build -t teslapy .
xhost +local:*
sudo docker run -ti --net=host --privileged -v "$(pwd)":/home/tsla teslapy
Contoh output get_vehicle_data()
atau python cli.py -e [email protected] -w -g
di bawah:
{
"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 "
}
}
Contoh output dari get_service_scheduling_data()
atau python cli.py -e [email protected] --service
di bawah ini:
{
"vin" : " 5YJ3E111111111111 " ,
"next_appt_timestamp" : " 2021-06-08T13:15:00 " ,
"next_appt_end_timestamp" : null ,
"show_badge" : false
}
Contoh output get_battery_data()
atau python cli.py -e [email protected] -b
di bawah ini:
{
"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
}
Contoh output get_site_data()
atau python cli.py -e [email protected] -s
di bawah:
{
"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 tersedia di PYPI:
python -m pip install teslapy 'urllib3<2'
Pastikan Anda memiliki Python 2.7+ atau 3.5+ yang diinstal pada sistem Anda. Atau, klon repositori ke mesin Anda dan jalankan aplikasi demo cli.py, menu.py atau gui.py untuk memulai, setelah menginstal permintaan_oauthlib 0.8.0+, Geopy 1.14.0+, PyWebView 3.0+ (Opsional), Selenium 3.13 .0+ (Opsional) dan Websocket-Client 0.59+ Menggunakan PIP sebagai berikut:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
dan instal chromedriver untuk menggunakan selenium atau di ubuntu sebagai berikut:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket