こんにちは。CData Software Japan リードエンジニアの杉本です。
さて、今回は趣味のお話です。
以前私の個人Blog では度々Tesla のAPI について取り上げてきていました。
https://kageura.hatenadiary.jp/entry/teslaapihowtouse
とっても楽しいAPI なんですが、このAPI、Blog でも繰り返しお話している通り、テスラモバイルアプリの内部で利用されているAPI をリバースエンジニアリングして仕様を明らかにしたアンオフィシャルなAPI であり、サードパーティが利用することを想定して作られているわけではありませんでした。
そのため、API 用のAccess Token はかなり強力な権限になっていて、位置情報が見えるのはもちろんのこと、鍵の開け締めもできてしまうので、サードパーティ開発もそれなりに盛んに行われていたものの、結構自己責任で怖いものではありました。
TeslaFi など便利なものがあるんですけどね。
https://www.teslafi.com/firmware.php
しかしながら、今年10月末にとうとうテスラは公式開発者API を正式に導入、公開しました! 結構各所で話題になったので、このニュースを見た方も多かったのではないかなと思います。
https://www.infoq.com/jp/news/2023/11/tesla-developer-apis/
以下のページでAPI ドキュメントが「Fleet API」という名称で公開されています。
https://developer.tesla.com/docs
とはいえ、機能的には以前のアンオフィシャルなAPI(といっても、公式アプリが使っているAPIではありましたが)を踏襲されたものになっているので、できることが大きく変わったわけでは無い感じです。仕様も似たようなもの。
ただ、API リクエストを実際に実施するまでの手順、アプリ登録やOAuth周りのハンドリングが大きく代わりましたので、今回は改めて正式に、このTesla API を使う手順を紹介したいと思います!
環境の入手
一番最初にこのAPI を試す上で必要なことはなんでしょうか? それは、間違いなく環境構築ですね!
一見、この環境構築は大変なように見えますが、安心してください。テスラの環境構築はオンラインでわずか数クリックするだけで、すべて完結します。ちょっと費用は必要ですが、Azure やAWS を使うみたいなものです(暴言)
以下に割引が受けられる私の紹介コードのリンクを掲載しておきます。(最大 ¥33,750 割引と 3ヶ月間のエンハンスト オートパイロットが付いてくるらしいです)
リンク先に移動したら、言語を選んだ上で、使いたい環境(モデル)を選びましょう。
https://ts.la/kazuya99717
あとは必要な機能を選択して、注文ボタンをクリックすれば(途中クレジットカードなる情報の入力などは必要になりますが)、現在だと最短で来年1月には開発環境(本番環境としても利用可能)がデプロイできます。簡単ですね。
なお、多少費用がかかってしまいますので(Model S3のRWDの場合、5年ローン換算で1日あたり3130円)、社内や家庭の稟議申請が困難な場合は、以下の私のBlog で紹介しているようにMock API を自作して試す方法もあります。
https://kageura.hatenadiary.jp/entry/teslaapi
ただし、これを試すと高確率で本番環境をデプロイしたくなる(体験談)ので注意しましょう。
テスラアカウントの作成
環境を入手したら、テスラアカウントを準備しましょう。このアカウントを使って、API リクエストのために必要なOAuth のアプリケーション登録を行っていきます。
環境を入手している場合、すでにテスラアカウントは作っているものと思います。
しかしながら、環境は持っていなくても、アカウント作成は可能なので、おそらくアプリ作成はどんな人でも可能なのではないか? と思います。
以下のサインインから「アカウントを作成」に移動し
https://www.tesla.com/ja_jp/
必要情報を入力して、アカウントを作成しましょう。
アプリケーションリクエストの作成
アカウントを作成したら、デベロッパーポータルからAPI アクセス用のアプリを登録します。
以下のURLにアクセスして最初に利用規約に同意します。
ちなみに、「Tesla APIs are temporarily free during this trial period.」と書かれているように、現状Tesla API 無料トライアル中みたいです。
https://developer.tesla.com/dashboard
API 仕様書には現在Membership Tiers として無料のもののみが記載されています。今後このあたりがサードパーティ利用の場合の費用などとして出てくるのかな? と思います。
https://developer.tesla.com/docs/fleet-api#membership-tiers
利用規約に同意したら、アプリケーションのアクセスリクエストの作成を進めることができます。
最初に会社情報などを入力する画面が出てきます。私は今回個人として利用するので、個人の住所などを入力して進めました。
次に作成するOAuth アプリの情報を入力します。ちなみにアプリは複数作成することが可能なので、お試しの場合は一旦テスト用の内容だけで良いでしょう。
次にアクセス許可を与えるアプリのURLやOAuth のリダイレクトURLなどを入力します。これらの情報は後ほど変更することが可能です。一旦localhostなどダミーの情報入力でも良いでしょう。
最後にどの対象となるAPI のスコープを設定します。テスト用であれば、とりあえず検証用にすべてつけておいていいかなと思います。
これでリクエストが完了です。なお、アプリリクエストはテスラ側から許可を受ける必要があるみたいで、5営業日以内で許可されるようです。私のときは1日くらいでさくっと許可されたかな? と思います。
アプリケーションが許可されると、以下のようにステータスがActive になり
アプリの情報と
OAuth 2.0 の取り回しに必要なClientId・ClientSecret が払い出されます。
Public Key・Private Key ペアを作成・ホストする
アプリ登録が完了したので、これでOAuth の認証認可を行って、としたいところですが、Tesla API にはその前のステップとしてVehicle Commands(エアコンのON/OFFやキーの開け締めのコマンド等)を実行するために公開キー・秘密キーを利用したプロセスが必要になります。
https://developer.tesla.com/docs/fleet-api#public_key
まずは「secp256r1」を使ってPEMにエンコードされた公開キーを作成します。
openssl ecparam -name prime256v1 -genkey -noout -out private.pem
openssl ec -in private.pem -pubout -out public.pem
公開キーの名前は「com.tesla.3p.public-key.pem」に変更しておきます。
さらにこの公開キーはTesla APIのサーバー側からアクセスできるWebサイト環境(.well-known配下)にホスティングされていなければいけないというちょっと面倒な制約があります。
ちなみにホスティングされている環境はHTTPSがもちろん必須、かつパスが「https://xxx.domain/.well-known/appspecific/com.tesla.3p.public-key.pem」というパスで無ければいけません。
そのため、最初はGithub Pagesのようなサービスでホストすればいいかなーと思ったのですが、無駄なパスが含まれたり、.well-known パスが作れなかったりと結構面倒でした。
というわけでこの辺はみなさんが慣れている環境を利用すれば良いと思いますが、最終的に私は「Azure Static Web Apps」を利用して公開キーをホストしました。
https://azure.microsoft.com/ja-jp/products/app-service/static
Azure Static Web Apps 以下のクイックスタートで簡単に試すことができます。
https://learn.microsoft.com/ja-jp/azure/static-web-apps/getting-started?tabs=vanilla-javascript
クイックスタートでサイトを公開したら「src」配下で「.well-known/appspecific/com.tesla.3p.public-key.pem」で作成したPEMキーを追加して、公開します。
ホスティングが完了したらそのアドレスを予め作成しておいたアプリの「Allowed Origin」に登録しておきます。以下を編集して書き換えましょう。
そして、このドメインをTesla API を通じて登録します。ただ、この登録APIをコールするためにOAuth 2.0 のアクセストークンが必要になるので、Client Credentials Grant でアクセストークン(パートナー認証トークン)を取得します。
POST /oauth2/v3/token HTTP/1.1
Host: auth.tesla.com
Content-Type: application/x-www-form-urlencoded
grant_type=client_credentials&client_id=XXXXX&client_secret=XXXXX&scope=openid%20vehicle_device_data%20vehicle_cmds%20vehicle_charging_cmds&audience=https%3A%2F%2Ffleet-api.prd.na.vn.cloud.tesla.com
あとは「/partner_accounts」エンドポイントに対して、POSTリクエストでPEMキーが公開されているWebSiteのドメインを登録します。
POST /api/1/partner_accounts HTTP/1.1
Host: fleet-api.prd.na.vn.cloud.tesla.com
Content-Type: application/json
Authorization: Bearer {{取得したパートナー認証トークン}}
{"domain":"XXXXXXXXXXX.azurestaticapps.net"}
サードパーティトークンを生成
これで、ようやくAPI を試すためのOAuth 2.0 認証・認可プロセスを回すことができるようになりました。
ここからが普段皆さんも行っているOAuth 2.0 の取り回しかなと思います。
https://developer.tesla.com/docs/fleet-api#authentication
なお、Tesla Fleet API のAuthorization Code Grant は認可コード横取り攻撃を対策するための、OAuth2.0の拡張仕様であるPKCE付きです。
しかし、我らがPostman ならAuthorization 機能を使えば、よしなにそのあたりをハンドリングして、Token を取得してくれます。嬉しいですね。
細かいパラメータは以下のとおりです。
Property
|
Value
|
Memo
|
Token Name
|
Tesla Fleet API
|
任意の名前を指定
|
Grant type
|
Authorization Code (With PKCE)
|
|
Callback URL
|
https://oauth.pstmn.io/v1/callback
|
Authorize using browser を有効化しておきます
|
Auth URL
|
https://auth.tesla.com/oauth2/v3/authorize
|
|
Access Token URL
|
https://auth.tesla.com/oauth2/v3/token
|
|
Client ID
|
作成したアプリのClient IDを指定
|
|
Client Secret
|
作成したアプリのClient Secret を指定
|
|
Code Challenge Method
|
SHA-256
|
|
Code Verifier
|
Automatically generated
|
|
Scope
|
openid offline_access vehicle_device_data vehicle_cmds vehicle_charging_cmds
|
|
State
|
(empty)
|
|
Client Authentication
|
Send client credentials in body
|
|
実行する前に作成したアプリの「Allowed Redirect URI(s)」に「https://oauth.pstmn.io/v1/callback」を加えておきましょう。
入力が完了したら「Get New Access Token」をクリックします。
するとブラウザが立ち上がり、TeslaアカウントへのログインおよびAPIへのアクセス許可(認可)画面が出てくるので、必要なアクセス許可を選択して、「許可」をクリックします。
これで、Access Token の取得が完了です!
API を使って車両データを取得・操作をしてみる
それでは実際にAPI を使って車両データを取得してみましょう!
まず認可したユーザーが保有する車両の情報は以下の「/api/1/vehicles」を使って取得できます。
GET /api/1/vehicles HTTP/1.1
Host: fleet-api.prd.na.vn.cloud.tesla.com
Authorization: Bearer {{サードパーティトークン}}
車両のIDやVINコード、車両の状態(State)、APIバージョンなどが取得できますね。Stateが現在「asleep」になっているので、これで休止状態かどうかが確認できます。
ちなみに一番目を引くOption Codesは車両のリージョンやモデルなどがわかる情報みたいです。
https://tesla-api.timdorr.com/vehicle/optioncodes
もう少し詳しく車両の状態を知りたい場合は車両のIDを使って、「GET /vehicles/{{id}}/vehicle_data」にリクエストを送ります。ただし、車両がOfflineやAsleepの状態だと取得することができません。
なので一度「POST /vehicles/{{id}}/wake_up」をリクエストして、車両を起動状態にします。(リアルに起動するので、電池の残量などには要注意)
これで起動した後、改めて「GET /vehicles/{{id}}/vehicle_data」をリクエストすると、以下のように現在のバッテリーの状態や位置情報などが取得できます。
エアコンを起動したい場合は「POST /vehicles/{{id}}/command/auto_conditioning_start」です。
動いているところじゃないとイメージが湧きにくいかもですが、これで以下のようにエアコンが起動します。
認可したサードパーティ製アプリの管理
アクセス許可を行ったサードパーティ製アプリは、Teslaのアカウント設定の「セキュリティ」→「サードパーティ製アプリ」で確認・管理・削除ができます。
以前のアンオフィシャルAPI だと、パスワードを変更するくらいしか対応ができなかったので、大変ありがたいですね。
おわりに
というわけで、まずは簡単な使い方を解説してみました。
まだ試せていませんが、次回はCData Driver を使ってリクエストする方法を紹介できればなーと思っています。
なお、本記事は「Postman Advent Calendar 2023」の6日目の記事でした!
https://qiita.com/advent-calendar/2023/postman
関連コンテンツ