Upgrade to Pro — share decks privately, control downloads, hide ads and more …

Tesla API Hack! Power Platform から Tesla API を使...

Tesla API Hack! Power Platform から Tesla API を使ってみよう

Kazuya Sugimoto

November 28, 2020
Tweet

More Decks by Kazuya Sugimoto

Other Decks in Technology

Transcript

  1. © 2020 CData Software Japan, LLC | www.cdata.com/jp Mock API

    叩いても、カスタムコネクタを作っても、 検証できなきゃ寂しくない︖ バッテリー減らない ⾛⾏距離変わらない 電源⼊らない 位置情報はずっとUS
  2. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    Hack! Power Platform から Tesla API を使ってみよう .NET ラボ 2020/11⽉ CData Software Japan Kazuya Sugimoto -Lead Engineer
  3. © 2020 CData Software Japan, LLC | www.cdata.com/jp CData Software

    Japan の API holic 担当 年100種類以上のAPIを⾒たり触ったりしています。 Twitter︓@sugimomoto Facebook︓sugimomoto Blog︓http://kageura.hatenadiary.jp/ About Speaker Horizontal SaaS 647種類のAPI提供状況を調査︓そこから⾒えてきた国 産 SaaS APIの今 https://www.cdatablog.jp/entry/horizontalsaasapi
  4. © 2020 CData Software Japan, LLC | www.cdata.com/jp 本⽇のゴール Power

    Platformを通じて Tesla API の⾯⽩さ・可能性を感じてもらう︕
  5. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla(会社)とは︖ ・⼆次電池式電気⾃動⾞と電気⾃動⾞関連商

    品、ソーラーパネルや蓄電池等を開発・製造・販 売している⾃動⾞会社 ・アメリカ合衆国のシリコンバレーが拠点 ・PayPal社の前⾝であるX.com社を1999年に 設⽴したイーロン・マスクがCEO ・電気⾃動⾞以外にも、蓄電池システム (PowerWall)や太陽光発電システム(ソー ラールーフ)などクリーンエネルギーを核として様々 なビジネス展開をしている(最近はエアコン事業も 始めるとかなんとか)
  6. © 2020 CData Software Japan, LLC | www.cdata.com/jp 電気⾃動⾞の世界販売台数 第1位

    40万台近く 時価総額がトヨタを超え https://www.asahi.com/articles/ASN727786N72UHBI00S.html
  7. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla はアプリで様々な操作を実⾏可能

    ・充電状況をリアルタイムで確認し、充電を開始ま たは停⽌する ・運転前に⾞両の暖房/冷房を⼊れる (ガレージ 内でも可能) ・遠隔からロックまたはロック解除する ・⾞の現在地を確認したり、動きを追跡する ・お気に⼊りのアプリから⽬的地を送信し、ナビを開 始します ・同乗者はすばやくメディアをコントロールすることが できます などなど
  8. © 2020 CData Software Japan, LLC | www.cdata.com/jp そんな Tesla

    のアプリの内部通信は Web API 経由で⾏われている
  9. © 2020 CData Software Japan, LLC | www.cdata.com/jp 取得できる⾞両データ項⽬が160種類以上 ⾞両番号や⾞両の起動状況といった基本情報から、バッテリーの残容量・充電状況・充電リミッターの

    設定値、外気温・⾞内気温、エアコンの温度設定、GPSによる現在地の緯度経度、Software Updateの状態、さらにはアクセルパワー・スピード・シフトモードの情報まで取得するとが可能︕ { "response": { "id": :id, "user_id": :user_id, "vehicle_id": :vehicle_id, "vin": ":vin", "display_name": ":name", "option_codes": "AD15,AF02,AH00,APF0,APH2,APPA,AU00,BCMB,BP00,BR00,BS00,BTX4,CC02,CDM0,CH05,COUS,CW02,DRLH,DSH7,DV4W,FG02,FR01,GLFR,HC00,HP00,IDBO,INBPB,IX01,LP01,LT3B,MDLX,ME02,MI02,PF00,PI01 ,PK00,PMBL,QLPB,RCX0,RENA,RFPX,S02B,SP00,SR04,ST02,SU01,TIC4,TM00,TP03,TR01,TRA1,TW01,UM01,USSB,UTAB,WT20,X001,X003,X007,X011,X014,X021,X025,X026,X028,X031,X037,X040,X042,YFFC,SC05", "color": null, "tokens": [ ":token1", ":token2" ], "state": "online", "in_service": null, "id_s": ":ids", "calendar_enabled": true, "backseat_token": null, "backseat_token_updated_at": null, "gui_settings": { "gui_distance_units": "mi/hr", "gui_temperature_units": "F", "gui_charge_rate_units": "mi/hr", "gui_24_hour_time": false, "gui_range_display": "Rated", "timestamp": 1532986218050 }, "vehicle_state": { "api_version": 3, "autopark_state": "unavailable", "autopark_state_v2": "standby", "autopark_style": "dead_man", "calendar_supported": true, "car_version": "2018.21.9 75bdbc11", "center_display_state": 0, "df": 0, "dr": 0, "ft": 0, "homelink_nearby": false, "last_autopark_error": "no_error", "locked": true, "notifications_supported": true, "odometer": 14522.605889, "parsed_calendar_supported": true, "pf": 0, "pr": 0, "remote_start": false, "remote_start_supported": true, "rt": 0, "sun_roof_percent_open": null, "sun_roof_state": "unknown", "timestamp": 1532986223303, "valet_mode": false, "vehicle_name": ":name" }, "climate_state": { "inside_temp": 27.0, "outside_temp": 24.0, "driver_temp_setting": 18.3, "passenger_temp_setting": 18.3, "left_temp_direction": -280, "right_temp_direction": -280, "is_front_defroster_on": false, "is_rear_defroster_on": false, "fan_status": 0, "is_climate_on": false, "min_avail_temp": 15.0, "max_avail_temp": 28.0, "seat_heater_left": false, "seat_heater_right": false, "seat_heater_rear_left": false, "seat_heater_rear_right": false, "seat_heater_rear_center": false, "seat_heater_rear_right_back": 0, "seat_heater_rear_left_back": 0, "battery_heater": false, "battery_heater_no_power": false, "steering_wheel_heater": false, "wiper_blade_heater": false, "side_mirror_heaters": false, "is_preconditioning": false, "smart_preconditioning": false, "is_auto_conditioning_on": false, "timestamp": 1532986223306 }, "charge_state": { "charging_state": "Complete", "fast_charger_type": "¥u003cinvalid¥u003e", "fast_charger_brand": "¥u003cinvalid¥u003e", "charge_limit_soc": 86, "charge_limit_soc_std": 90, "charge_limit_soc_min": 50, "charge_limit_soc_max": 100, "charge_to_max_range": false, "max_range_charge_counter": 0, "fast_charger_present": false, "battery_range": 212.26, "est_battery_range": 152.09, "ideal_battery_range": 271.83, "battery_level": 83, "usable_battery_level": 83, "charge_energy_added": 16.57, "charge_miles_added_rated": 51.0, "charge_miles_added_ideal": 65.5, "charger_voltage": 0, "charger_pilot_current": 6, "charger_actual_current": 0, "charger_power": 0, "time_to_full_charge": 0.0, "trip_charging": false, "charge_rate": 0.0, "charge_port_door_open": true, "conn_charge_cable": "SAE", "scheduled_charging_start_time": null, "scheduled_charging_pending": false, "user_charge_enable_request": null, "charge_enable_request": true, "charger_phases": null, "charge_port_latch": "Engaged", "charge_current_request": 6, "charge_current_request_max": 6, "managed_charging_active": false, "managed_charging_user_canceled": false, "managed_charging_start_time": null, "battery_heater_on": false, "not_enough_power_to_heat": false, "timestamp": 1532986223305 }, "drive_state": { "shift_state": null, "speed": null, "power": 0, "latitude": 40.459728, "longitude": -79.923447, "heading": 340, "gps_as_of": 1532986222, "native_location_supported": 1, "native_latitude": 40.459729, "native_longitude": -79.923444, "native_type": "wgs", "timestamp": 1532986223305 }, "vehicle_config": { "can_actuate_trunks": true, "car_special_type": "base", "car_type": "modelx", "charge_port_type": "US", "eu_vehicle": false, "exterior_color": "MetallicBlack", "has_ludicrous_mode": false, "motorized_charge_port": true, "perf_config": "P1", "plg": true, "rear_seat_heaters": 3, "rear_seat_type": 3, "rhd": false, "roof_color": "None", "seat_type": 0, "spoiler_type": "Passive", "sun_roof_installed": 0, "third_row_seats": "FuturisFoldFlat", "timestamp": 1532986223303, "trim_badging": "90d", "wheel_type": "AeroTurbine20" } } }
  10. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    の使い⽅ 1.以下のURLにアクセスして、 Tesla を注⽂︕ https://ts.la/kazuya99717 2.Teslaアカウントの登録 3.Access Token の取得(認証) 4.⾞両IDを特定 5.⾞両の起動 6.データの取得・コマンドの送信
  11. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    の Postman Collection を公開中 https://kageura.hatenadiary.jp/entry/teslapostmancollection
  12. © 2020 CData Software Japan, LLC | www.cdata.com/jp Access Token

    の取得 [Request] POST /oauth/token?grant_type=password Host: owner-api.teslamotors.com Content-Type: application/json { “password”: “ACCOUNT_PASSWORD”, “email”: “ACCOUNT_NAME", "client_secret": "XXXXXXXXXX", "client_id": "XXXXXXX", "grant_type": "password" } ・認証⽅法は OAuth 2.0 Password Grant ・Tesla AccountのID・PWを使⽤ ・ClientId/Secretはアプリの埋め込みを使⽤ ・Access Token は45⽇間有効 ・Access Token は複数発⾏可能 ・Reflesh Token も実⾏可能 ・パスワード変更時は全てのTokenが無効に
  13. © 2020 CData Software Japan, LLC | www.cdata.com/jp ⾞両IDの特定 [Request]

    GET /api/1/vehicles Host: owner-api.teslamotors.com Authorization: Bearer qts-XXXXXXXXXXXXX [Response] { "response": [ { "id": 123456789, "vehicle_id": 123456789, "vin": ”XXXXXXXXXXXXXXXXX", ”display_name": "てしゅら", ・Products もしくは Vehicles エンドポイントを利⽤ ・Productsは⾞両だけでなくPowerwallなども取得 できる ・Idプロパティの値が⾞両Id。Vehicle Idは違う情 報なので混同注意 ・Stateプロパティで⾞両の起動状況が確認可能
  14. © 2020 CData Software Japan, LLC | www.cdata.com/jp ⾞両の起動 [Request]

    POST /api/1/vehicles/:id/wake_up Host: owner-api.teslamotors.com Authorization: Bearer XXXXXXXX [Response] { "response": [ { "id": 123456789, "vehicle_id": 123456789, "vin": ”XXXXXXXXXXXXXXXXX", ”display_name": "てしゅら", ・⾞両データの取得や起動以外のコマンドは起動中 でなければエラーを返す ・:idパスに事前に取得した⾞両IDを指定 ・リクエストはすぐに成功するが、⾞両が実際に起動 するまでにはある程度時間を要するので要注意
  15. © 2020 CData Software Japan, LLC | www.cdata.com/jp ⾞両データの取得 [Request]

    GET /api/1/vehicles/:id/vehicle_data Host: owner-api.teslamotors.com Authorization: Bearer XXXXXX [Response] { "response": [ { "id": 123456789, "vehicle_id": 123456789, "vin": ”XXXXXXXXXXXXXXXXX", ”display_name": "てしゅら", ・いくつかデータ取得エンドポイントは存在するが、 vehicle_dataエンドポイントだけでほとんど取得可 能 ・:idパスに事前に取得した⾞両IDを指定 ・現時点の⾞両状況データのみ取得可能。ログなど は取得できない ・ほぼリアルタイムデータ
  16. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    は Tesla サーバー経由の Web API owner-api.teslamotors.com ※なので世界中どこからでも操作が可能
  17. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    のカスタムコネクタを公開中︕ https://kageura.hatenadiary.jp/entry/teslacustomconnector
  18. © 2020 CData Software Japan, LLC | www.cdata.com/jp URL から

    OpenAPI のインポートで 以下のURLを⼊⼒するだけ https://raw.githubusercontent.com/sugimomoto/TeslaAPIC ustomConnector/main/TeslaAPICustomConnector.json
  19. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    を Power Platform で便利に活⽤ (現在 LogicApps に移⾏中)
  20. © 2020 CData Software Japan, LLC | www.cdata.com/jp バッテリーの消費状況の分析 ・LogicApps

    で Teslaのバッテリーデータを Azure Table Storage に蓄積 ・⽇々の消費状況を可視化 ・可視化したデータはLINEとTwitterに投稿 ・そもそも私はアパート暮らしなので、⾃宅に充電設備 が無い ・そのため定期的に充電できる施設に⾏くのだけど、ど の程度の頻度で⾃分が充電しに⾏くのか把握して、計 画的に充電しに⾏けるようにしたかった。 (⼟曜⽇まではまだ持ちそうだな、とか)
  21. © 2020 CData Software Japan, LLC | www.cdata.com/jp 毎朝の気温の確認・ヒーターON ・Tesla

    APIでは⾞両内部・外部の気温が取得可能 ・気温の設定値を元に、10度を下回ったらコマンド送 信でヒーターをONに。 ・毎朝8時頃に息⼦を保育園に送りに⾏くのだけど、そ の際に温めておきたい(東北の冬は寒い) ・起動しっぱなしは電⼒の無駄なので、要注意 (SiriやGoogle Homeなどの⾳声コマンドから起動 でもいいかもしれないと思ったり)
  22. © 2020 CData Software Japan, LLC | www.cdata.com/jp ⾛⾏状況のリアルタイムデータ可視化 ・LogicApps+Power

    BIのストリーミングデータセット を使い1秒間隔でTeslaからデータを取得して可視化 ・単純にどれくらいリアルタイムでTeslaのデータが取得 できるのか、実験してみたかった ・起動しっぱなしで忘れると悲惨
  23. © 2020 CData Software Japan, LLC | www.cdata.com/jp Tesla API

    はあくまで⾮公式︕ • あくまで1ユーザーがリバースエンジニアリングして、公開したAPI仕様であり、 Tesla社 が公に「このAPIを⾃由に使っていいよ︕」と⾔っているわけではあ りません。 • 基本的にテスラ社の公式アプリから使うことを前提としています。 • 何か困った時、不具合が発⽣した時、Tesla社が助けてくれるわけではな いので、あくまで使⽤するのは⾃⼰責任の範囲で︕
  24. © 2020 CData Software Japan, LLC | www.cdata.com/jp API Access

    Tokenの取り扱いは要注意︕ • APIの認証情報・Access Tokenは「Teslaのデータの収集、そして様々 な操作を可能」にします︕ • もしTesla APIを使ったサービス郡が悪意を持ったり、もしくはその認証情 報が流出すれば、誰かがあなたのテスラを⾃由に操作し、データを盗み⾒ ることができるようになります。 • GPS座標情報もありますし、キーのロック・ロック解除、電源のON/OFFも できます。何ができるようになるかは想像に難くないでしょう。 • 危ないと思ったらパスワード変更でAccessTokenは無効化できます。
  25. © 2020 CData Software Japan, LLC | www.cdata.com/jp 本⽇のゴール Power

    Platformを通じて Tesla API の⾯⽩さ・可能性を感じてもらう︕
  26. © 2020 CData Software Japan, LLC | www.cdata.com/jp テスラはこの40万近い⾞両の ソフトウェアとハードウェアによって

    どれだけデータを収集し、活⽤しているのか この API でその⼀⽚を感じとることが できるのではないでしょうか。
  27. © 2020 CData Software Japan, LLC | www.cdata.com/jp CData Software

    Japanではメンバーを募集中︕ https://www.wantedly.com/companies/cdata2/projects