500 天与 30,000 英里
本文是英文原文的机器翻译,部分细节可能有所损失,请以英文版本为准。 阅读英文原文
要点速览
上个星期天早晨 10:22,里程表显示 40,397.8,我家里的一台 Raspberry Pi 记录下了我驾驶的第 30,000 英里。五百天的采集,一天不差。
没有任何东西标记这件事,因为本来就没有为此构建任何东西。一行数据落进了 Postgres 的一张表里,就和它之前的一千万行一模一样,这是我能给一件基础设施的最高赞美。
一千万并不是一种修辞。数据库里有 10,356,022 行位置数据,另外还有 243,380 行充电明细。折算下来大约每天新增 20,700 行,天天如此,持续五百天,来自一个被放任只做这件事、别的什么也不做的专用节点。
到底在运行什么
一台 Raspberry Pi 5 上的四个 Docker 容器。TeslaMate 负责采集,Postgres 16 负责存储,Grafana 负责绘图,Mosquitto 通过 MQTT 发布实时状态,让家里的其他设备能对车辆到家做出反应。整个技术栈就是这些,而且它独占一台机器。我的实验室里有好几台 Pi,这一台专门划给采集,除了 24/7 保存记录什么都不做。没有别的东西与它争抢 CPU、内存或在线时间,也就意味着没有别的东西能把它拖垮。
这个采集器比一个轮询循环要聪明。车辆行驶时,它每隔几秒采样一次:位置、速度、航向、海拔、电量、功率、温度。车辆充电时,它会跟踪整个过程,而不是只记下开始和结束。车辆停放时,它会刻意收手让车睡觉,因为不停敲打 Tesla 的 API 会让车保持唤醒,夜里白白耗掉你的续航。最后这个决定,正是记录器从未让我损失续航的原因。
五百天这样完整、逐秒的记录,总共 1.6 GB,比一部电影还小。我一直在等存储成为问题,它却始终没有。
对照里程表,累计跟踪了 30,144 英里,每天 60.3。6,921 次行程,共 976 小时,相当于整整四十天坐在方向盘后面。513 次充电共 10,016 kWh,其中 458 次在家,也就是 89.3%,这是我能对任何一个对买电动车心存顾虑的人说的最有用的一句话。捕获了三十五次空中更新,每次都有时间戳,让我拥有一份比 Tesla 发布的任何内容都更精确的个人固件更新日志。
整个运行期间的采集在线率是 92%。对于一台无人值守、没有运维团队的单板计算机来说,这个数字我每次都愿意接受。
我每买四美元的电,大约有三美元真正用来驱动车,其余的花在充电损耗、空调,以及车在夜里自己醒来上。天气决定了这种损耗有多糟糕,炎热的月份比温和的月份每英里多花 16%,而德州的冬天多花 3%。
没人告诉你的那部分
我总是 SSH 进那台 Pi,而且几乎从来不是因为它需要修理。我连上去,是因为我想看数据一条条到来,想看一次行程落进表里时车还在车道上发烫,想确认前一晚的充电曲线看起来像一条充电曲线。最初我这样做,是因为我还不信任它。后来这样做,是因为我已经开始理解表结构,而一旦理解了表结构,数据库就不再是黑箱,变成了一个你可以走进去查看的地方。
这种学习比听起来要慢。你会学到,车一改变状态,drives 里就会出现一行;充电过程和充电样本是生命周期不同的两种对象;里程表是唯一从不撒谎的字段。你会学到自己的数据意味着什么,而这和仅仅拥有它不是一回事。
这一切都不需要 AI,而我想把时间线说准确:在有助手能替我写查询之前很久,我就已经在做这些了。学习本身就是工作。
然后查询变简单了
变化在于,我不再写 SQL,开始提问。
把 LLM 指向一个我已经理解的数据库结构,把五分钟的查询变成了十秒钟的查询。不是因为它了解我的数据,而是因为我了解,而且当它给我的答案是胡扯时,我能立刻分辨出来。这种组合才有用。从没打开过这些表的人,会得到自信满满的错误答案,却没有办法发现它们。熟悉结构、现在又能用日常语言提问的人,可以直接跳到有意思的部分。
有意思的是,问题会越问越好。查询昂贵时,你只会问自己已经怀疑的事。查询便宜了,你就开始问那些毫无假设的事,惊喜就藏在那里。不同季节里平均行程长度如何变化。一天里车到底什么时候在动。一年中最热的那一夜的充电过程,与最温和的那一夜相比是什么样。
Tesla 的应用回答不了其中任何一个问题。它根本不是为此而造的。它给你的是一个摘要,而摘要只能回答设计者当初预料到的问题。
让整个项目回本的那个问题
今年夏天,我确信我的壁挂式连接器出了故障。
在炎热的夜晚,应用里的充电过程看起来像是在停止又重新开始。诊断结果不言自明:热降额,设备发热后就削减电流,让车以一种多年来悄悄让电池老化的方式循环。更换壁挂式连接器并不便宜。
然后我想起来,我不必猜。它采集过的每一个充电样本,都在我家里的一块硬盘上。
导引信号是连接器告诉车它最多可以拉多少安培。降额意味着这个数字下降。在 **家里采集的 217,124 个样本中,有 217,118 个读数是 48 安培。**二十多万个读数里只有六个在别的值上,而且电池电量从未在充电中途下降,如果车真的被切断就会下降。
连接器从来没有出过问题。把各次充电过程与室外温度对齐后,真正发生的事就清楚了:在最热的夜晚,是车自己掉了线,所以记录器丢失了一个本来运行得好好的充电过程。
我没有花那笔钱。那一个答案,来自我早已拥有的数据,用的是我早已拥有的硬件,就把整个项目的成本赚回了好几倍。
接下来的两万英里
按每天六十英里算,五万英里大约会在明年年中到来,而硬盘仍然毫不在意。
我真正在等的是对比。一个德州的夏天说明不了热和电池的关系。两个夏天才能让你测量。三万英里大致就是日志不再只是日志、变成基线的那个点,我每多让它跑一个月,对比就会变得更清晰,而我无需付出任何努力。
这台 Pi 是我拥有的要求最少的基础设施,也毫无疑问是回报最丰厚的,因为它会复利。它只要求一次搭建,加偶尔一次 SSH,而作为回报,它悄悄建起了一样没人能卖给我、对我停掉、或涨价让我买不起的东西:一份完整、可查询的记录,记着我究竟是怎么使用我自己的车的。