Tesla Motorsの所有者APIへのクライアント側インターフェイスの非公式ドキュメントに基づくPython実装。これは、Tesla製品をリモートで監視および制御する機能を提供します。
Tesla Vehicleコマンドプロトコルを使用して、車両がエンドツーエンドのコマンド認証を必要とするため、所有者APIは動作を停止します。 2021年以前のモデルSおよびX車両は、この新しいプロトコルをサポートせず、テスラピーを使用して制御可能なままです。
このモジュールは、Pythonリクエスト、Requests_Oauthlib、およびWebSocket-Clientに依存します。 urllib3 2.0を使用する場合は、python 3.10+が必要ですurllib3<2
Tesla
クラスは、 requests_oauthlib.OAuth2Session
を拡張します。これは、 requests.Session
を拡張するため、API呼び出しを実行するために使用できるget()
やpost()
などのメソッドを継承します。モジュールの特性:
Teslapy 2.0.0+は、ヘッドレス認証を実装しなくなりました。コンストラクターは異なり、これらの議論を取ります。
口論 | 説明 |
---|---|
email | SSOアイデンティティ |
verify | (オプション)SSL証明書を確認します |
proxy | (オプション)プロキシサーバーのURL |
retry | (オプション)接続数を取得またはRetry インスタンス |
timeout | (オプション)タイムアウトを接続/読み取ります |
user_agent | (オプション)ユーザーエージェント文字列 |
authenticator | (オプション)関数リダイレクトURLを返す1つの引数、承認URL |
cache_file | (オプション)デフォルトのローダーとダンパーで使用されるキャッシュファイルへのパス |
cache_loader | (オプション)キャッシュDICTを返す関数 |
cache_dumper | (オプション)1つの引数を使用した機能、キャッシュディクト |
sso_base_url | (オプション)SSOサービスのURL、 https://auth.tesla.cn/ に設定 |
state | (オプション)CSRF保護のための状態文字列 |
code_verifier | (オプション)PKCEコード検証文字列 |
app_user_agent | (オプション)x-tesla-user-agent文字列 |
Teslapy 2.1.0+は、RFC 7523を実装しなくなり、すべてのAPIリクエストにSSOトークンを使用します。
クラスは、システムのデフォルトのWebブラウザーでテスラのSSOページを開き、認証します。認証が成功した後、見つかっていないページが表示され、URLはリダイレクトURLであるhttps://auth.tesla.com/void/callback
で開始する必要があります。クラスはstdio
使用して、デフォルトでWebブラウザーから完全なリダイレクトURLを取得します。 AQUIRERING APIトークンを継続するには、Webブラウザからコンソールに完全なURLをコピーして貼り付ける必要があります。 PywebviewやSeleniumを使用するなど、プラグ可能な認証方法を使用してこれを自動化できます。また、サードパーティ認証アプリで取得したSSOリフレッシュトークンを使用することもできます。
コンビニエンスメソッドapi()
endpoints.jsonにリストされている名前付きエンドポイントを使用して呼び出しを実行するため、APIが更新された場合、モジュールは変更を必要としません。 api()
URIのパス変数を置き、必要に応じてfetch_token()
を呼び出します。 APIによって返されるエラーメッセージは、 HTTPError
例外として提起されます。さらに、クラスは次の方法を実装しています。
電話 | 説明 |
---|---|
request() | 相対的または絶対的なURL、シリアル化、エラーメッセージ処理を使用してAPIコールを実行します |
new_code_verifier() | PKCEのコード検証剤を生成します |
authorization_url() | PKCE拡張機能を備えた承認URLをフォームし、登録された地域を検出しようとします |
fetch_token() | PKCE拡張機能を備えた承認コード助成金を使用してSSOトークンを要求します |
refresh_token() | 更新トークングラントを使用してSSOトークンを要求します |
close() | すべてのリクエストアダプターインスタンスを削除します |
logout() | キャッシュからトークンを削除し、ログアウトURLを返し、オプションでSystemのデフォルトのWebブラウザーを使用してサインアウトします |
vehicle_list() | 車両オブジェクトのリストを返します |
battery_list() | バッテリーオブジェクトのリストを返します |
solar_list() | SolarPanelオブジェクトのリストを返します |
Vehicle
クラスはdict
を拡張し、所有者APIによって返された車両データを保存します。これはプルAPIです。 get_vehicle_summary()
およびget_vehicle_data()
は、データをマージするVehicle
インスタンスを更新します。ストリーミングAPIは、サブスクリプション後に車両データを変更します。 stream()
メソッドは、オプションの引数、1つの引数で呼び出されるコールバック関数、変更されたデータを保持するDICTを実行します。 Vehicle
オブジェクトは、プッシュされたデータで常に更新されます。 10秒以内に変更がない場合、車両はデータのストリーミングを停止します。 stream()
メソッドには、再起動を制御するための2つのオプションの引数があります。さらに、クラスは次の方法を実装しています。
電話 | オンライン | 説明 |
---|---|---|
api() | はい | オプションの引数でbehey_idを必要とする名前付きエンドポイントにAPI呼び出しを実行します |
get_vehicle_summary() | いいえ | 車両の状態を取得します(オンライン、眠り、オフライン) |
available() | いいえ | 老化したときにキャッシュされたデータまたは更新されたステータスに基づいて車両がオンラインであるかどうかを確認します |
sync_wake_up() | いいえ | 目を覚まして、車両がオンラインになるのを待ちます |
decode_option() | いいえ | ルックアップオプションコード説明( option_codes.jsonから読む) |
option_code_list() 1 | いいえ | 車両オプションコードの既知の説明をリストします |
get_vehicle_data() | はい | 選択したエンドポイントの車両データを取得すると、デフォルトはすべてのエンドポイントになります |
get_vehicle_location_data() | はい | 車両の基本データと位置データを取得します |
get_nearby_charging_sites() | はい | 近くのテスラ操作充電ステーションをリストします |
get_service_scheduling_data() | いいえ | この車両の次のサービスの予約を取得します |
get_charge_history() 2 | いいえ | 車両充電履歴データポイントをリストします |
mobile_enabled() | はい | 車内でモバイルアクセス設定が有効になっているかどうかを確認します |
compose_image() 3 | いいえ | 車両オプションコードに基づいて車両イメージを作成します |
dist_units() | いいえ | 距離または速度ユニットを車両のGUI設定に変換します |
temp_units() | いいえ | 温度ユニットを車両のGUI設定に変換します |
gui_time() | いいえ | タイムスタンプまたは現在のタイムをGUI設定に戻します |
last_seen() | いいえ | 自然な時間を最後に見た車両を返します |
decode_vin() | いいえ | 車両の識別番号をDICTに解読します |
command() | はい | 車両コマンド応答エラー処理のためのapi() の周りのラッパー |
1つのオプションコードは非推奨に見えます。
2 CARソフトウェアバージョン2021.44.25以下の必要に応じて、データ共有を有効にする必要があり、主要な車両所有者でなければなりません。
3この方法に車両オプションコードをパスすると、オプションコードが非推奨になりました。
車両が眠っているかオフラインであるとき、オンライン列にない方法のみが利用可能です。これらの方法では、車両が睡眠を妨げることはありません。その他の方法とAPI呼び出しでは、 sync_wake_up()
使用して車両をオンラインで持ち込む必要があり、短い期間内に呼び出された場合、車両が睡眠を防ぐことができます。
Product
クラスはdict
を拡張し、APIによって返されるPowerwallとソーラーパネルの製品データで初期化されます。さらに、クラスは次の方法を実装しています。
電話 | 説明 |
---|---|
api() | オプションの引数を使用してBattery_idまたはSite_idを必要とする名前付きエンドポイントにAPI呼び出しを実行します |
get_history_data() | 製品のライブステータスを取得します |
get_calendar_history_data() | 製品のライブステータスを取得します |
command() | バッテリーコマンド応答エラー処理のためのapi() のラッパー |
Battery
クラスはProduct
を拡張し、 get_battery_data()
によって更新されたAPIによって返されるPowerWallデータを保存します。さらに、クラスは次の方法を実装しています。
電話 | 説明 |
---|---|
get_battery_data() | バッテリーの詳細な状態と構成を取得します |
set_operation() | バッテリー操作をSelf_Consumption、バックアップ、または自律に設定します |
set_backup_reserve_percent() | そのバッテリーの最小バックアップリザーブパーセントを設定します |
set_import_export() | バッテリーグリッドのインポートとエクスポートの設定を設定します |
get_tariff() | 関税率データを取得します |
set_tariff() | 関税率データを設定します。データは手動で作成することも、create_tariffによって生成することもできます |
create_tariff() | 関税データの正しくフォーマットされた辞書を作成します |
SolarPanel
クラスはProduct
を拡張し、 get_site_data()
によって更新されたAPIによって返されるソーラーパネルデータを保存します。さらに、クラスは次の方法を実装しています。
電話 | 説明 |
---|---|
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()
を自動的に呼び出します。この例は、テスラピー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
引数は、属性としてもアクセスできます。
例SSOページを独自のネイティブGUIウィンドウに表示するWebViewコンポーネントを使用しています。
import teslapy
import webview
def custom_auth ( url ):
result = [ '' ]
window = webview . create_window ( 'Login' , url )
def on_loaded ():
result [ 0 ] = window . get_current_url ()
if 'void/callback' in result [ 0 ]. split ( '?' )[ 0 ]:
window . destroy ()
window . loaded += on_loaded
webview . start ()
return result [ 0 ]
with teslapy . Tesla ( '[email protected]' , authenticator = custom_auth ) as tesla :
tesla . fetch_token ()
SELENIUMを使用して、Webブラウザの相互作用を自動化する例。 SSOページは、 navigator.webdriver
が設定されているときに403を返します。現在、Chrome、Opera、およびEdge Chromiumのみがこれを防ぐことができます。
import teslapy
from selenium import webdriver
from selenium . webdriver . support import expected_conditions as EC
from selenium . webdriver . support . ui import WebDriverWait
def custom_auth ( url ):
options = webdriver . ChromeOptions ()
options . add_argument ( "--disable-blink-features=AutomationControlled" )
with webdriver . Chrome ( chrome_options = options ) as browser :
browser . get ( url )
WebDriverWait ( browser , 300 ). until ( EC . url_contains ( 'void/callback' ))
return browser . current_url
with teslapy . Tesla ( '[email protected]' , authenticator = custom_auth ) as tesla :
tesla . fetch_token ()
Teslapy 2.2.0は、SSOページURLを取得するためのauthorization_url()
メソッドと、認証後にfetch_token()
にキーワード引数authorization_response
としてリダイレクトされたURLを提供するオプションを導入しました。
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+は、サードパーティ認証アプリによって取得された更新トークンの使用をサポートしています。更新トークンはアクセストークンを取得するために使用され、両方とも永続性のためにキャッシュされているため、リフレッシュトークンを1回だけ供給する必要があります。
import teslapy
with teslapy . Tesla ( '[email protected]' ) as tesla :
if not tesla . authorized :
tesla . refresh_token ( refresh_token = input ( 'Enter SSO refresh token: ' ))
vehicles = tesla . vehicle_list ()
print ( vehicles [ 0 ])
システムのデフォルトのWebブラウザを使用してSSOページからサインアウトし、キャッシュからトークンをクリアするには:
tesla . logout ( sign_out = True )
pywebviewを使用している場合、キャッシュからトークンをクリアし、ログアウトURLを取得してサインアウトウィンドウを表示できます。
window = webview . create_window ( 'Logout' , tesla . logout ())
window . start ()
SeleniumはCookieを保管せず、キャッシュからトークンをクリアするだけです。
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は、非所有者APIエンドポイントにアクセスするための絶対URLサポートを導入しました。
from teslapy import Tesla
with Tesla ( '[email protected]' ) as tesla :
vehicles = tesla . vehicle_list ()
url = 'https://akamai-apigateway-vfx.tesla.com/safety-rating/daily-metrics'
print ( tesla . get ( url , params = { 'vin' : vehicles [ 0 ][ 'vin' ], 'deviceLanguage' : 'en' ,
'deviceCountry' : 'US' , 'timezone' : 'UTC' }))
Teslapyは、デフォルトで10秒の調整可能な接続と読み取りタイムアウトを使用します。詳細については、タイムアウトセクションを参照してください。 Teslapyは、defaultで失敗したり、タイミングで接続されたりすることはありません。これは、 retry
パラメーターで有効にできます。
tesla = teslapy . Tesla ( '[email protected]' , retry = 2 , timeout = 15 )
ネットワーク障害を考慮した堅牢なプログラムには、再試行の試みの総数、再試行のためのHTTP応答コード、およびオプションでバックオフファクターが含まれます。詳細については、Retryモジュールを参照してください。
サーバーをあまりにも強すぎる場合、テスラは一時的にアカウントをブロックする可能性があることに注意してください。
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 、真夜中を過ぎて数分 |
スケジューリング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 0 close 、 0 |
actuate_trunk | which_trunk | rear またはfront |
remote_start | ||
trigger_homelink | lat 、 lon | 現在の怠慢とロジット |
Charge_port_door_open | ||
Charge_port_door_close | ||
start_charge | ||
STOP_CHARCH | ||
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桁のピン |
reset_valet_pin | ||
speed_limit_activate | pin | 4桁のピン |
speed_limit_deactivate | pin | 4桁のピン |
speed_limit_set_limit | limit_mph | 50-90の間 |
speed_limit_clear_pin | pin | 4桁のピン |
schedule_software_update | offset_sec | 秒 |
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に設定します。
2 close
車の現在の場所の近くにlat
とlon
値が必要です。
基本的な例外処理:
try :
vehicles [ 0 ]. command ( 'HONK_HORN' )
except teslapy . HTTPError as e :
print ( e )
すべてのrequests.exceptions
とoauthlib.oauth2.rfc6749.errors
エラークラスはモジュールによってインポートされます。車両が眠っているかオフラインであり、APIエンドポイントを実行するために車両をオンラインにする必要がある場合、次の例外が提起されます: requests.exceptions.HTTPError: 408 Client Error: vehicle unavailable
。例外は、 teslapy.HTTPError
としてキャッチできます。
さらに、 sync_wake_up()
指定されたタイムアウト内で車両がオンラインになっていない場合、 teslapy.VehicleError
を上げます。また、 command()
、車両コマンド応答の結果がFalse
いる場合にteslapy.VehicleError
を上げます。たとえば、メディアエンドポイントの1つが呼び出され、車両にユーザーが存在しない場合、次の例外が掲載されています: VehicleError: user_not_present
。
2021年1月29日現在、Teslaはこのエンドポイントを更新してRFC 7523を追跡し、認証のためにSSOサービス(auth.tesla.com)を使用する必要があります。 requests.exceptions.HTTPError: 400 Client Error: endpoint_deprecated:_please_update_your_app for url: https://owner-api.teslamotors.com/oauth/token
は、おそらくこのモジュールの古いバージョンを使用しているでしょう。
2021年9月3日の時点で、テスラはログインフォームにRecaptchaを追加しました。これにより、Teslapyによって実装されたヘッドレスログインが壊れました。 ValueError: Credentials rejected. Recaptcha is required
あり、正しい資格情報を使用している場合、おそらくこのモジュールの古いバージョンを使用しているでしょう。
2022年1月12日現在、テスラはRFC 7523トークンの使用を非難しており、SSOトークンをAPIアクセスに使用する必要があります。 requests.exceptions.HTTPError: 401 Client Error: Unauthorized for url: https://owner-api.teslamotors.com/api/1/vehicles
と、正しい資格情報を使用している場合、おそらく古いバージョンの古いバージョンを使用している場合このモジュール。
2024年1月7日の時点で、テスラはVehicle_Listエンドポイントを削除しました。 requests.exceptions.HTTPError: 412 Client Error: Endpoint is only available on fleetapi. Visit https://developer.tesla.com/docs for more info
、おそらくこのモジュールの古いバージョンを使用している可能性があります。
ソースリポジトリには、Pywebviewバージョン3.0以降またはSeleniumバージョン3.13.0以降をオプションで使用してWebloginを自動化する3つのデモアプリケーションが含まれています。エッジクロムには、セレン4.0.0以上が必要です。
Cli.pyは、Teslapyモジュールのほぼすべての機能を使用できる単純なCLIアプリケーションです。フィルターオプションを使用すると、複数の製品がアカウントにリンクされている場合は、製品を選択できます。 API出力はJSONフォーマットされています:
usage: cli.py [-h] -e EMAIL [-f FILTER] [-a API [KEYVALUE ...]] [-k KEYVALUE]
[-c COMMAND] [-t TIMEOUT] [-p PROXY] [-R REFRESH] [-U URL] [-l]
[-o] [-v] [-w] [-g] [-b] [-n] [-m] [-s] [-d] [-r] [-S] [-H] [-V]
[-L] [-u] [--chrome] [--edge]
Tesla Owner API CLI
optional arguments:
-h, --help show this help message and exit
-e EMAIL login email
-f FILTER filter on id, vin, etc.
-a API [KEYVALUE ...]
API call endpoint name
-k KEYVALUE API parameter (key=value)
-c COMMAND product command endpoint
-t TIMEOUT connect/read timeout
-p PROXY proxy server URL
-R REFRESH use this refresh token
-U URL SSO service base URL
-l, --list list all selected vehicles/batteries
-o, --option list vehicle option codes
-v, --vin vehicle identification number decode
-w, --wake wake up selected vehicle(s)
-g, --get get rollup of all vehicle data
-b, --battery get detailed battery state and config
-n, --nearby list nearby charging sites
-m, --mobile get mobile enabled state
-s, --site get current site generation data
-d, --debug set logging level to debug
-r, --stream receive streaming vehicle data on-change
-S, --service get service self scheduling eligibility
-H, --history get charging history data
-B, --basic get basic vehicle data only
-G, --location get location (GPS) data, wake as needed
-V, --verify disable verify SSL certificate
-L, --logout clear token from cache and logout
-u, --user get user account details
--chrome use Chrome WebDriver
--edge use Edge WebDriver
Cli.pyの使用例:
python cli.py -e [email protected] -w -a ACTUATE_TRUNK -k which_trunk=front
Menu.pyは、車両データを表形式で表示するメニューベースのコンソールアプリケーションです。アプリケーションは、GPS座標を人間の読み取り可能なアドレスに変換するためのジオピーに依存します。
GUI.pyは、 tkinter
を使用したグラフィカルユーザーインターフェイスです。 API呼び出しは、スレッドを使用して非同期に実行されます。 GUIは、車両データの自動リフレッシュをサポートし、構成された車両画像を表示します。自動更新が有効になっている場合、車両は眠りにつかないことに注意してください。アプリケーションは、GPS座標を人間の読み取り可能なアドレスに変換するためのGeopyに依存します。 PythonのインストールのTCL/TK GUIツールキットバージョンが8.6未満の場合、車両の画像を表示するには枕が必要です。認証に使用するWebブラウザーなどのユーザーの好みは、アプリケーションの再起動時に持続します。
車両の充電履歴もグラフに表示できます。
デモアプリケーションは、提供された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.pyまたはgui.pyを実行します。 .0+(オプション)およびWebSocket-Client 0.59+は、次のようにPIPを使用しています。
python -m pip install requests_oauthlib geopy pywebview selenium websocket-client
Chromedriverをインストールして、次のようにセレンまたはUbuntuで使用します。
sudo apt-get install python3-requests-oauthlib python3-geopy python3-webview python3-selenium python3-websocket