用代码控制特斯拉意味着什么
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 4443curl --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 订阅停车状态信号,车辆真正停好后再调用脚本。至于不断轮询状态的做法,因唤醒成本高而不推荐。
下面的脚本以代理已经运行为前提,是最小可用版本。把写死的值改成自己的环境即可直接运行。
#!/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 '{}'# 周一至周五 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 沿这条路走不通,这一点最好一开始就说清楚。
