# BYDMate **Repository Path**: wayne_chen/BYDMate ## Basic Information - **Project Name**: BYDMate - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: main - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2026-09-14 - **Last Updated**: 2026-09-14 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README
# BYDMate
### BYD DiLink 5.0 行程记录与能耗分析
[](https://developer.android.com)
[](https://kotlinlang.org)
[](https://developer.android.com/jetpack/compose)
[](LICENSE)
[](https://github.com/AndyShaman/BYDMate/releases)
[](SUPPORT.md)
**真实能耗、GPS 路线、自动化、AI 分析 — 本地优先,云端功能可选。**
分屏 1/3 和 2/3,仪表盘导航投射,前挡风玻璃上的 Yandex 导航提示,转向灯盲区摄像头,俄语语音助手,ABRP 遥测。
已在 Leopard 3(方程豹 钛3)上测试,支持 Sea Lion 07、宋、Atto 3、Seal、汉。适配 DiLink 3.0、5.0、5.1 及搭载新版 UI7 界面的固件(OTA V1.6)。
**中文** | [English](README.en.md) | [Русский](README.md)
[功能](#功能) | [截图](#截图) | [自动化](#自动化) | [投射到仪表盘](#投射到仪表盘) | [HUD](#hud) | [分屏](#分屏) | [AI 洞察](#ai-洞察) | [ABRP](#abrp--实时遥测) | [安装](#安装) | [编译](#从源码编译) | [赞助](SUPPORT.md)
SOC 圆环周围有四个悬浮窗风格的字段:上方是行程时长、里程表和车内温度;下方是当前行程距离、预估续航和当前行程能耗(带趋势箭头)。颜色和趋势逻辑与悬浮窗保持一致,确保在主屏幕和其他应用之上信息阅读体验一致。
圆环下方:AI 洞察、电池健康小卡片( 钛3 上的 SoH、温度、12V)、两个 TRIP 1/TRIP 2 计数器、最近行程、周期筛选。每个计数器显示里程、电耗(含停车耗电)、行驶时间和费用,从上次重置起计。长按计数器可重置,点按可查看详情弹窗。
### AI 洞察
*驾驶效率分析 — 能耗、趋势、电池、建议(本地或 LLM)*
### 电池健康
*温度、SoH( 钛3)、12V 蓄电池、电芯均衡、电压*
### 行程
*月份 > 日期 > 行程 手风琴式列表,带筛选和能耗颜色标识*
### 自动化
*WHEN→THEN 规则,条件和动作编辑器,触发配置*
### 设置
*电池、电价、货币、洞察来源(本地 / OpenRouter)、数据导出*
### 分屏
*1/3 与 2/3 两个面板,BYDMate 悬浮窗在上层*
---
## 自动化
**自动化**标签页允许你创建规则,通过车辆系统接口直接控制车辆。
### 工作原理
**当** 条件满足 **→ 则** 执行命令。
示例:
- SOC < 20% → 开启内循环
- 速度 > 0 → 关闭遮阳帘
- 车外温度 < 0 → 开启后视镜加热
### 能力
| | 描述 |
|---|-------------|
| **25 种触发器** | SOC、速度、温度、车门、车窗、天窗、胎压、驾驶模式、地理围栏、时段、精确时间和时间范围(含星期选择)、方向盘按键、点击小组件、语音指令、服务启动、网络连接恢复等 |
| **41 条命令** | 车窗(包括单独控制驾驶位和乘客位)、空调、灯光、门锁、天窗、后视镜。直接通过车辆系统接口 |
| **17 种动作类型** | 车辆命令、通知、启动应用、拨打电话、Yandex 导航路线、打开 URL、Yandex Music、暂停、媒体音量、哨兵模式、Wi-Fi 热点、朗读文本、向助手提问、投射到仪表盘、分屏(启动、关闭、切换) |
| **边沿触发** | 仅在 false→true 转换时触发(不是每 3 秒重复触发) |
| **冷却时间** | 可配置的两次触发之间的间隔 |
| **悬浮窗确认** | 动作执行前弹出"取消/执行"窗口,15 秒超时 → 自动取消 |
| **安全保护** | 车速 > 120 km/h 时禁止开窗,> 80 km/h 时禁止开天窗,> 30 km/h 时禁止解锁车门;CAN/SHELL 命令已屏蔽 |
| **日志** | 完整的触发历史及结果 |
| **模板** | 6 个预设规则快速上手 |
| **立即运行** | 在编辑器中手动运行规则,跳过触发器和冷却时间 |
### 逻辑
- **AND** — 所有条件必须同时满足
- **OR** — 任一条件满足即可
- **仅 P 档** — 规则仅在车辆处于 P 档时触发
---
## 悬浮窗
紧凑的 260×108 dp 悬浮窗,叠加在其他应用之上。在地图、媒体播放器和 BYD 应用中均可见。
### 显示内容
三行共七个字段。颜色:图标灰色,数值白色。边框和 SOC% 以状态颜色高亮(SOC 或 12V 中较差的那个)。
**顶行**(小字,13sp):
- ⏱ **当前行程时长** — `N 分钟` 或 `X 小时 Y 分钟`(如 `47 分钟`、`1 小时 12 分钟`)。从点火开启开始计时,熄火结束。行车中的停车(开空调等人、等红灯)计入行程 — 只要电气系统仍在工作,计时器就不会重置
- 🚗 **车内温度** — °C
**中间行**(大字,关键数值):
- **SOC %**(18sp 加粗,彩色)— 动力电池电量。绿色 > 50%,黄色 20-50%,红色 < 20%
- **~N 公里**(28sp,白色)— 预估续航:`SOC × 电池容量 ÷ 基准能耗 × 100`。波浪号表示这是估算值,而非原车读数。基准能耗的计算方式见下方"续航"小节
- **X.X ↓**(18sp,趋势颜色)— **当前行程能耗**,kWh/100km,带趋势箭头(详见下文)
**底行**(小字,13sp):
- 🔋 **电池温度** — °C
- ⚡ **12V** — 蓄电池电压,V。正常 12.5-14.7 V,< 12.0 V = 黄色,< 11.7 V = 红色
### 能耗与趋势箭头(右侧区块)
右侧数字为当前行程能耗,单位 kWh/100km。计算方式为点火以来消耗的能量除以同期行驶的公里数。随着行驶,该数值会逐渐收敛到最终写入行程记录的值:熄火时悬浮窗显示的数值,就是最终存入行程卡片的值。
**前 2 公里**内,悬浮窗会从上一次行程的平均能耗平滑过渡到当前行程的能耗:300 米以下显示上次数值,300 米到 2 公里之间线性混合当前数值,2 公里之后仅显示当前数值。这样做避免了冷启动和加速时出现的 50-60 kWh/100km 的吓人尖峰:在行程还很短时,以上次行程已经稳定的平均值为准,只有当距离足够有代表性后,数值才会切换到本次行程的实际能耗。
**停车时**(熄火状态)悬浮窗显示上次完整行程的平均能耗 — 即该行程最后一刻显示的数值。
**续航** `~N 公里` 采用加权混合计算:50% 来自上次完整行程,30% 来自上上次,20% 来自再上一次(3 公里以下的短行程不计入,因为不具有代表性)。长途行驶时,当前行程最近 10 公里的能耗也会纳入混合:其权重从最初 3 公里时的零开始,到 25 公里时增长至一半。这样在驾驶风格变化时(市区末段上高速、高速回到市区),预估能快速跟上,但又不会因短途或开空调停车而频繁跳动。
这是自动计算的结果。如果不合适,可在 **设置 → 车辆与电池 →"续航计算方式"** 中选择"手动":自己填写 5 个点的表格,电池温度从 +20 到 -20 °C 及对应能耗,并可选填 100% 电量时的续航里程。
**趋势箭头**在行驶 2 公里后出现,将 25 公里滑动平均值与你的常用风格(最近 10 次行程的平均值)进行比较:
- **↓ 绿色** — 驾驶比平时更节能
- **→ 白色**(直线)— 在常用范围内
- **↑ 黄色** — 能耗高于平时
箭头不会因每个红灯而跳动 — 有一定的惯性:要改变颜色,能耗必须明显偏离基准并保持至少一分钟。
**此处"一次行程"的定义**。一次点火循环:启动 → 熄火。行程中开空调停车自然会计入 — 多消耗的 kWh 会反映在分母中。短暂的停顿(红绿灯、重连)不会将行程拆分为两段。如果在高速上 DiLink 杀掉了应用,重启后会从真实的点火时刻继续计算,而非从零开始。
### 操作
- **点击** — 打开 BYDMate
- **长按(1.5 秒)** — 隐藏,直到再次打开 BYDMate
- **拖入垃圾桶** — 完全关闭
- 开关、透明度、重置位置 — 在 **设置 → 小组件** 中
---
## 投射到仪表盘
BYDMate 可以将所选应用(默认导航)投射到驾驶员前方的仪表盘上,这样地图和导航指示就在视线正中,中控屏可以腾出来做别的事。
### 方向盘按键控制
- **短按所选按键**:将应用投射到仪表盘。
- **再次短按**:切回中控屏。
- **长按右星键**:保持原车行为(车机菜单);BYDMate 不会拦截。
### 开启方式
打开 **设置 → 显示**,开启"投射到仪表盘"。应用会自动启用所需的服务(需在安装时完成 ADB 激活,见"安装"章节),并自动将仪表盘切换到投射模式:由"立即显示到仪表盘"开关控制,默认开启。车机上无需手动设置。
之后,短按所选方向盘按键(默认右星键)即可将所选应用投射到仪表盘或切回中控屏。
如果关闭"立即显示到仪表盘",需要自己把仪表盘切换到投射模式一次:点击车机主屏上的投射图标,然后在出现的地图上按 **IPC** 按钮。
### 投射模式:"出厂"与"扩展"
在 **设置 → 显示** 中,投射开关旁边可以选择投射模式。共两种,区别在于应用是否改动车辆的系统设置。
**"出厂"(默认)。** 应用不改动任何系统设置:投射通过虚拟显示器实现(画面镜像到仪表盘),窗口调节滑块工作更精确。安装与卸载不留任何痕迹。限制:投射期间语音助手和 HUD 看不到导航画面,助手的引导信息仅来自导航通知。
**"扩展"。** 导航以独立窗口直接运行在仪表盘显示器上,因此投射期间语音助手和 HUD 可以看到路线。为此应用会开启系统的自由窗口设置(enable_freeform_support)。该模式仅能通过带说明的确认对话框开启,开启后需一次性重启车机(长按音量旋钮)。新模式在下次投射时生效。
**如何恢复出厂设置。** 将模式切回"出厂":应用会立即把系统设置写回出厂值,重启车机后恢复完全生效。此后系统与安装 BYDMate 之前的状态完全一致。
如果你在 3.7 之前的版本中使用过投射,升级后原有行为会自动保留:模式保持"扩展"。从未开启过投射的用户,应用完全不会改动系统设置。
### 投射哪个应用
默认投射 Yandex 导航。开启开关下方有应用选择器:可选择任意已安装的应用(其他导航、媒体播放器等)。新选择在下次按下星键时生效。
### 窗口大小与位置
**设置 → 显示 → "仪表盘窗口大小"** 中共有五个滑块。如果你的车辆上投射画面本来就占满整个仪表盘(例如 Leopard 3),无需调整任何内容:默认值就是原来的全屏效果。
- **宽度**和**高度**(20%-100%)- 窗口占仪表盘的比例。缩小窗口可以腾出空间,周围会透出原生仪表盘内容。
- **水平偏移**(0%-100%)- 窗口位置:0 为左边缘,50 为居中,100 为右边缘。仅在宽度小于 100% 时生效。
- **垂直偏移**(0%-100%)- 垂直方向同理:0 为顶部,50 为居中,100 为底部。
- **缩放**(50%-150%)- 投射应用界面的字体和元素大小:数值越小,文字越小,地图显示的范围越大。
调整会立即生效,投射过程中拖动滑块即可在仪表盘上看到效果。
### 带仪表盘迷你窗口的车型(Sea Lion 07 等)
部分车型的原厂仪表盘并非全屏显示投射画面,而是显示在一个固定区域内(Sea Lion 07 上是右侧三分之一)。全屏窗口在这些车型上会被裁切。解决方法:用上面的滑块缩小窗口并将其移动到可见区域。
Sea Lion 07 车主验证过的数值:**宽度 32%,高度 92%,水平偏移 100%,垂直偏移 6%,缩放 90%**。
在这类车型上无法让窗口占满整个仪表盘:显示区域由仪表盘固件决定,无法控制。
### 工作原理
投射以上述两种模式之一运行。"出厂"模式下,BYDMate 创建虚拟显示器并将所选应用镜像过去,不改动任何系统设置。"扩展"模式下,应用以独立窗口直接运行在仪表盘显示器上,因此投射期间语音助手和 HUD 可以看到路线。为拦截方向盘按键,应用启用了自身的无障碍服务。仅在开关开启时工作,仅用于星键功能。不会修改固件或车辆本身,完全可逆。
---
## HUD
如果车辆配备原车抬头显示器,BYDMate 会把 Yandex 导航的提示投射到前挡风玻璃上:转向图标、到转向点的距离、道路名称和到达时间。限速标志由单独的开关控制,以数字形式发送。当导航提示前方有测速摄像头时,转向箭头会替换为摄像头图标和距离。即使导航被最小化或投射到仪表盘,引导也会继续;Yandex 地图与 Yandex 导航同样可以作为提示来源。
在 **设置 → 显示** 的"HUD(抬头显示器)"栏目中开启:"HUD 导航"开关,以及单独的"箭头下方显示限速标志"。提示通过 HUD 自身的原车通道传输,因此需要配备抬头显示器的车型。如果车上没有该通道,应用会在设置中如实说明,并且不会启用该功能。
---
## 盲区摄像头
打开转向灯后,BYDMate 会自动显示侧方摄像头画面:左转向灯将左侧摄像头显示在仪表盘上,右转向灯在主屏幕上显示一个小窗。如果传感器发现侧后方有车辆,窗口会以橙色边框高亮。
在 **设置 → 显示** 的"盲区"栏目中开启(默认关闭)。同一处还可设置低于该速度不显示摄像头的速度阈值、小窗宽度及其位置:"设置位置"按钮会显示一个空窗口,用手指把它拖到摄像头画面应该出现的地方。需要配备全景影像的车型。
---
## 分屏
两个应用同时显示在屏幕上:一个占三分之二,另一个占三分之一。典型搭配是宽侧放导航、窄侧放音乐或聊天应用。左右两侧可以互换,应用可以随时更换,所选的应用组合会被记住。
### 开启
1. 打开 **设置 → 分屏**,开启"分屏 1/3 + 2/3"开关。
2. 如果开关下方出现需要重启的提示,请重启一次车机(长按音量旋钮)。如果你已经在使用"扩展"投射模式,则无需重启。
功能关闭时,应用不会改动任何系统设置。关闭开关会将设置恢复为出厂值;但如果"扩展"投射模式也在使用该窗口设置,则需要把该模式也关闭后,设置才会恢复为出厂值。
### 分屏机制
开关下方可以选择由谁来分屏:"BYDMate 窗口"(默认)或"原生分屏"。
- **BYDMate 窗口** - 即下文描述的 1/3 与 2/3 布局,带底部胶囊按钮。
- **原生分屏** - 由车辆固件自己分屏。即使 BYDMate 窗口不可用(DiLink 5.1),这种方式仍然有效。显示效果取决于固件:支持三分之一比例的固件会打开 1/3 与 2/3 两个面板,其余固件则将屏幕平分,第二个应用通过系统窗口选择。
在搭载新版 UI7 界面的固件上不会出现机制选择项:分屏由车辆自己完成,1/3 与 2/3 面板是原生的,开启时无需重启车机。
### 启动方式
共三种。设置里分屏栏目标题旁的"?"图标在车内随时可以查看说明。
- **通过小组件**(最方便)。在设置的"点击小组件"栏目开启"点击区域",并将"左侧点击操作"设为"启动分屏"。之后点击小组件左侧三分之一区域即可打开分屏,再次点击关闭。
- **通过自动化。** 规则中有三个动作:"分屏"、"关闭分屏"、"切换分屏"。例如可以在启动导航时自动开启分屏。
- **语音。** 直接让语音助手打开分屏。
### 首次启动与选择应用
首次启动时会依次选择宽侧(2/3)和窄侧(1/3)的应用。组合会被记住,下次直接打开。之后可以通过底部胶囊按钮或在设置中更换应用,设置里还有"重置上次组合"。
### 底部胶囊按钮
分屏激活期间,屏幕底部有一个小胶囊按钮。点击打开菜单:切换位置、交换应用、为左右任一侧选择其他应用、退出到普通全屏。分屏关闭后胶囊自动消失。
### 与其他功能的兼容
- 如果有全屏内容覆盖(倒车影像、摄像头、视频),分屏会自动关闭。用平常的方式即可恢复:点击小组件或语音命令。
- 从 BYDMate 按返回键会回到分屏。
- 如果启动 DiLink 原生分屏,本应用的分屏会自动干净地退出,两种分屏不能同时运行。
---
## 充电记录
**充电记录**标签页自动记录每次实际的电量补充:按月列出充电记录、周期和累计统计、AC 与 DC 筛选。并非每次插入充电枪都会生成记录:只有当 SoC 确实上升时才会创建记录。如果有人刚插上枪一分钟就拔掉,日志中不会有任何记录。
### 什么算一次充电
如果充电期间电池容量或 SoC 有所增长,就会写入记录。BYDMate 依次尝试三个数据源,取第一个可用的值:
1. **容量增量**(kWh),如果车载系统报告了更新后的值。
2. **SoC 增量**(活跃充电期间),按当前电池容量换算为 kWh。
3. **粗略估算**,根据 SoC 增量与标称容量计算,如果前两种方式均无数据。
如果 BYDMate 在充电期间运行,记录会立即出现。如果插枪发生在应用启动之前,或者车辆进入了深度睡眠,BYDMate 会在下次启动时发现 SoC 相比充电前有所跃升,然后补上记录。因此即使是在车库中离线充电,也会出现在日志中。
### 如何区分 AC 与 DC
充电类型按优先级由两个信号决定:
1. **车载系统的枪状态**:gun-state 2 = AC,3 或 4 = DC。某些 BYD 车型上该值不一定始终存在,此时进入下一步。
2. **会话平均功率**:大于 15 kW = DC,否则为 AC。AC 充电物理上不超过 11 kW,DC 充电站最低从 22 kW(CCS 慢充)起步,因此 15 kW 的阈值可以可靠地区分两种模式。
充电记录标签页有三个筛选器:"全部"、"AC"、"DC"。
### 手动添加与编辑
如果某条记录缺失或数据看起来异常:
- **标签页顶部的 `+ 充电` 按钮**:手动添加充电记录,填写日期、时长、kWh、电价。
- **长按某条记录**:弹出"编辑"/"删除"菜单。编辑模式允许修改已有记录的任意字段。
> 此功能正在积极测试中。在 钛3 上运行稳定。在其他 BYD 车型上自动检测可能出现偏差:例如车载系统可能不报告功率或枪类型,导致 AC/DC 判断错误。遇此情况请手动编辑记录,如有可能请将日志发送至 [Issues](https://github.com/AndyShaman/BYDMate/issues)。
---
## 电池健康(SoH)
SoH(State of Health,健康状态)是动力电池的"健康"百分比,由车辆的车载系统按其内部算法计算。
在 **BYD (方程豹 钛3)** 上,BYDMate 直接从车载系统读取此值并显示在"电池健康"卡片中。这是**来自车辆的真正 SoH**,而非根据 SoC 差值估算的数值:BYDMate 只是读取车辆自己记录的数据。
在其他 BYD 车型上,对此值的访问尚未确认,因此 SoH 不显示。卡片中的其他指标(电池温度、12V、电芯均衡、最低/最高电压)在所有支持的车型上均可用。
如果你的车暴露了 SoH 并且你希望帮助添加支持,请提交 [Issue](https://github.com/AndyShaman/BYDMate/issues),附上车型和出厂年份。
---
## SoH 和自动充电记录( 钛3)
在 钛3 上,SoH 和自动充电记录直接从车辆的车载系统读取数据。默认开启,无需手动切换或设置。应用首次访问车载系统时,DiLink 会弹出系统 **ADB 调试**权限对话框,显示密钥指纹。点击 **"允许"(Allow)**,勾选 **"始终允许来自此计算机的连接"(Always allow from this computer)**,这样 DiLink 不会在每次应用启动时重复询问。
之后,SoH 会出现在"电池健康"卡片中,充电记录开始以真实的 kWh 数值自动记录。
对于无法访问车载系统的车型(旧固件、非 DiLink),应用会优雅降级:BYDMate 的其他功能(行程、能耗、悬浮窗、自动化)照常工作,仅 SoH 和自动充电记录不可用。
---
## 如果你不是 钛3
BYDMate 在(方程豹 钛3)上开发和测试。在其他 BYD 车型上大多数功能仍然可用,但存在一些差异。首次启动前请检查:
- **行程记录**:在 钛3 上,行程来自内置 BMS `energydata` 数据库。在没有该数据库的车型(宋、元及类似车型)上,BYDMate 从实时数据流原生记录行程,行程列表会自动填充。通过 SOC 差值计算的能耗比 BMS 粗略一些,但列表不再是空的。
- **电池容量**:默认为 72.9 kWh( 钛3)。前往 **设置 → 车辆与电池** 设置你自己的容量。例如:Atto 3 = 60.5 kWh,Seal AWD = 82.5 kWh,汉 EV = 85.4 kWh。否则续航和行程费用计算将不准确。
- **SoH**:仅在 钛3 上显示。在其他车型上"电池健康"卡片正常显示,但不含 SoH 字段。
- **充电记录**:AC/DC 判断算法针对 钛3 调校。在其他车型上记录可能出现延迟或功率不准确,尤其是 DC 充电。当自动判断不准时,请使用手动添加和编辑。
- **自动化和悬浮窗**:在所有车型上表现一致,因为它们使用车辆系统服务。
如果有功能不工作或显示异常数据,请提交 [Issue](https://github.com/AndyShaman/BYDMate/issues),附上你的车型和 DiLink 固件版本,并附上你车辆的参数目录:**设置 → 服务与数据 → "保存 fid 目录"**。文件 `fid-dump-….txt` 会出现在 Download 文件夹中。文件里只有技术参数标识符,不含 VIN、不含位置信息、不含任何个人数据。
为什么需要它:不同 BYD 车型的参数集不同。在 钛3 上开启座椅通风的命令,在宋上可能是另一个编号,甚至不存在。这正是部分功能在其他车型上失效的原因。你车辆的参数目录能显示这些参数在你的固件上的名称和编号,这样我们就能依据你车辆的数据修复问题,而无需盲猜。
---
## 目标设备
| 参数 | 值 |
|----------|-------|
| 平台 | DiLink 5.0(Android 12,API 32) |
| 芯片 | Snapdragon 780G |
| 屏幕 | 15.6" 横屏,1920x1200 |
| GMS | 无(AOSP,不含 Google Play Services) |
| 测试车型 | BYD 钛3(方程豹 钛3) |
---
## 工作原理
```
BYD energydata (BMS SQLite) → HistoryImporter → Room DB → Compose UI
autoservice (系统 Binder) → TrackingService ↗ ↓
Android LocationManager → TripTracker (GPS) ↗ LocalInsightEngine / OpenRouter
autoservice (命令写入) ← AutomationEngine ← Rules (Room DB)
```
| 数据 | 来源 |
|------|--------|
| 能耗、里程、时长 | BYD energydata (BMS) |
| SOC、速度、温度 | 车辆系统服务 (autoservice Binder) |
| 电芯电压、12V、SoH | 车辆系统服务 (autoservice Binder) |
| GPS 坐标 | Android LocationManager |
| AI 分析 | 设备端规则(默认)或 OpenRouter API(可选) |
| 车辆控制 | 车辆系统服务(命令写入) |
**无需 OBD 适配器**,也**无需第三方 D+**。BYDMate 通过 `autoservice` 系统服务(原车 BYD 系统使用的同一服务)在无线 ADB 的 shell 权限下直接读取数据和控制车辆。
---
## 数据与网络
| 功能 | 目标服务 | 发送内容 | 启用条件 |
|---|---|---|---|
| 云端 AI 洞察 | OpenRouter | 7/30 天行程和充电聚合统计 | 仅在输入 API 密钥后 |
| 语音助手(LLM) | OpenRouter / z.ai / 自建服务器 | 指令文本、车辆状态(SOC、空调等),导航请求时包含 GPS 坐标 | 仅在配置提供商后 |
| 助手网络搜索 | Exa / z.ai / OpenRouter | 搜索查询文本 | 已输入密钥且助手调用了该工具 |
| 天气(助手) | Open-Meteo | GPS 坐标或地点名称(地理编码) | 助手调用了该工具 |
| 充电站(助手) | Overpass(overpass-api.de / maps.mail.ru) | GPS 坐标 | 助手调用了该工具 |
| 在线 TTS 语音 | MiniMax / fal.ai / Replicate / OpenRouter | 语音回答文本 | 仅选择在线语音时 |
| 行程详情地图 | OpenStreetMap 瓦片服务器(若设置中选择了高德地图,则为高德服务器) | 可见地图区域坐标 | 打开行程地图或地点编辑器时 |
| 更新检查 | GitHub API | 无(仅获取发布列表,版本比较在本地进行) | 自动 |
| ABRP 实时遥测 | abetterrouteplanner.com | SOC、功率、车速、温度、里程、胎压、充电状态、电池容量、SoH、本次充电量(kWh)、车辆型号(GPS 不发送) | 仅在输入令牌后 |
| 遥测 Webhook | 设置 → 集成 → Webhook | 与 ABRP 相同的 JSON,POST 到你的 URL,每 1/8/30 秒发送一次(行驶/充电/停车);GPS 坐标仅在单独开关开启时发送 | 默认关闭 |
未配置任何密钥时,仅更新检查(GitHub)和查看行程路线时的地图瓦片会离开车机,以及在用户明确请求时下载语音模型(github.com)。API 密钥仅存储在应用本地数据库中,除发送给相应提供商外不会传输至任何地方。
---
## 安装
### 1. 开启 ADB
没有 ADB 时,BYDMate 作为离线行程日志运行:来自原车数据库的历史记录、路线地图、CSV 导出、基于已有数据的 AI 洞察。
开启 ADB 调试是读取或写入车辆参数的一切功能所必需的:悬浮窗和仪表盘上的实时数值(SOC、续航、温度、12V)、SoH、自动充电日志、自动化、投射到仪表盘、分屏、HUD 提示、盲区摄像头、语音控制车辆以及日志记录。
这些功能默认开启,无需手动切换。应用首次访问车载系统时,DiLink 会弹出一次"允许 ADB 调试"对话框 — 点击 **允许(Allow)** 并勾选 **"始终允许来自此计算机的连接"(Always allow from this computer)**。
- **DiLink 3 / 4** — 可自行开启 ADB:安装 [BydDevelopmentTools](https://disk.yandex.by/d/e3gEnY9P2Y9_fQ),进入 *设置 → 版本管理*,连续点击 *恢复出厂设置* 10 次,启用 *USB 连接时开启调试模式* 和 *无线 ADB 调试开关*。在更新版本的 DiLink 3/4 固件上,ADB 可能和 DiLink 5 一样被锁定 — 此时请按以下方式处理。
- **DiLink 5.0** — ADB 调试**已被锁定**,只能从中国远程解锁。通常通过 **淘宝** 卖家完成(搜索 `DiLink 5.0`,国内约 ¥40 / 国外约 ¥80,支付宝付款)。卖家通过你提供的二维码远程打开工程菜单,之后 ADB 即可正常启用。
详细步骤:[PDF 指南(俄语)](docs/guides/dilink5-adb-activation-ru.pdf) — 已包含在仓库中。
### 2. DiPlus(D+)不再需要
自 v3.0.0 起,BYDMate 直接与车辆系统通信,**不再需要**第三方 D+(迪加)应用。所有数据读取和命令发送均通过车辆系统服务完成。
如果你使用过早期版本并安装了 D+,在确认 BYDMate 正常工作后可以从 DiLink 上卸载 D+。
### 3. 安装 BYDMate
1. 从 [**Releases**](https://github.com/AndyShaman/BYDMate/releases) 下载 BYDMate APK
2. 传输到 DiLink:通过 U 盘、网络或 ADB(`adb install BYDMate.apk`)
3. 如有提示,允许安装未知来源应用
### 4. 首次启动
1. 打开 BYDMate — 出现设置向导
2. 授予**位置**和**存储**权限。随着功能陆续开启,应用还会请求:语音助手所需的麦克风、盲区摄像头所需的相机、按姓名拨打电话所需的通讯录、悬浮窗和通知所需的悬浮窗权限,以及用于识别当前活动应用的使用情况访问权限
3. 设置**电价**(用于行程费用计算)
### 5. 后台运行
**重要:** 关闭 BYDMate 的"禁止后台应用",否则 DiLink 会杀掉应用:
*DiLink > 设置 > 通用 > 禁止后台应用 > BYDMate = **OFF***
### 6. 配置(可选)
在 **设置** 中可以修改:
- **电池容量** — 默认 72.9 kWh( 钛3)
- **电价** — 家庭充电(AC)和快充(DC),货币
- **能耗阈值** — 颜色标识的边界值(绿色/黄色/红色)
---
## 车辆系统
**设置 → 服务与数据 → 车辆系统** 中有两个选项,改变的是车辆本身的行为,而不是应用的行为。
**方向盘音量旋钮。** 开启此开关后,按下旋钮会暂停/继续播放,而不是切换音源。适用于固件更新后按下旋钮变成切换音源的情况。默认关闭。
**车机界面语言。** 仅适用于 UI7 固件。此按钮会打开 BYD 隐藏的原厂语言对话框,包含完整语言列表,含俄语、乌克兰语和波兰语。语言由固件本身更改,应用不写入任何内容。部分车主切换为俄语后自动泊车会失效,此时用同一按钮切回 English 即可。
---
## AI 洞察
仪表盘卡片分析最近 7 天的统计数据(与之前 7 天对比),显示标题、简要总结、指标表和最多 **5 条建议**。默认模式**无需联网**。
### 两种模式
| 模式 | 开启位置 | 网络 | API 密钥 |
|------|----------|------|----------|
| **本地(离线)** | 默认 | 不需要 | 不需要 |
| **OpenRouter(云端)** | 设置 → 集成 →「OpenRouter(云端)」 | 需要 | OpenRouter API Key |
在 **设置 → 集成** 中使用 **「分析来源」** 开关。本地模式下可点击 **「刷新洞察」** 手动重算。自动更新为**每天一次**(结果缓存在车机)。
### 数据来源
全部从本地 Room 数据库计算 — **不含 GPS、路线或个人标识**:
- **行程** — 公里、千瓦时、平均能耗、速度、短途(< 5 公里)、最佳/最差能耗、费用
- **发动机怠速** — 千瓦时和小时数(`idle_drains`)
- **夜间怠速** — 在 **22:00–06:00** 开始的会话
- **充电** — 交流/快充千瓦时、次数、每千瓦时价格、本周充电总费用
- **12V** — 当前电压和一周趋势(最多 7 天历史)
- **电芯** — 来自实时车辆数据的最大−最小压差(mV)
- **温度** — 行程平均室外温度
**分析最低要求:** 最近 7 天至少 **5 次行程**。否则卡片显示「数据不足」。
### 卡片结构
1. **标题和总结** — 本周最重要的一条信息,由最高优先级规则决定(见下表)。
2. **Dynamics** — 周环比表:能耗、行程数、短途占比、平均距离、发动机怠速、夜间怠速(仅本地模式)。
3. **建议** — 最多 5 条符合规则的要点,按优先级排序。
本地逻辑在 `LocalInsightEngine.kt`:确定性阈值 + 字符串模板(`local_insight_*`)。已本地化为 6 种语言(ru / en / zh / pt / pl / be)。
### 标题优先级(本地模式)
| 优先级 | 条件 | 示例标题 |
|--------|------|----------|
| 90 | 12V < 11.8 V | 「12V 电压过低」 |
| 85 | 电芯压差 > 50 mV | 「电芯压差过大」 |
| 80 | 能耗较上周上升 > 15% | 「能耗上升 15%」 |
| 78 | 夜间耗电 ≥ 4 kWh 且占怠速 ≥ 35% | 「夜间怠速耗电」 |
| 70 | 能耗上升 > 5% | 「能耗上升 8%」 |
| 60 | 能耗下降 > 5% | 「能耗下降 10%」 |
| 10 | 其他 | 「能耗稳定」 |
### 建议(bullets)
并行检查多条规则,展示**优先级最高的 5 条**。主题包括:
| 主题 | 触发条件 |
|------|----------|
| 夜间怠速 | 夜间发动机开启耗电 ≥ 0.3 kWh |
| 快充更贵 | 交流与快充均 ≥ 3 kWh,快充贵 15%+ |
| 快充为主 | ≥ 2 次快充,快充 > 交流×1.5 |
| 短途偏多 | ≥ 40% 行程不足 5 公里 |
| 发动机怠速 | 怠速耗电 ≥ 2 kWh |
| 12V 偏低/下降 | 11.8–12.4 V 或一周下降趋势 |
| 电芯压差 | 31–50 mV |
| 冬季能耗上升 | ≤ 5°C 且能耗上升 |
| 最佳/最差行程 | 差距 ≥ 5 kWh/100 |
| 能耗改善 | 较上周下降 > 5% |
| 高速行驶 | 平均速度 ≥ 75 km/h |
| 高/低能耗 | ≥ 28 或 ≤ 16 kWh/100 |
| 里程/行程增加 | 较上周 +20% |
| 高温空调 | ≥ 25°C,能耗 ≥ 22 |
| 混合充电 | 同一周有交流与快充 |
| 费用 | 每 100 公里费用或本周充电费用 |
| 良好习惯 | 夜间/日间怠速占比低,12V/电芯正常 |
完整规则见 `LocalInsightEngine.kt` 和 `LocalInsightEngineTest.kt`。
### 云端模式(OpenRouter)
可选:由 LLM 生成文本而非模板。设置步骤:
1. 在 [OpenRouter](https://openrouter.ai/) 注册(免费)
2. 在 OpenRouter 控制台创建 **API Key**(Keys 部分)
3. 在 BYDMate:**设置 → 集成** → 选择 **「OpenRouter(云端)」**
4. 将 API 密钥粘贴到「OpenRouter API Key」
5. 点击 **「选择模型」** — 显示可用 LLM 列表(含免费模型)
6. 点击 **「保存并获取洞察」**
云端模式仅发送**聚合统计数据**(与本地规则相同的指标)— 不含 GPS 和路线。请求**每天一次**,响应本地缓存。Dynamics 表与本地模式相同;标题、总结和建议措辞由 LLM 生成。
---
## ABRP — 实时遥测
BYDMate 可以通过官方 Iternio Telemetry API 将实时车辆数据发送到 [A Better Route Planner](https://abetterrouteplanner.com/)(ABRP)。ABRP 利用这些数据根据你真实的电池状态来更新路线规划和剩余续航,而非使用平均理论值。
此功能**可选**,默认关闭,需在设置中手动开启。
### 如何获取 Token
ABRP 使用"通用实时数据 Token(Generic Live Data Token)"— 车库中每辆车一个独立的 Token:
1. 打开 [abetterrouteplanner.com](https://abetterrouteplanner.com/) 并登录。
2. 进入车库,选择你要获取实时数据的车辆。车辆必须**已保存在车库**中,否则 Token 不会出现。
3. 齿轮图标 → **"车辆设置"** → **"数据"** → **"连接实时数据"**。
4. 在提供商列表中选择 **"Generic"**,点击 **"关联"(Link)**。显示一长串 Token 字符串 — 这就是 `User Token`。
**如果列表中没有"Generic"**:在 ABRP 车库中将车辆型号代码切换到任何常见的 BYD 车型(如 BYD Atto 3 或 BYD Seal),保存后 Generic 即会出现。关联 Token 后,可以将型号代码改回。
### 在 BYDMate 中设置
1. **设置 → 集成** → **"ABRP — 遥测"** 区域。
2. 将获取的 Token 粘贴到 **"来自 ABRP 的实时数据 Token"** 字段。
3. 可选:ABRP 车型代码(如果你知道在 ABRP 库中你车辆的确切代码)和发送间隔(5-120 秒,默认 12 秒 — Iternio 推荐值)。
4. 点击 **"保存 ABRP"**,然后打开 **"实时数据 → A Better Route Planner"** 开关。未保存 Token 时开关不可用。
5. DiLink 上的 ABRP 应用(或手机浏览器)现在可以看到实时的 SOC、功率、温度、充电状态。
### 发送的内容
仅发送聚合的车辆指标,不含标识符:
- **SOC** — 当前动力电池电量百分比
- **Speed** — 速度,km/h
- **Power** — 当前牵引功率(充电时为负值,按 Iternio 要求)
- **Battery / cabin / exterior temp** — 电池、车内和车外温度
- **Capacity** — 标称电池容量
- **Odometer** — 里程,km
- **Tire pressures** — 四个轮胎的气压
- **is_charging / is_parked** — 状态标志
- **is_dcfc / kwh_charged** — 充电站类型(DC vs AC)和当前会话的 kWh(当车辆暴露车载系统数据时发送,否则这些字段直接省略)
- **soh** — 真实电池 SoH( 钛3)
### 不会发送的内容
- **不传输 GPS 坐标。** ABRP 作为独立的 Android 应用直接在 DiLink 上运行,会自己从操作系统读取位置。通过第三方渠道重复发送坐标只会将位置泄露给外部服务器。
- 也不会发送:VIN、设备标识符、行程历史、路线、用户设置。
### ABRP 如何计算剩余续航
ABRP 结合其车型库模型与遥测数据(当前 SOC、电池温度、行驶速度、风力、道路剖面、海拔)来得出预测。BYDMate 不会发送自己计算的"预估续航"— ABRP 有自己更精确的路线感知估算,还会考虑天气和海拔因素。
### Webhook:把同样的数据发到自己的服务器
发送给 ABRP 的同一份 JSON 可以 POST 到你自己的地址:Home Assistant、Node-RED、VPS 上的脚本。没有队列:服务器不可用时该样本丢失,一分钟后再次尝试。
**设置**
1. **设置 → 集成** → **"Webhook — 遥测"** 区域。
2. **URL**:仅支持 `https://`。普通的 `http://` 不可用(Android 阻止明文流量,仅 `localhost` 允许)。若服务器没有证书,可在前面放 Caddy 或 nginx 配合 Let's Encrypt,或使用 Cloudflare Tunnel 之类的隧道。
3. **密钥**(可选):通过 `Authorization: Bearer <密钥>` 请求头发送,服务器据此区分你的车和其他请求。
4. **"向 Webhook 发送坐标"**:默认关闭。仅当服务器是你自己的时再开启:JSON 中会加入 `lat`、`lon`、`heading`。
5. 点击 **"保存 Webhook"**,然后打开 **"实时数据 → 自己的服务器"** 开关。
**收到的内容**
`POST <你的 URL>`,`Content-Type: application/json`,请求体为一条样本:
```json
{"utc":1756040000,"soc":67,"speed":52.0,"power":18.4,"batt_temp":29.0,"ext_temp":24.5,
"capacity":72.9,"odometer":12345.6,"cabin_temp":22.0,
"tire_pressure_fl":2.5,"tire_pressure_fr":2.5,"tire_pressure_rl":2.4,"tire_pressure_rr":2.4,
"is_charging":0,"is_parked":0,"soh":98.5,"car_model":"byd:leopard3"}
```
字段和单位与 Iternio Telemetry API 一致:`utc` 为秒,`power` 为 kW(按车辆上报的值),温度为 °C,胎压为 bar,`odometer` 为 km。没有数据的字段(如停车时的 `speed`,非充电时的 `kwh_charged`)直接不出现。频率:行驶时每秒一次,充电时每 8 秒一次,停车时每 30 秒一次。不解析响应内容,只看是否为 2xx 状态;失败后 60 秒再试。
Webhook 与 ABRP 相互独立:可以只开一个,也可以两个都开。
---
## 从源码编译
```bash
# 要求:JDK 17,Android SDK 34
git clone https://github.com/AndyShaman/BYDMate.git
cd BYDMate
./gradlew assembleDebug
```
---
## 技术栈
- **Kotlin** 2.1 + **Jetpack Compose** + Material 3
- **Room** (SQLite) + **Hilt** (DI) + **OkHttp**
- **osmdroid** (OpenStreetMap) + **Coroutines/Flow**
- Min SDK 29 / Target SDK 29 / Compile SDK 34
---
## 致谢
- **[BYD Trip Info](https://www.byd-seal-forum.de/forum/thread/1811-byd-trip-info-app/)** (`org.jayb.bydapp`) by jayb — 原始 DiLink 行程应用,BYDMate 的灵感来源
- **[DiPlus](https://www.dilink.cn/)**(迪加)by Van Design — 车辆数据桥接应用,早期 BYDMate 版本使用(v3.0.0 起不再需要)
---
## 赞助项目
本项目非商业性质,仅为爱好开发。如果你想表示感谢,详见 [SUPPORT.md](SUPPORT.md)。如果不想,也感谢你的信任。
---
## 许可证
**PolyForm Noncommercial 1.0.0** — 源码开放,仅限非商业使用。
详见 [LICENSE](LICENSE)。
Copyright (C) 2026 [AndyShaman](https://github.com/AndyShaman)