تطبيق Python يعتمد على الوثائق غير الرسمية للواجهة الجانبية للعميل إلى API لمالك Tesla Motors ، والذي يوفر وظائف لمراقبة منتجات Tesla والتحكم فيها عن بُعد.
ستتوقف API للالكلين عن العمل عندما تبدأ المركبات في طلب مصادقة أمر شامل باستخدام بروتوكول قيادة Tesla للمركبة. لا تدعم مركبات ModelS S و X قبل 2021 هذا البروتوكول الجديد وتظل قابلة للتحكم باستخدام Teslapy.
تعتمد هذه الوحدة على طلبات Python و requests_oauthlib و WebSocket-Client. يتطلب Python 3.10+ عند استخدام urllib3 2.0 ، والذي يأتي مع طلبات 2.30.0+ ، أو يمكنك تثبيت urllib3 إلى 1.26.x عن طريق تثبيت urllib3<2
.
يمتد post()
Tesla
requests_oauthlib.OAuth2Session
التي تمد requests.Session
get()
خصائص الوحدة النمطية:
Teslapy 2.0.0+ لم يعد ينفذ المصادقة بدون مقطوعة الرأس. يختلف المنشئ ويأخذ هذه الحجج:
دعوى | وصف |
---|---|
email | هوية SSO |
verify | (اختياري) تحقق من شهادة SSL |
proxy | (اختياري) عنوان URL لخادم الوكيل |
retry | (اختياري) عدد إعادة الاتصال أو مثيل Retry |
timeout | (اختياري) توصيل/قراءة المهلة |
user_agent | (اختياري) سلسلة وكيل المستخدم |
authenticator | (اختياري) وظيفة مع وسيطة واحدة ، عنوان URL للتخويل ، الذي يعيد عنوان URL المعاد توجيهه |
cache_file | (اختياري) مسار إلى ملف ذاكرة التخزين المؤقت المستخدمة عن طريق المحمل الافتراضي و dumper |
cache_loader | (اختياري) الدالة التي تُرجع قول ذاكرة التخزين المؤقت |
cache_dumper | (اختياري) وظيفة مع وسيطة واحدة ، وقول ذاكرة التخزين المؤقت |
sso_base_url | (اختياري) عنوان URL لخدمة SSO ، تم تعيينه على https://auth.tesla.cn/ إذا تم تسجيل بريدك الإلكتروني في منطقة أخرى |
state | (اختياري) سلسلة حالة لحماية CSRF |
code_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 الكامل ولصقه من متصفح الويب إلى وحدة التحكم لمواصلة الرموز المائية API Aquirering. يمكنك استخدام طريقة مصادقة قابلة للتوصيل لأتمتة ذلك ، على سبيل المثال باستخدام Pywebview أو Selenium. من الممكن أيضًا استخدام رمز SSO لتحديث SSO الذي تم الحصول عليه بواسطة تطبيق مصادقة الطرف الثالث.
تستخدم طريقة الراحة api()
نقاط النهاية المسماة المدرجة في Endpoints.json لإجراء المكالمات ، لذلك لا تتطلب الوحدة تغييرات إذا تم تحديث واجهة برمجة التطبيقات. api()
استبدال متغيرات مسار في URI والمكالمات fetch_token()
عند الحاجة. يتم رفع أي رسالة خطأ يتم إرجاعها بواسطة API كاستثناء HTTPError
. بالإضافة إلى ذلك ، ينفذ الفصل الطرق التالية:
يتصل | وصف |
---|---|
request() | يقوم استدعاء API باستخدام عنوان URL النسبي أو المطلق ، التسلسل والتعامل مع رسائل الخطأ |
new_code_verifier() | يولد برامج الرمز لـ PKCE |
authorization_url() | URL ترخيص النماذج مع امتداد PKCE ويحاول اكتشاف المنطقة المسجلة الحسابات |
fetch_token() | يطلب رمز SSO باستخدام منحة رمز التفويض مع امتداد PKCE |
refresh_token() | يطلب رمز SSO باستخدام منحة Thoken Refresh |
close() | قم بإزالة جميع حالات محول الطلبات |
logout() | يزيل الرمز المميز من ذاكرة التخزين المؤقت ، وإرجاع عنوان URL LogOut ويوقع اختياريًا باستخدام متصفح الويب الافتراضي للنظام |
vehicle_list() | إرجاع قائمة كائنات المركبات |
battery_list() | إرجاع قائمة كائنات البطارية |
solar_list() | إرجاع قائمة كائنات Solarpanel |
يمتد فئة Vehicle
dict
وتخزن بيانات السيارة التي يتم إرجاعها بواسطة API للالتحض ، وهي واجهة برمجة تطبيقات سحب. يقوم get_vehicle_summary()
و get_vehicle_data()
بتحديث مثيل Vehicle
، ودمج البيانات. تدفق API تدفق بيانات السيارة على تغيير بعد الاشتراك. تأخذ طريقة stream()
وسيطة اختيارية ، وظيفة رد الاتصال التي يتم استدعاؤها مع وسيطة واحدة ، وقولان يحمل البيانات التي تم تغييرها. يتم تحديث كائن Vehicle
دائمًا بالبيانات التي تم دفعها. إذا لم تكن هناك تغييرات في غضون 10 ثوانٍ ، تتوقف السيارة عن دفق بيانات. تحتوي طريقة stream()
على وسيطين اختياريتين للتحكم في إعادة التشغيل. بالإضافة إلى ذلك ، ينفذ الفصل الطرق التالية:
يتصل | متصل | وصف |
---|---|---|
api() | نعم | يقوم بإجراء مكالمة 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() | لا | يحول وحدات المسافة أو السرعة إلى إعداد واجهة المستخدم الرسومية للسيارة |
temp_units() | لا | يحول وحدات درجة الحرارة إلى إعداد واجهة المستخدم الرسومية للسيارة |
gui_time() | لا | إرجاع الطابع الزمني أو الوقت الحالي المنسق إلى إعداد واجهة المستخدم الرسومية |
last_seen() | لا | إرجاع مركبة آخر مرة في الوقت الطبيعي |
decode_vin() | لا | يدلل رقم تعريف السيارة إلى قول |
command() | نعم | غلاف حول 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() | التفاف حول api() لمعالجة خطأ استجابة أمر البطارية |
تقوم فئة Battery
بتوسيع Product
وتخزن بيانات PowerWall التي يتم إرجاعها بواسطة API ، والتي تم تحديثها بواسطة get_battery_data()
. بالإضافة إلى ذلك ، ينفذ الفصل الطرق التالية:
يتصل | وصف |
---|---|
get_battery_data() | استرداد الحالة التفصيلية وتكوين البطارية |
set_operation() | اضبط تشغيل البطارية على الاستهلاك الذاتي أو النسخ الاحتياطي أو الحكم الذاتي |
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 في نافذة واجهة المستخدم الرسومية الأصلية الخاصة به.
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 ، كوسائط إلى المُنشئ. يمكن الوصول إلى وسيطات 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 ()
يتم الحصول على درجات السلامة على الرغم من واجهة برمجة تطبيقات أخرى. قدم Teslapy 2.1.0 دعم 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 )
يتمتع برنامج قوي يمثل فشل الشبكة باستراتيجية إعادة المحاولة ، والتي تتضمن العدد الإجمالي لمحاولات إعادة المحاولة ، ورموز استجابة HTTP لإعادة إعادة المحاولة على عامل التراجع واختياري. ارجع إلى وحدة إعادة المحاولة لمزيد من التفاصيل.
كن على دراية بأن 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
سيقوم الخط بعد مدير السياق بإثارة استثناء عند استخدام 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 | درجة الحرارة في سيلسيوس |
set_climate_keeper_mode | climate_keeper_mode | 0 = OFF ، 1 = ON ، 2 = DOG ، 3 = CAMP |
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 ، دقائق في منتصف الليل |
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_sunrack_state | state | vent أو close |
window_control 2 | command ، lat ، lon | vent أو close ، 0 ، 0 |
Actuate_trunk | which_trunk | rear أو front |
Remote_start | ||
trigger_homelink | lat ، lon | السعة الحالية والوجود |
charge_port_door_open | ||
charge_port_door_close | ||
start_charge | ||
Stop_Charge | ||
set_cop_temp | temp | درجة الحرارة في سيلسيوس |
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 أرقام دبوس |
refet_valet_pin | ||
speed_limit_active | pin | 4 أرقام دبوس |
speed_limit_deactive | pin | 4 أرقام دبوس |
speed_limit_set_limit | limit_mph | بين 50-90 |
speed_limit_clear_pin | pin | 4 أرقام دبوس |
الجدول _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 )
oauthlib.oauth2.rfc6749.errors
requests.exceptions
. عندما تكون السيارة نائمة أو غير متصلة بالإنترنت ويجب أن تكون السيارة متاحة على الإنترنت حتى يتم تنفيذ نقطة نهاية 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 يناير ، 2021 ، قامت 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
.
اعتبارًا من 3 سبتمبر 2021 ، أضافت Tesla Recaptcha إلى نموذج تسجيل الدخول. تسبب هذا في تسجيل الدخول المقطوع الرأس الذي تنفذه Teslapy. إذا حصلت على ValueError: Credentials rejected. Recaptcha is required
وأنت تستخدم بيانات الاعتماد الصحيحة ، فمن المحتمل أنك تستخدم إصدارًا قديمًا من هذه الوحدة.
اعتبارًا من 12 كانون الثاني (يناير) 2022 ، قامت Tesla بإهمال استخدام الرموز المميزة RFC 7523 وتتطلب استخدام الرموز المميزة SSO للوصول إلى واجهة برمجة التطبيقات. إذا حصلت على requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
هذه الوحدة.
اعتبارًا من 7 يناير 2024 ، قامت Tesla بإزالة نقطة النهاية للمركبة. إذا حصلت على 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
Menu.py هو تطبيق وحدة تحكم قائم على القائمة يعرض بيانات السيارة بتنسيق جدولي. يعتمد التطبيق على Geopy لتحويل إحداثيات GPS إلى عنوان قابل للقراءة البشرية:
gui.py هي واجهة مستخدم رسومية باستخدام tkinter
. يتم إجراء مكالمات API بشكل غير متزامن باستخدام الخيوط. يدعم واجهة المستخدم الرسومية منعشًا لبيانات السيارة ويعرض صورة مركبة مؤلفة. لاحظ أن السيارة لن تذهب إلى النوم ، إذا تم تمكين تحديث السيارات. يعتمد التطبيق على Geopy لتحويل إحداثيات GPS إلى عنوان قابل للقراءة البشرية. إذا كان إصدار مجموعة أدوات TCL/TK GUI من تثبيت 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 أو menu.py أو gui.py للبدء ، بعد تثبيت requests_oauthlib 0.8.0+ ، geopy 1.14.0+ ، pywebview 3.0+ (اختياري) ، سيلينيوم 3.13 .0+ (اختياري) و WebSocket-Client 0.59+ باستخدام PIP على النحو التالي:
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
وتثبيت chromedriver لاستخدام السيلينيوم أو على أوبونتو على النحو التالي:
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket