Skip to content

About

Zontes Motorcycle Home Assistant HACS

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Latest commit

 

History

34 Commits

Folders and files

Repository files navigation

Zontes Smart Motorcycle Integration for Home Assistant

hacs_badge

HomeAssistant自定义集成,用于接入升仕(Zontes)智能摩托车数据。通过官方App接口获取车辆实时状态,支持多车辆自动轮询、数值转换、国际化显示,并支持原生远程开锁/上锁控制。


✨ 功能特性

  • 纯AI写的
  • 多车支持:自动轮询账户下所有摩托车,每辆车创建独立设备。
  • 实时数据:获取油量、胎压、续航、速度、电压、水温、里程、保养里程、GSM信号、卫星数、骑行时间、故障码、锁状态、车型等信息。
  • 远程控制:支持通过私有 TCP 协议对车辆进行原生的远程开锁与上锁控制。
  • 数值修正:
    • 胎压原始值自动 ×2 得到 kPa
    • 里程(总里程/小计里程)、电压、平均油耗原始值 ÷10 显示
    • 骑行时间(RideTimes)分钟转小时显示
  • 国际化:支持中文、英文界面(实体名称自动翻译)。
  • 设备跟踪:通过 device_tracker 实体在地图上显示车辆位置。
  • GPS 坐标转换:GCJ-02自动转换WGS84

📦 安装

通过 HACS 安装(推荐)

  1. 确保已安装 HACS。
  2. 在 HACS 中点击“集成”,选择“自定义存储库”。
  3. 添加仓库 URL:https://github.com/cdcp998/Zontes_Motorcycle-ha,类别选择“集成”。
  4. 点击“下载”按钮,下载完成后重启 Home Assistant。

手动安装

  1. 下载 最新发布版本 的 Zontes_Motorcycle-ha.zip。
  2. 解压到 Home Assistant 配置目录的 custom_components/zontes_motorcycle 文件夹中。
  3. 重启 Home Assistant。

⚙️ 配置

  1. 进入 配置 → 设备与服务,点击“添加集成”。
  2. 搜索并选择 Zontes Smart Motorcycle。
  3. 输入您的升仕账号、密码,以及更新间隔(默认30秒)。
  4. 点击提交,集成将自动获取您的车辆列表并创建设备和实体。

🧩 实体说明

每辆车会生成以下实体(前缀为 实体域.车型名称_):

实体键 描述 单位 转换
oil 油量 % 无
pressure_front 前轮胎压 kPa 原始值 ×2
pressure_rear 后轮胎压 kPa 原始值 ×2
range 续航里程 km 无
speed 速度 km/h 无
voltage 电池电压 V 原始值 ÷10
water_temp 水温 °C 无
odo_mileages 总里程 km 原始值 ÷10
trip_mileage 小计里程 km 原始值 ÷10
maintenance_mileage 保养剩余里程 km 无
gsm_rssi GSM信号强度 dBm 无
satellite_num 卫星数量 个 无
ride_times 累计骑行时间 h 原始值 ÷60
fault_code 故障码 - 无故障时显示“没有故障”
trip_max_speed 最高速度 km/h 无
oil_ause 平均油耗 L/100km 原始值 ÷10
vehicle_model 车型 - 无

此外,每辆车还包含:

  • 锁控制实体 (lock):支持远程下发开锁与设防指令。
  • 二进制传感器 (binary_sensor):表示锁的当前物理状态(0=锁定,1=解锁)。
  • 设备跟踪器 (device_tracker):显示GPS位置。

🗂️ 文件结构

custom_components/zontes_motorcycle/
├── __init__.py          # 集成入口与数据协调器
├── manifest.json        # 元数据
├── config_flow.py       # 配置流
├── const.py             # 常量
├── api.py               # API客户端 (含4510 TCP协议与加解密逻辑)
├── sensor.py            # 传感器实体
├── binary_sensor.py     # 二进制传感器
├── lock.py              # 远程锁控制实体
├── device_tracker.py    # 设备跟踪器
├── convert.py           # 坐标纠偏与数值转换
├── common.py            # 通用辅助函数
└── translations/        # 国际化文件
    ├── en.json
    └── zh-Hans.json

