Gaming-Hub の Tesla ダッシュボードは、自宅の Model 3 から残量・充電・走行ログ・AI PLAN を出しています。製品レビューではなく、Fleet API と実装のメモです。同じことをやりたいエンジニア向けに、うちの構成とハマりどころを書きます。
前提: 非公式の Owner API ラッパーは使っていません。Tesla Fleet API で読み取り、tesla-http-proxy(vehicle-command)で署名付きコマンドを送ります。localhost だけでは partner 登録が通らないので、本番ドメインが必須です。
全体像
スタックは WordPress (PHP) + Docker 上の tesla-http-proxy + 本番ドメインの公開鍵です。
- WordPress — ダッシュボード UI、OAuth コールバック、WP-Cron、Driving / Charge / ガソリン比較ログ
- Fleet API クライアント —
inc/tesla-api.phpのGaming_Hub_Tesla_Api - tesla-http-proxy —
docker composeのtesla/vehicle-command(署名コマンド専用) - /.well-known/appspecific/com.tesla.3p.public-key.pem — partner_accounts 用公開鍵
Browser → WordPress (PHP)
├─ OAuth refresh → Fleet vehicle_data … ライブ読み取り
├─ POST command/* via tesla-http-proxy … 充電制御
└─ AI PLAN cron (diff only, wake budget)
tesla-http-proxy → signed Fleet vehicle commands
production domain → /.well-known/.../public-key.pem
読み取りと書き込みでベース URL を分けています。読みは Fleet、書きは proxy。混ぜると unsigned で落ちます。
Fleet API — 読み取り
developer.tesla.com でアプリを作り、Client ID / Secret と VIN を Customizer か .env に入れます。
TESLA_CLIENT_ID/TESLA_CLIENT_SECRETTESLA_VEHICLE_VINTESLA_FLEET_API_BASE_URL— 日本は NA:https://fleet-api.prd.na.vn.cloud.tesla.comTESLA_REDIRECT_URI—/wp-json/gaming-hub/v1/tesla/oauth/callback(本番ドメイン)
トークンは fleet-auth.prd.vn.cloud.tesla.com で refresh。access token は transient、refresh token は option に保存します。
読み取りの中心は GET /api/1/vehicles/{vin}/vehicle_data です。正規化後の主なフィールド:
- SOC / charge_state / charging_amps
- odometer / speed / shift_state(走行判定)
- cabin temp / tire pressures
asleep— スリープ時は API を送らず前回スナップショットを表示
partner_accounts と公開鍵
Fleet を使うには本番ドメインで公開鍵をホストし、Allowed Origins と同じドメインを Tesla に登録します。
https://<your-domain>/.well-known/appspecific/com.tesla.3p.public-key.pem
localhost だけでは vehicle_data が取れません。実装は gaming_hub_tesla_register_partner_account() / gaming_hub_tesla_verify_public_key_hosted() です。
tesla-http-proxy — 書き込み
充電コマンド(charge_start / charge_stop / set_charge_limit)は署名が必須です。うちは Docker の tesla-http-proxy に寄せています。
TESLA_COMMAND_PROXY_URL=https://tesla-http-proxy:4443
Gaming_Hub_Tesla_Api::send_vehicle_command() は proxy URL があるとベースを差し替え、TLS verify を切って内部通信します。車側には 仮想キー のペアリングが必要で、未ペアだと key_not_paired 系で落ちます。
AI PLAN との接続
inc/tesla-plan.php が LOOOP 単価と目標 SOC(平日おおよそ 80%、土曜朝に向けた上積み)から充電枠を組みます。WP-Cron は計画が変わったときだけコマンドを送り、自動 wake は日 4 回まで(手動 ON/OFF は制限なし)です。
ポーリング方針
スリープを起こしすぎないことがポイントです。
- 通常ポーリング: idle 15 分 / active 10 分
- スリープ検知後: 30 分スキップ
- API エラー後: 10 分スキップ
- 最後の成功ステータスは最大 6 時間保持して UI に出す
位置スコープは任意です。付いていない/拒否済みなら gaming_hub_tesla_strip_location() で落とし、住所は保存しません。
ログとの接続
- Driving Log — オドメーター差分 → km・電費・ガソリン比較節約円(
tesla-gas-log.php) - Charge Log — 自宅 / Supercharger セッション(
tesla-charge-log.php) - SOC ログ — 時間別 SOC を残し、AI PLAN チャートの過去帯を埋める
グラフと最新数字は Driving Log。購入・運用の話は Model 3 実測レビュー の方が向いています。
ハマったところ(再現用メモ)
- リージョン — 日本アカウントは NA Fleet URL。EU/CN を叩くと失敗する
- partner_accounts — 公開鍵未設置 / Allowed Origins 不一致だと vehicle_data 不可
- localhost OAuth — 開発では refresh token を本番で取って持ち込む方が楽
- unsigned command — proxy なしの command POST は拒否される
- 仮想キー — ペアリング忘れが充電制御失敗の最頻原因
- スコープ追加 — Tesla は前回許可を再利用するので、位置などを増やすときは「不足スコープ追加」か再認可が必要
- wake 乱用 — 好奇心で毎分 poll しない。スリープ尊重がバッテリーと API の両方に効く
ディレクトリ早見表
wp-content/themes/gaming-hub/
inc/tesla-api.php … Fleet / proxy クライアント
inc/tesla.php … OAuth・ステータス正規化・公開鍵
inc/tesla-plan.php … AI PLAN・wake budget
inc/tesla-gas-log.php … 走行・ガソリン比較
inc/tesla-charge-log.php … 充電セッション
tesla/ … proxy 用鍵(git に秘密鍵を入れない)
docker-compose*.yml … tesla-http-proxy サービス
まとめ
うちの構成は 読み取り = Fleet API、書き込み = tesla-http-proxy 署名コマンド の二系統です。partner 公開鍵と仮想キーを本番で揃え、ポーリングはスリープ優先にしています。
ライブ状態は Tesla ダッシュボード、実装の参照はテーマ inc/tesla*.php を見てください。節約額や日常運用は Model 3 実測レビュー へ。
同種の実装をご依頼の方
この記事と同様の Web アプリ・API 連携・ダッシュボード のご相談は、ランサーズ からお問い合わせください。取引はランサーズ経由のみ対応しています。
| プラン | 料金(税込目安) | 内容 |
|---|---|---|
| ベーシック | 15,000円 | 既存ページのテキスト・画像差し替え、CSSによる表示崩れ修正(1〜2箇所) |
| スタンダード | 45,000円 | 新規1ページのコーディング・組み込み(PC/SP対応)、またはACFによるカスタム投稿1種(一覧・詳細)の設計 |
| プレミアム | 80,000円 | 複数ページ(3〜4ページ程度)の改修・コーディング(スライダー、タブ切り替え、ACF入力画面設計、問い合わせフォーム調整を含む) |