経緯
2016/6に予約したModel3がようやく2019/11に納車しました。(九州)
車両本体も斬新でいろいろ遊んでみたのですが、いろいろ調べているうちにAPIを叩けることが判明したので、Pythonでコードを書いてみました。
公開されているAPI
いずれもTeslaは非公認のようですが、以下のサイトにAPIについてまとめられています。
何ができる
GETでは緯度・経度・車の向き・バッテリー情報・走行距離などが取得できます。
POSTではフラッシュライトやロック・アンロック・トランクオープンなどが操作できます。
詳しくは上記サイトをご確認ください。
サモン(実際に車を動かす)は今回紹介するコマンドでは難しそうです。別に仕組みがあるようですが...。
できたらまた紹介します。
コードについて
APIを叩くのにrauth、タイムスタンプを変換するのにpandasを使用しています。
ユーザーIDとパスワードをそれぞれteslaID, passwordに設定するだけです。
あとは必要なURLを設定すればGET、POSTとも容易に叩けます。
たまに通信に失敗することがあるようなので例外処理をしています。
コードでは以下の項目のGET・POSTを行います。
先ほどのAPIを紹介するサイトを参考に、'drive_state'と'latitude'の文字列を変更すればGET/POST可能です。
GET:緯度・経度・タイムスタンプ・バッテリーレベル・バッテリーレンジ・オドメーター
POST:フラッシュライト
import json
import pandas as pd
from rauth import OAuth2Service
def tesla():
teslaID = '**********'
password = '**********'
try:
# 設定
service = OAuth2Service(
client_id = '81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384',
client_secret = 'c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3',
access_token_url = "https://owner-api.teslamotors.com/oauth/token",
authorize_url = "https://owner-api.teslamotors.com/oauth/token",
base_url = "https://owner-api.teslamotors.com/",
)
data = {"grant_type": "password",
"client_id": '81527cff06843c8634fdc09e8ac0abefb46ac849f38fe1e431c2ef2106796384',
"client_secret": 'c7257eb71a564034f9419ee651c7d0e5f7aa6bfbd18bafb5c5c033b093bb2fa3',
"email": teslaID,
"password": password}
session = service.get_auth_session(data=data, decoder=json.loads)
access_token = session.access_token
my_session = service.get_session(token=access_token)
url = 'https://owner-api.teslamotors.com/api/1/vehicles/'
vehicles = my_session.get(url).json()['response'][0] # 複数の車がある場合は番号を変更
mycar = vehicles['id_s'] # 車 ID(文字列)を取得
# ======== GET ========
url_drive_state = "https://owner-api.teslamotors.com/api/1/vehicles/{:}/data_request/{:}".format(mycar, 'drive_state')
resp = my_session.get(url_drive_state).json()
timestamp = int(resp['response']['timestamp'] / 10**3)
print("timestamp:",pd.Timestamp(timestamp, unit='s', tz='Asia/Tokyo'))
print("緯度:",resp['response']['latitude'])
print("経度:",resp['response']['longitude'])
url_charge_state_state = "https://owner-api.teslamotors.com/api/1/vehicles/{:}/data_request/{:}".format(mycar, 'charge_state')
resp = my_session.get(url_charge_state_state).json()
print("battery_level:",resp['response']['battery_level'])
print("battery_range:",resp['response']['battery_range'] * 1.60934)
url_vehicle_state = "https://owner-api.teslamotors.com/api/1/vehicles/{:}/data_request/{:}".format(mycar, 'vehicle_state')
resp = my_session.get(url_vehicle_state).json()
print("odometer:",resp['response']['odometer'] * 1.60934)
# ======== POST ========
url_command = "https://owner-api.teslamotors.com/api/1/vehicles/{:}/command/{:}".format(mycar, 'flash_lights')
resp = my_session.post(url_command).json()
print(resp['response'])
return
except:
print("no response")
return
if __name__ == '__main__':
tesla()
実行結果
PS C:> python testTeslaAPI.py
timestamp: 2019-12-14 19:19:53+09:00
緯度: 33.****
経度: 130.****
battery_level: 69
battery_range: 257.0759716
odometer: 1260.1419274069199
{'reason': '', 'result': True}
※緯度経度は伏字にしています。
使用目的
このコードを応用してAWSのcloud9上で動かして一定時間ごとにAPIを叩いています。バッテリーレンジが動いたらCSVに吐き出すようにしているので、車を動かしたりバッテリーを充電したりしたら記録が残るようにしています。
僕の車はスタンダードレンジプラスですが、ひと月乗った感触だと、上手に走ればフル充電で400km走りそうです。
ただ、エアコンはかなりバッテリーを消耗します。ヒートシーターはさほど消耗しない模様。
紹介コード
この紹介コードを使ってTesla車を購入するとスーパーチャージャー1500km相当分の無料充電利用特典がもらえますので、ぜひご利用ください。