tools/                           # 独立工具 (凭据一律经环境变量注入, 不落真实凭据)
├── zontes_4510_client.py        # 4510 独立参考客户端 (lock|unlock, 双钥加密)
├── zontes_4510_tablet_test.py   # 平板(安卓)网络出口控制变量探针 (adb+nc)
├── zontes_rsa_key_scan.py       # 内存/堆转储 RSA-2048 公钥扫描 (钥轮换应急用)
└── zontes_4510_verify.py        # pcap 帧解析与登录签名离线校验

tests/
├── test_4510_qishi_vectors.py   # 帧签名/帧格式/双钥离线回归测试 (虚构向量)
└── PROTOCOL_REVERSE_PLAYBOOK.md # 协议逆向踩坑与破局实战手册 (完全脱敏)

⚠️ 注意事项

  • 账号互踢说明:升仕新版接口启用了单设备登录限制。为避免在 HA 轮询时将您的手机 App 踢下线,建议在升仕 App 的“车辆授权”中将车辆授权给一个副账号,并在 HA 中使用该副账号进行配置。
  • 首次添加集成时需要输入正确的账号密码,若账号未注册或密码错误会给出明确提示。
  • 如果车辆具有 StartTime / EndTime 授权时间,超出时间后对应实体将自动变为不可用。
  • 更新间隔不宜过短,建议至少30秒,避免被服务器限流。
  • 若某辆车切换失败(例如“没有该授权车辆信息”),集成会跳过该车,其他车辆不受影响。

🔄 更新日志

