动机
可能是职业病, 我对大部分带电的东西都很感兴趣
电动螺丝刀, 电视机, 电车, 交换机
. 同时我又对监控很感兴趣, 把数据捞出来, dashboard 上各种调, 数据可视化都很有意思.
为了这碟醋包顿饺子.
实现
大部分新能源汽车的移动端 APP 都提供了丰富的功能, 可以查看电量/续航/门窗状态/位置信息等等. 我买的老头乐牌 不敢说是哪家担心厂商把接口封了 新能源小轿车这部分支持也很不错. 希望行业都像特斯拉一样直接给接口, 而不是让用户去搞这种hacky的做法
抓包
iOS 上用 Stream
我总分不清 Stream 和 Steam 的区别
抓包, 因为需要解 HTTPS 内容所以要在手机上它的 CA 证书.
开始抓包后去老头乐刷新一下车辆状态, 就能看到完整的 HTTP 交互内容.
大概是这样的:
{
"data":
{
"ac":
{
"temperature": 25.5,
"out_temperature": 25.0,
"ac_on": false,
...
},
"position":
{
"longitude": 80.512345,
"latitude": 28.542161
},
"battery":
{
"soc": 84.5,
"charging": 0,
"max_soc": 100.0,
...
},
"tyre":
{
"1_temp": 26,
"2_temp": 26,
"3_temp": 27,
"4_temp": 26,
"1_press": 2.6,
"2_press": 2.5,
"3_press": 2.5,
"4_press": 2.5
}
}
请求头包含了移动端 app id, 时间, 车辆 id 等, 又很幸运看起来老头乐没有对 sign 做校验 可能说法不对, 不是专业搞安全的 , 因此可以不断重放这个请求但实际上拉取的是最新的状态.
收集数据
手写了很简陋的脚本, crontab 每分钟执行一次, 把数据拿出来 zabbix_sender 到 zabbix 里存起来.
这样就可以干一些很有意思的事情了.
可视化
轮胎扎了
刚好昨天老头乐告警说一个轮胎胎压低, 回去看了一下监控大概是这样的:

这实际上很有意思, 从监控我们可以分析出一些有意思的 fact:
- 轮胎是缓慢漏气的, 从 11/2 早上扎钉子开始大概花了两天时间, 从 2.6kPa 下降到 2kPa
- 胎压和温度是相关的, 能明显观察到两者是正相关的 冬天来了, 记得给车胎稍微打点气
- 如果开起来的话, 轮胎温度和气压都会小幅上升
后来叫了救援, 把车胎补了, 观察两天看看, 希望不用换新胎.
这个时候监控就很有用, 可以看是否还有漏气的趋势.
Geomap
另一个我觉得非常酷的用法是, 既然车子可以上报 GPS 位置信息, 那我可以收集过去几年的点来看我的移动轨迹, 画成热力图很酷.
遇到的第一个问题是火星坐标系, 直接把上报的经纬度落在地图上会发现总会飘移开几米. 后来经高人指点才知道这是某种 by design. 还好火星坐标系的算法几乎也是半公开的, 加上修正就好了.

实现很简单, 把时间戳 + 经纬度放到一个 csv 里传到 kepler.gl
Kepler.gl is a powerful open source geospatial analysis tool for large-scale data sets.
就好.
但很遗憾的是只有过去一年的数据了, zabbix history 只保存了 365d, 再早的就被清掉了, 遗憾.
不过就这一年的数据也足够有趣了 :
- 去浦东机场, 大部分时间走华夏快速路. 只有节假日免费的时候才会走龙东高架转绕城高速
- 大部分活动在浦东, 杨高南路很火热
- 岔出去的几次(申嘉湖, S60) 都记得起当时是去干嘛了, 很有意思.
其它
还可以做什么 ?
比如可以把 SoC 和总里程放一起, 看电车续航到底虚标多少.

- 比如电量低的时候做告警, 提醒下次出门要补能了
- 比如观察上海一年气温变化
- 有 OTA 的时候天天提醒
没错大部分功能 APP 都能实现, 但折腾这些不就是 Because we(I) can 吗.
Todo
我对现在的 setup 还不太满意, 有些可以继续搞的更好玩一些, 有意思再做.
- crontab 每分钟跑一次 py 变成一个优雅的系统服务
- 数据进到 influxdb 这样的时序数据库里, zabbix 实在不适合存储这样的数据, 以能存 10 年为目标
- 更完善优雅的告警和 dashboard
- gepler.gl 集成到 dashboard 而不是只能手动跑
- 现在还是只读, 有时间看能不能加上控制
- 出一趟远门, 足够远, 在地图上留下长长的轨迹