Insights·2026-07-31

可以用代码控制特斯拉吗 — 用 Fleet API 实现空调后吹自动化

可以。特斯拉提供名为 Fleet API 的官方车辆控制接口,车主授权账号后,程序即可执行上锁、开后备箱、空调、充电、导航目的地、哨兵模式等命令。最实用的第一个自动化是空调后吹:停车下车后让风机再运转一会儿,把蒸发器吹干。夏天那股酸味多半来自蒸发器上残留的水汽,所以效果立刻能闻到;而车机菜单里并没有这个按钮,甚至有服务专门把这一个功能做成按月订阅来卖。做法很简单:到家后调用 auto_conditioning_start 打开空调、set_temps 调高温度,十分钟后再调用 auto_conditioning_stop。真正的门槛不是代码而是注册流程 — 注册开发者应用、在自己域名的固定路径上托管公钥、运行为命令签名的代理。这类工作恰好适合交给 Claude Code 或 Codex 这类编程智能体,而费用则落在每个账号每月十美元的额度之内。

AI 에이전트 터미널, 테슬라 Fleet API 라이브 데이터 화면, 충전 중인 전기차를 나란히 놓은 구성
가운데 화면은 테슬라 개발자 사이트가 공개한 Fleet API Live Data 예시(developer.tesla.com)

用代码控制特斯拉意味着什么

API 是程序与服务对话的通道,取代人手点击应用界面。特斯拉把这个通道以 Fleet API 的名义正式开放。你在应用里点的上锁、开空调、开始充电,都对应一个命令名称,程序调用这个名称,车就真的动作。

过去逆向特斯拉应用得到的非官方 API 曾广泛使用,如今已有正式路径。车主用自己的特斯拉账号登录并把权限委托给某个应用(OAuth),该应用便代表车主发送命令。第三方服务所说的「连接特斯拉账号」指的就是这一步。

较新的车型还多一层。命令必须签名,而验证签名的公钥要由车主亲自登记到车上,这称为 virtual key。它可以随时在车机的锁定画面中删除,因此授权之后的收回权仍在车主手里。

归纳起来是三层:账号授权(OAuth)、登记在车上的公钥(virtual key),以及用对应私钥为命令签名的自有服务器。三者齐备之后,剩下的只是普通的 HTTP 请求。

哪些开放,哪些不开放

开放的范围比想象中广。下表按类别整理了特斯拉官方命令代理实现(teslamotors/vehicle-command)中实际存在的命令名称。

不开放的部分同样明确。转向与加减速等驾驶控制、Autopilot 与 FSD 的操作、智能召唤、摄像头影像与哨兵录像都没有开放。车门也只到解锁,并非物理开启。所以准确的说法不是「AI 开车」,而是「AI 代替人按下车辆周边的重复按钮」。

还有一点:车辆休眠时命令不会立刻生效,需要先用 wake_up 唤醒,而这个调用很贵(见费用一节)。与其反复轮询状态,不如使用 Fleet Telemetry 流式推送,更便宜也更快。

分类命令名称(部分)
空调auto_conditioning_start · auto_conditioning_stop · set_temps · set_climate_keeper_mode · set_preconditioning_max · remote_seat_heater_request
车门与储物door_lock · door_unlock · actuate_trunk(front/rear) · charge_port_door_open · window_control(vent/close)
充电charge_start · charge_stop · set_charge_limit · set_charging_amps · add_charge_schedule · add_precondition_schedule
安全与模式set_sentry_mode · set_valet_mode · guest_mode · speed_limit_activate · parental_controls_activate · set_pin_to_drive
便利功能navigation_request · trigger_homelink · flash_lights · honk_horn · set_vehicle_name · schedule_software_update · wake_up

为什么后吹适合作为第一个自动化

后吹是指停车下车后让空调再运转一会儿,把蒸发器吹干。制冷时空气中的水分会不断凝结在蒸发器表面,若一直不干就会滋生霉菌,下次开空调时化为酸味回来。很多人换了空调滤芯味道依旧,原因就在这里。

但特斯拉车机菜单里没有后吹这一项。于是真的有服务把这一个功能做出来按月售卖:以 Telegram 机器人的形式连接特斯拉账号,代为执行自然干燥与热风干燥,十四天试用后每月约一千韩元起(价格依 sla-ai-bot.smartstream.kr 页面)。

作为第一个自动化有三个好处。所需命令只有两三个,失败也没有风险;结果用鼻子就能验证,不必翻日志;而且在这里搭好的认证、签名与调度结构,可以原封不动地复用于充电时段优化、出发前预热、停车后自动上锁。

准备一 — 注册开发者应用并托管公钥