V0.3.4 (2026-09-09) — 4510 控车链路彻底打通

  • 🔑 根因定案(双 RSA 密钥):服务端对登录帧与指令帧使用两把不同的 RSA 私钥——登录帧 *UL 用 A 钥加密,指令帧 *UClear/*ULoc(及保活帧)必须用 K1 钥加密。此前"登录 OK、指令零回显"的故障,正是指令帧误用了 A 钥导致服务端无法解密而被静默丢弃。
  • 🔬 K1 钥来源:2026-09-09 从运行中的官方 com.tayo.msbox v1.56 内存(region space 堆转储)提取(180 处引用的活动公钥),实测 UClear/ULoc 均获服务端指令回显 + *AM,2,1#/1,1# 设备确认;生产代码路径 async_set_lock_state 端到端验证成功(真实锁车,changeTime 更新)。
  • ⚙️ 热覆盖:指令钥经 ZONTES_4510_CMD_KEY 环境变量可整体替换(App 升级可能导致钥轮换)。
  • 🧪 测试同步:tests/test_4510_qishi_vectors.py 新增"登录钥≠指令钥"断言。

V0.3.3 (2026-09-09)

  • 🔬 协议逐字节对齐:抓取第三方客户端《骑仕》1.56 成功控车全量 pcap 后逐包核对——本集成登录/指令帧的字段、哈希算法、时间戳与 seq 格式与骑仕完全一致(4 会话 8 帧全部离线反算匹配,向量已固化进 tests/test_4510_qishi_vectors.py,纯离线可回归)。
  • ✂️ 帧纪律同步骑仕:帧内哈希一律大写、登录帧 *UL 版本字段后不再带 #(与抓包明文回显逐字节一致)。
  • ⚡ 成功判据对齐骑仕:骑仕在收到服务器指令回显 *,OK#(约 50~100ms)后即关闭连接、车辆异步执行,并不等待 *AM 设备确认。锁指令现以“服务器回显接受”为成功判据(*AM 属长连接附加回执、不再强制等待),避免慢速 *AM 造成长时间挂起;真实锁态由轮询 myCarData.lock 兜底核对。
  • 🧪 控制变量实测结论(重要):相同逐字节帧分别从 PC 与平板自身网络栈直发,均“登录 OK + *BR,1# 正常、指令静默无回显”;而同账号骑仕 App 于同一 WLAN 可 100% 控车。差异不在帧内容/网络出口/时序,判定为服务端账号/设备会话态门控,机制待进一步核实。新增 tools/zontes_4510_tablet_test.py(脱敏 adb+nc 探针)与 tools/zontes_4510_client.py(独立参考客户端)用于复现与验证。
  • 🔒 仓库结构规范:工具收敛至 tools/、离线测试收敛至 tests/;全库脱敏,真实凭据一律经环境变量注入(ZONTES_USER_CODE/PKE/MCUID/4510_HOST/PORT/VERSION/MAC_GUID)。

V0.3.2 (2026-08-28)

  • ⚡ 性能优化:修复 4510 远程控制链路"秒开 vs 死等十几秒"玄学延迟的根因。_read_until 原先每次读块空闲超过 0.2s 就提前放弃,而设备确认帧 *AM 需要 0.85s(车辆蜂窝唤醒,物理瓶颈),导致正常慢速确认被误判失败并触发无谓的重连重试;现改为空闲时继续等待直到总超时,指令通常在 15 秒内一次成功。
  • ✂️ 精简协议流程:移除登录后多余的心跳帧 *UH(实测无心跳时指令同样被服务器接受;且旧格式心跳紧贴登录帧发送反而可能导致会话静默丢弃指令);登录未获确认时快速判失败,避免向服务器多发无效指令、加重限流。
  • ⚡ 响应提速:指令确认成功后,锁实体改为后台刷新协调器状态(不再阻塞等待),避免 OAuth 登录慢(实测 6~20s)或网络抖动时语音控制多等十几秒。
  • 🐛 修复缺陷:校准锁状态二进制传感器显示。实测确认 lock=0 为设防锁定、lock=1 为解锁后,修正 binary_sensor.is_on 与 HA lock device_class(on=Unlocked)的正确语义映射,恢复正确的状态显示,并在源码中补充了防踩坑注释。
  • 🧪 测试工具:新增 _probe/4510/benchmark_4510.py(分步耗时基准)与 _probe/4510/verify_fixed.py(修复后端到端验证),精确测量 TCP 连接 / 登录 / 心跳 / 指令回显 / 设备确认各步骤耗时。

V0.3.1 (2026-08-27)

  • ✨ 接口迁移:适配升仕官方最新版 ifino.com:8081 API 与 OAuth2 鉴权架构。
  • ✨ 新增功能:解析 4510 私有 TCP 协议,新增 lock 实体,支持远程开锁与上锁控制。
  • ✨ 实体扩充:新增车架号、发动机号、车牌号等车辆档案及售后服务信息传感器。
  • 🐛 修复缺陷:校准锁状态映射(修正为 lock=0 锁定,lock=1 解锁)。
  • 🛡️ 稳定性优化:增加 API 请求与 TCP 控制的退避重试机制,缓解服务端限流问题。

V0.1.2 (2026-03-18)

  • ✨ 添加:GCJ-02自动转换WGS84

V0.1.1 (2026-03-18)

  • ✨ 添加:修改扫描间隔选项
  • 🐛 修复:domain错误

v0.1.0 (2026-03-17)

  • ✨ 新增:多车辆自动轮询支持
  • ✨ 新增:授权时间管理,过期车辆自动移除
  • ✨ 新增:骑行时间(RideTimes)分钟转小时显示
  • ✨ 新增:故障码无故障时显示友好文本(支持国际化)
  • ✨ 新增:设备信息显示车型、固件版本
  • 🐛 修复:胎压、里程、电压、油耗数值转换错误
  • 🐛 修复:空字符串导致传感器崩溃的问题
  • 🌐 国际化:支持中文/英文实体名称

🤝 贡献

欢迎提交 Issue 或 Pull Request。
项目地址:https://github.com/cdcp998/Zontes_Motorcycle-ha


📄 许可证

GPL-3.0 license

About

Zontes Motorcycle Home Assistant HACS

Topics

Resources

Stars

4 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages