Morning Girl

Web API, Windows, C#, .NET, Dynamics 365/CRM etc..

Tesla API(Mock)カスタムコネクタを作成する:PowerApps / PowerAutomate

最近あまりにも Tesla API を触りたい衝動が抑えきれず、 Mock の API Serverを作りました。作り方は以下の記事で公開しています。

kageura.hatenadiary.jp

この Mock Server ですが、実装はOpenAPI で作成していますので、PowerApps/ PowerAutomateのコネクタとしても利用できます。

結構色んなコマンドが用意されていて面白いので、実際に試してみました。

どんなことができるようになるの?

f:id:sugimomoto:20200121235116p:plain

一応Unofficial Reference で公開されている50エンドポイントは全部網羅しています!

なので、バッテリーのチャージ状況から、シートヒーター、近くの充電サイトまで取れる!(ダミーデータだけど!)

さらにアラートでフラッシュライトしたり、ドアのロック・アンロック、最高時速制限の設定から、サンルーフの開け締め、空調システムで温度を上げたり、メディアコントロール、ソフトウェア・アップデートまで、APIでできる!(Mockだけど!

おそらく以下のアプリで実施できることは、ほとんど実施できると思います。しかもそれを PowerApps でカスタマイズしたアプリにできる!

https://apps.apple.com/jp/app/tesla/id582007913

f:id:sugimomoto:20200120222932p:plain

【機能一覧】

  • 充電状況をリアルタイムで確認し、充電を開始または停止する
  • 運転前に車両の暖房/冷房を入れる (ガレージ内でも可能)
  • 遠隔からロックまたはロック解除する
  • 車の現在地を確認したり、動きを追跡する
  • お気に入りのアプリから目的地を送信し、ナビを開始します
  • 同乗者はすばやくメディアをコントロールすることができます
  • 駐車場で車のライトを点滅したりホーンを鳴らしたりして車両を見つける
  • パノラマ ルーフを開閉する
  • 車両をガレージまたは狭い駐車スペースから呼び出す(オートパイロット搭載車用
  • どこにいても車両のソフトウェアをアップデートできます
  • パワーウォールへのソーラーからの充電量、家庭でのエネルギー使用量、系統への売電量をモニターする
  • ソーラー発電量とバッテリー消費データをダウンロード

カスタムコネクタの作り方

それでは実際に作り方・使い方を見ていきましょう。

カスタムコネクタの元となる「OpenAPI Spec v2.0」のファイルは以下のURLで公開しています。

https://github.com/sugimomoto/Tesla.API.Mock/blob/master/tesla-api.v1.yaml-Swagger20.json

現状、デフォルトでは私が作成した Mock API に接続するようになっていますが、ちゃんと Tesla 本体にも接続できる、、、はず! です。

実際の Tesla に接続する場合の手順は後述します。

カスタムコネクタの作成

カスタムコネクタの作成はすごく簡単です。

PowerAppsの画面に移動して、「カスタムコネクタ」→「OpenAPI ファイルをインポートします」を選択します。

f:id:sugimomoto:20200121235127p:plain

コネクタ名は任意の名称を入力し、ダウンロードしておいた、OpenAPI Specファイルをインポートします。

f:id:sugimomoto:20200121235134p:plain

全般は基本的に変更不要です。アイコンはどこからか引っ張ってくると映えます。

f:id:sugimomoto:20200121235140p:plain

認証部分は Mock API に接続する場合は不要です。

f:id:sugimomoto:20200121235145p:plain

アクション定義も基本的にほぼそのまま動きます。なので、そのままコネクタの作成をクリックすればOKです。

f:id:sugimomoto:20200121235150p:plain

あとは適当に接続を作成して、GET系でテストを実行するとデータが取得できます。なお、車両IDが求められますが、MockAPIは値が存在することしか確認しないので適当な文字列でOKです。

f:id:sugimomoto:20200121235156p:plain

カスタムコネクタを使ってみる

それでは作成したカスタムコネクタをPowerAppsのキャンパスアプリで使ってみます。

f:id:sugimomoto:20200121235202p:plain

キャンパスアプリを作成したら、データソースとして先程作成したカスタムコネクタを選択します。

f:id:sugimomoto:20200121235207p:plain

あとは、任意のオブジェクトにコネクタから取得したデータを紐付けていくだけです。例えばバッテリーレベルを取得したい場合は、以下のようなリクエストを行います。

  • TeslaAPI.getapi1vehiclesiddatarequestchargestate("id").response.battery_level

そんな機能を駆使して、以下のようにバッテリーレベルをそれっぽく表示してみました。

f:id:sugimomoto:20200121235213p:plain

調子にフラッシュライトのボタンも実装しました! 実装しましたが、実際にテスラは動きません!

f:id:sugimomoto:20200121235220p:plain

ちょっと寂しいです!

実際に Tesla に接続する場合

それでは続いて実際の Tesla に接続する場合の手順について解説します。

綿入はリファレンスをベースにしているので、実際に Tesla も Tesla のアプリにも触っていませんが、まあたぶん動くでしょう。

ただ、カスタムコネクタとして実際のTesla APIに接続するためにいくつか制御が抜けているので、その点を解説しておきます。

URLの設定

接続先のURLが現在 Mock API ServerのURLになっているので、これを「https://owner-api.teslamotors.com/」に変更します。

f:id:sugimomoto:20200121235227p:plain

AccessTokenを取得する

Tesla は このBlog記事 でも述べている通り、Oauth 2.0 の Password グラントで 接続するためのAccessTokenを取得します。

現在、カスタムコネクタの標準機能として提供されている認証アプローチは OAuth2.0 の Grant Type のうち「Authorization Code」しか対応していませんので、今回のTesla APIでは利用することができません。

なので、予めアクションとして定義されているTokenエンドポイントを使って、マニュアルでログイン処理を行い、AccessTokenを取得する必要があります。

https://orgopenapitools20200118014702.azurewebsites.net/swagger/index.html

f:id:sugimomoto:20200121235235p:plain

ちなみにカスタムコネクタを使って AccessToken を取得することもできるのですが、動的にAuthorizationヘッダーを指定することができないため、「AccessToken取得」→「カスタムコネクタの接続作成」みたいなことを繰り返す必要があり、あまりUX的によろしくありません。

サンプルデータを見る限り、AccessTokenのExpireは45日(3888000秒)っぽいので、ドキュメント上から取得して、PowerAppsで使う場合は、現状Expireしたら切り替えるくらいが良さげかもです。

認証の設定

最後に取得したAccessTokenを指定する認証部分を定義します。カスタムコネクタの認証タイプから「APIキー」を選択し、パラメータ名をAuthorization:パラメータの場所をヘッダーにします。

f:id:sugimomoto:20200121235243p:plain

これでOKです。

あとは、接続作成の時に、事前に取得したAccessTokenを元に、「Bearer 」と入力するだけです。

f:id:sugimomoto:20200121235249p:plain

おわりに

これで本物のテスラが手に入っても問題なし!

とは言いつつも、やっぱりちゃんと本物のテスラにつながって動くのかどうかは不安なので、もしテスラをお持ちで、実際に試したいという方が居ましたらお気軽に連絡ください。(@sugimomoto)