先在特斯拉开发者网站(developer.tesla.com)注册应用。即使只控制自己的车,这一步也免不了。注册后会拿到客户端 ID 与密钥,并选择应用要申请的权限范围(空调、充电、上锁等)。

初学者最常卡住的是域名要求。每个应用要登记一个自己拥有的域名,并在该域名的固定路径上托管公钥文件,路径是固定的 — /.well-known/appspecific/com.tesla.3p.public-key.pem。特斯拉会直接从这个地址读取公钥,所以它必须是互联网上可访问的地址,而不是本地文件。

密钥使用 EC(prime256v1)方式生成。私钥只留在自己的服务器上,绝不公开,上传到该地址的只有公钥。私钥一旦泄露,别人就能用它向你的车发送命令,因此存放位置与权限要从一开始就设计好。

最后由车主把公钥登记到车上。打开应用提示的 https://tesla.com/_ak/<你的域名> 链接后会唤起特斯拉手机应用,确认后钥匙就添加到车上,此时车辆必须在线。想删除时,在车机的锁定画面删掉该钥匙即可。

终端 — 生成密钥并发布公钥
# 1) 生成私钥(EC prime256v1)— 只保存在自己的服务器
openssl ecparam -name prime256v1 -genkey -noout -out private-key.pem

# 2) 导出公钥
openssl ec -in private-key.pem -pubout -out public-key.pem

# 3) 托管到域名下的固定路径(路径不可更改)
#    https://<你的域名>/.well-known/appspecific/com.tesla.3p.public-key.pem

# 4) 确认可访问
curl -s https://<你的域名>/.well-known/appspecific/com.tesla.3p.public-key.pem

# 5) 车主在手机上打开此链接,把钥匙登记到车上
#    https://tesla.com/_ak/<你的域名>

准备二 — 运行命令签名代理

较新的车型只接受签名过的命令,但签名不必自己实现。特斯拉以开源方式发布了 tesla-http-proxy,把它跑在自己的服务器上,它会接收普通 HTTP 请求,用私钥签名后转发给车辆。于是自己的代码简单到只剩一行 curl。

安装可用 Go,也可以拉取 Docker 镜像。随之安装的工具有四个:tesla-keygen 生成命令认证私钥并存入系统钥匙串,tesla-auth-token 保存 OAuth 令牌,tesla-control 用于在终端直接试发命令,tesla-http-proxy 就是这里需要的 REST 代理。

代理自身也以 TLS 提供服务,因此启动时要分别传入代理用的证书与密钥,以及用于车辆命令签名的私钥文件。使用自签名证书时,用 --cacert 告诉 curl。

接着用闪灯做一次连通性测试。失败时原因基本是三者之一:车辆休眠需要唤醒、virtual key 尚未登记到车上、令牌权限范围缺少该功能。

终端 — 安装与运行代理
# 安装(二选一)
go install github.com/teslamotors/vehicle-command/cmd/...@latest   # Go 1.23+
docker pull tesla/vehicle-command:latest                            # Docker

# 设定密钥、令牌名称与车辆 VIN
export TESLA_KEY_NAME=$(whoami)
export TESLA_TOKEN_NAME=$(whoami)
export TESLA_CACHE_FILE=~/.tesla-cache.json
export TESLA_VIN=<你的车辆 VIN>

# 生成命令认证私钥(公钥输出到标准输出)
tesla-keygen create > public_key.pem

# 在 4443 端口运行 REST 代理
tesla-http-proxy -tls-key config/tls-key.pem -cert config/tls-cert.pem \
                 -key-file config/fleet-key.pem -port 4443
终端 — 连通性测试
curl --cacert cert.pem \
     --header "Authorization: Bearer $TESLA_AUTH_TOKEN" \
     --data '{}' \
     "https://localhost:4443/api/1/vehicles/$TESLA_VIN/command/flash_lights"

编写后吹脚本

后吹只需三条命令:打开空调(auto_conditioning_start)、调高温度(set_temps)、到时关闭(auto_conditioning_stop)。调高温度是关键,因为要用暖风而不是冷风才能真正吹干蒸发器。

时间十分钟左右就够。设得太长会在停车场持续消耗电量。建议先从五分钟开始,观察异味是否消失再延长。

触发方式有两种。简单的一种是大致知道停车时间,直接写进调度器(cron 或 macOS 的 launchd)。精确的一种是通过 Fleet Telemetry 订阅停车状态信号,车辆真正停好后再调用脚本。至于不断轮询状态的做法,因唤醒成本高而不推荐。

下面的脚本以代理已经运行为前提,是最小可用版本。把写死的值改成自己的环境即可直接运行。

afterblow.sh — 开空调,十分钟后关闭
#!/bin/bash
set -euo pipefail

