本次搭建的所有过程均由 Claude Code 全自动完成,并由 Claude Code 整理此文。 我做的只是:用特斯拉账号登录了一次授权窗口,以及给 Grafana 设了个新密码。

特斯拉车机自带的数据展示很有限:充电历史看不全、每次行程的能耗无从查起、电池健康更是只能靠体感猜。TeslaMate 解决的就是这个问题——它 7×24 小时静默记录车辆的一切数据,而这样一个需要全年无休运行的小服务,恰好是树莓派的主场。

TeslaMate 是什么

TeslaMate 是一个开源的特斯拉数据记录器(data logger),自托管运行。它通过特斯拉官方 API 持续拉取车辆状态,把每一次行程、每一次充电都记进自己的数据库,再用 Grafana 面板呈现出来:

  • 行驶记录:每段行程的起点终点、路线轨迹、速度、能耗、气温;
  • 充电历史:每次充电的地点、电量、费用估算,家充与超充分开统计;
  • 电池健康:容量衰减曲线——这是车辆估值和"电池焦虑"最硬的数据;
  • 效率统计:不同温度、不同速度下的实际能耗,冬天到底费多少电一目了然;
  • 哨兵与耗电记录:停车期间电量去哪儿了,看得清清楚楚。

预装的 Grafana 面板有二十多个,数据积累越久越有价值。

与各类第三方特斯拉数据服务(它们同样要你交出账号令牌)相比,TeslaMate 的根本差异在于:数据库在你自己家里。行踪轨迹是极敏感的隐私,没有理由存在别人的服务器上。

另一个常见顾虑是"持续拉数据会不会让车睡不着、加剧掉电"。TeslaMate 对此有专门的休眠逻辑:检测到车辆空闲时主动放缓轮询、让车正常入睡,这也是它比不少第三方服务更省电的原因。

为什么适合跑在树莓派上

TeslaMate 这类服务的需求画像是:全天候在线、负载极低、不值得为它开一台正经服务器。逐条对树莓派:

  • 必须 24 小时运行:车什么时候开、什么时候充电不可预测,记录器停了数据就断档。树莓派功耗只有几瓦,全年电费十几块钱,常开无压力;
  • 负载极低:拉取 API、写数据库、渲染面板,对 Pi 5 来说都是毛毛雨。实测四个容器全部跑起来后,整机(还叠加了科学上网 WiFi那套透明代理服务)内存占用仅 1.4GB / 4GB,负载接近于零;
  • 数据就该在局域网里:面板自己在家看,无需公网暴露,树莓派天然就在家里网络中;
  • Docker 生态成熟:TeslaMate 官方提供 arm64 镜像,Docker Compose 一份配置文件拉起全部服务,与树莓派无缝匹配。

顺带回答一个我自己搭建前的疑问:它能和已有的科学上网 WiFi 服务共存吗? 完全可以。透明代理网关工作在网络层(转发别的设备的流量),TeslaMate 是普通应用服务(监听自己的端口),两者互不相干,一台 Pi 5 同时跑绰绰有余。

整体架构

TeslaMate 不是单个程序,而是四个容器组成的小型套件,Docker Compose 一次编排:

特斯拉官方 API
      │  (TeslaMate 定时拉取车辆状态)
┌─────────────────────── 树莓派 ───────────────────────┐
│                                                      │
│  TeslaMate(核心,:4000)── 拉数据、管理账号接入      │
│      │                                               │
│      ├──► PostgreSQL ── 所有历史数据落库             │
│      │                                               │
│      └──► Mosquitto(MQTT)── 向外广播实时车辆状态   │
│                                                      │
│  Grafana(:3000)── 读取数据库,渲染各类统计面板      │
│                                                      │
└──────────────────────────────────────────────────────┘
      │  局域网内浏览器访问
   手机 / 电脑

四个角色各司其职:TeslaMate 是大脑,负责与特斯拉 API 打交道;PostgreSQL 存数据;Grafana 出图表;Mosquitto 是个消息广播站,把车辆实时状态(位置、电量、是否在充电)以 MQTT 协议发布出来,将来接入 Home Assistant 之类的智能家居系统就靠它,当前仅内部使用、不对外开放端口。

搭建过程

整个过程全部交给 Claude Code 通过 SSH 远程完成。按发生顺序记录如下。

1. 部署 Docker Compose 套件

Claude Code 在树莓派上建立部署目录,写好 docker-compose 编排文件和环境变量文件:数据库密码与数据加密密钥均为随机生成的长字符串(TeslaMate 会用这个密钥加密存储特斯拉令牌),敏感文件权限收紧到仅本用户可读;时区设为 Asia/Shanghai,否则所有行程时间都会差八个小时。随后拉取镜像、启动服务,四个容器一次到位。

2. 生成特斯拉登录令牌

这是唯一需要我本人出场的环节。TeslaMate 需要特斯拉账号的 API 令牌,官方推荐用同一作者的开源小工具 tesla_auth 在本地生成——它完全本地运行,账号密码只提交给特斯拉官方,不经过任何第三方服务器。

Claude Code 把工具下载到我的 Mac 上并启动,弹出登录窗口后我登录了一次特斯拉账号(中国区账号需要走中国区通道,新版工具能自动识别),拿到 Access Token 和 Refresh Token 两串令牌,粘贴进 TeslaMate 的接入页面即完成绑定。片刻后车辆出现在页面上,数据开始流入。

3. 处理与透明代理网关的共存细节

因为这台树莓派同时是 sing-box 透明代理网关(负责科学上网 WiFi),有两个交叉点需要处理,Claude Code 顺手完成:

  • 确认 sing-box 配置不拦截局域网入站流量(strict_route 关闭、私有地址直连),否则家里设备访问不到 4000/3000 端口的面板;
  • 给分流规则加上特斯拉相关域名直连——车辆数据的拉取走特斯拉中国的服务器,没必要也不应该绕道代理,这样行车记录完全不依赖代理链路的可用性。

4. 收尾

Grafana 初始密码是通用默认值,首次登录后我改成了自己的;Claude Code 验证了车辆数据已正常入库、各面板开始有内容,搭建结束。

注意事项

  • 加密密钥务必备份:环境变量文件里的数据库密码和加密密钥丢了,数据库里加密存储的令牌就解不开了。这个文件很小,抄一份放在别处;
  • Grafana 默认密码要改:初始账号密码是公开的默认值,哪怕只在局域网内也建议第一时间修改;
  • 数据目前落在 SD 卡上:Docker 卷位于 SD 卡,长期高频写入对 SD 卡不算友好。数据量大了以后可以迁移到 USB SSD,属于后续可选优化;
  • 给树莓派绑定静态 IP:在主路由后台固定 IP,避免地址变动后面板访问不到;另外要注意有线和无线是两个不同的 IP,拔掉网线切到 WiFi 时地址会变;
  • 升级很简单:TeslaMate 更新频繁,升级只需在部署目录重新拉取镜像并重启容器,数据在独立的卷里,不受影响;
  • 令牌会自动续期:接入时粘贴的令牌有有效期,TeslaMate 会用 Refresh Token 自动刷新,正常情况下无需再次登录。

最终效果

现在这台树莓派同时跑着科学上网 WiFi 和 TeslaMate 全家桶,内存用量 1.4GB、负载 0.1,非常从容。手机连上家里 WiFi 打开 Grafana,行程轨迹、充电曲线、电池健康一应俱全——而这些数据的每一个字节,都只存在我家里这张 SD 卡上。

数据记录类工具的价值随时间复利:现在多看一眼没什么,一年后回头看电池衰减曲线、算清每公里真实成本时,这些数据才真正显出分量。