PROXY="https://localhost:4443/api/1/vehicles/$TESLA_VIN/command"
AUTH="Authorization: Bearer $TESLA_AUTH_TOKEN"
CA="--cacert cert.pem"
DRY_MIN=10                     # 干燥时间(分钟)

send() {  # send <命令名> <JSON 内容>
  curl -s $CA --header "$AUTH" --header "Content-Type: application/json" \
       --data "$2" "$PROXY/$1"
  echo
}

# 休眠时先唤醒(仅在必要时 — 唤醒很贵)
send wake_up '{}'
sleep 5

# 1) 打开空调  2) 主副驾温度调到最高
send auto_conditioning_start '{}'
send set_temps '{"driver_temp": 28, "passenger_temp": 28}'

# 3) 等待后关闭
sleep $((DRY_MIN * 60))
send auto_conditioning_stop '{}'
crontab — 工作日傍晚执行
# 周一至周五 19:10 执行
10 19 * * 1-5 /Users/me/tesla/afterblow.sh >> /tmp/afterblow.log 2>&1

费用 — 个人使用基本免费,但有两个陷阱

Fleet API 自 2025 年 1 月起按用量计费,但每个账号每月自带十美元额度,一两辆车的个人自动化都在额度之内。特斯拉给出的示例是两辆车的流式数据、每天一百条命令与两次唤醒。后吹每天不过三四条命令,余量很大。

第一个陷阱是支付方式。即便只在额度内使用,未配置支付方式的应用也会被自动停用;账号默认支出上限为零,只有添加支付方式后才能提高。反过来,把上限设低(例如一到五美元)就能防止意外的高额账单。

第二个陷阱是轮询。命令便宜,但唤醒休眠车辆与用 REST 反复读取车辆状态都很贵。每分钟查询一次状态的循环,几天就能把额度耗尽。需要状态时,正确做法是改用 Fleet Telemetry 流式推送。

项目大致量级注意
每月额度每个账号十美元一两辆车的个人自动化在此额度内
命令一千条一美元按分位四舍五入(1,211 条为 1.21 美元)
唤醒约为命令的二十倍仅在必要时调用,切勿放进循环
车辆数据轮询最贵的一类改用 Fleet Telemetry 流式推送
支付方式未登记则应用被停用把支出上限设低以防事故

把什么交给 AI 编程智能体

如果读到这里觉得「步骤真多」,这个感受是准确的。难的从来不是代码,而是注册、认证、签名这些配套流程 — 而这正是 Claude Code、Codex 这类编程智能体擅长的领域,因为它就是读文档、执行命令、看结果再决定下一步的循环。

交办时用可验证的条件而不是目标来下指令,效果更好。「帮我做特斯拉自动化」远不如「确认这个地址上的公钥返回 200,把代理跑在 4443 端口,并让 flash_lights 成功给我看」。因为每一步人都能用眼睛判定。

有一点要注意:从一开始就定好规则,别让私钥与访问令牌出现在终端输出和代码仓库里。告诉智能体密钥文件的路径但不要输出内容,先建好环境变量与 .gitignore 再开始工作更安全。

给智能体的指令示例
1. 阅读 https://github.com/teslamotors/vehicle-command 的 README 并完成安装。
2. 用 openssl 生成 EC(prime256v1)密钥对。私钥放在 ~/.tesla/ 下,
   绝对不要输出内容,只报告路径。
3. 把公钥复制到 public/.well-known/appspecific/com.tesla.3p.public-key.pem,
   部署后用 curl 确认该地址返回 200。
4. 在 4443 端口运行 tesla-http-proxy,并展示 flash_lights 成功。若失败,
   判断原因是唤醒、virtual key 还是权限范围。
5. 最后编写 afterblow.sh,并在 crontab 中登记为工作日 19:10 执行。
   令牌与密钥放入 .env 并加入 .gitignore。

小结 — 步骤清单

一,在 developer.tesla.com 注册应用并选好权限范围。二,生成 EC 密钥对,把公钥托管到自己域名的 /.well-known/appspecific/com.tesla.3p.public-key.pem。三,通过 https://tesla.com/_ak/<你的域名> 把 virtual key 登记到车上(车辆需在线)。

四,运行 tesla-http-proxy 并用 flash_lights 确认连通。五,编写 afterblow.sh,依次执行 auto_conditioning_start、set_temps、等待、auto_conditioning_stop。六,登记到调度器,并配置支付方式与较低的支出上限。

到此就是第一个自动化。在同样的结构上叠加充电时段优化、出发前预热、停车后自动上锁,只是换个命令名称的程度。反过来,驾驶控制与 FSD 沿这条路走不通,这一点最好一开始就说清楚。