aaronse/Kohler-DTV-Plus
GitHub: aaronse/Kohler-DTV-Plus
为 Kohler DTV+ 淋浴系统控制器提供基于逆向工程 CGI API 的开源替代 Web 界面,解决原厂触摸屏故障后的操控问题。
Stars: 0 | Forks: 0
# Kohler DTV+
对 Kohler DTV+ 系统控制器(K-99695-NA / K-99693-P-NA)的分析,以及一个可用的替代界面。
## 为什么做这个
该系统的 K-99693 墙面界面出现了故障。控制器仍然报告其他所有组件状态正常——阀门、放大器、控制器的状态均为 `conn`——只是再也无法对它们进行控制了:
```
num_interface = 0
ui1_con_string = not_seen <- the failed touchscreen
valve_1_con_string = conn
amp_con_string = conn
controller_con_string = conn
```
该控制器提供了一个未公开的 CGI API,供其自带的网页使用。这就是我们的替代输入方案。
## 包含什么
| | |
| --- | --- |
| [app/](app/) | 仿照 K-99693 样式并基于 React + Vite 构建的界面。可在开发机、局域网设备或手机浏览器上运行。 |
| [PROTOCOL.md](PROTOCOL.md) | 控制器的 CGI API —— 传输特性、endpoints、payload 字段和安全评级。 |
| [DESIGN.md](DESIGN.md) | 架构、决策、测试,以及 Android/Capacitor 移植版本的需求。 |
| [DISCLAIMER.md](DISCLAIMER.md) | 安全警告、CGI 风险等级,以及本代码库如何执行这些限制。 |
| [LICENSE.md](LICENSE.md) | Open Maker License,及其涵盖与不涵盖的范围。 |
| [CONTRIBUTING.md](CONTRIBUTING.md) / [CLA.md](CLA.md) | 如何安全地做出贡献,以及贡献者协议。 |
| [AGENT.md](AGENT.md) / [CLAUDE.md](CLAUDE.md) | 针对在此工作的智能体(agents)的约定,包括 story-log 惯例。 |
| [STORY-LOG.md](STORY-LOG.md) | 重大事件与撤销记录,最新内容排在最前。 |
| [research/SHUTOFF-INVESTIGATION.md](research/SHUTOFF-INVESTIGATION.md) | 关于淋浴中途停止问题的公开调查。 |
| [research/SOURCES.md](research/SOURCES.md) | 监控索引 —— 在哪里搜寻社区的最新发现。 |
| [research/FIELD-NOTES.md](research/FIELD-NOTES.md) | 自动化 DTV+ 时会出现什么问题 —— 来自社区的、带有来源的故障报告,以及我们为此所做的更改。 |
| [research/controller-mirror/](research/controller-mirror/) | 原样镜像的控制器自带 Web UI,以及实时 payload 捕获记录。 |
| [research/xagon0/](research/xagon0/) | 引入的第三方分析内容 —— 参见 [PROVENANCE.md](research/xagon0/PROVENANCE.md)。 |
| [research/reference/](research/reference/) | Kohler 的用户指南,已渲染作为界面参考。 |
## 快速开始
```
cd app
npm install
npm run dev # http://localhost:5180, and on your LAN IP
```
如果你的控制器不在 `192.168.0.115`,请设置 `KOHLER_HOST`。
```
npm test # unit tests, no hardware
npm run selftest # live checks, strictly read-only — never opens a valve
```
请参阅 [app/README.md](app/README.md) 了解有关托管、API 范围以及安全
门控的信息。
## 安全门控
该控制器没有身份验证,并且暴露了可能会清除数据或使其变砖的 endpoints。在 [app/server/cgi-safety.mjs](app/server/cgi-safety.mjs) 中,每个已知的 endpoint 的风险评级为 0-5,代理在发送任何数据包之前,会拒绝所有高于 **2/5** 的请求。在已知的约 50 个 endpoints 中,有 18 个是可以访问的;而 `reset_factory.cgi`、`clear_dt.cgi`、`fileupload.cgi`、`unpack_bin.cgi`、`edit_dt.cgi`、`rpc.cgi` 及其相关 endpoints 则被永久设置为不可访问。
## 硬件
DTV+ 系统控制器主板 —— 照片由
[xagon0](https://github.com/xagon0/Kohler-DTV-Plus/blob/master/Images/Images.md) 拍摄,
从上游的 11 MB PNG 重新编码为 962 KB 的 WebP 格式,保持完整的 3710×2242 分辨率(参见 [research/xagon0/PROVENANCE.md](research/xagon0/PROVENANCE.md))。
该控制器
通过 RS-485 与阀门和放大器通信,并使用具有 HTTP/0.9 风格的 CGI 与其他所有设备交互;[PROTOCOL.md](PROTOCOL.md) 涵盖了后者的内容。
## 许可证
本代码库中的原创工作均基于
[Open Maker License](https://github.com/aaronse/OpenMakerLicense) —— 即附带制造商补充条款的 AGPL-3.0。明确允许个人、教育、维修和小型工作室使用;而托管服务和商业再分发则需要获得许可。
此处引入的第三方材料 —— xagon0 的分析、Kohler 的指南与控制器 UI,以及继承自 `timelery` 的内容 —— **不**在涵盖范围内,并且**不**属于我们许可的对象。有关范围划分表,请参见 [LICENSE.md](LICENSE.md)。
DTV+ 系统控制器主板 —— 照片由
[xagon0](https://github.com/xagon0/Kohler-DTV-Plus/blob/master/Images/Images.md) 拍摄,
从上游的 11 MB PNG 重新编码为 962 KB 的 WebP 格式,保持完整的 3710×2242 分辨率(参见 [research/xagon0/PROVENANCE.md](research/xagon0/PROVENANCE.md))。
该控制器
通过 RS-485 与阀门和放大器通信,并使用具有 HTTP/0.9 风格的 CGI 与其他所有设备交互;[PROTOCOL.md](PROTOCOL.md) 涵盖了后者的内容。
## 许可证
本代码库中的原创工作均基于
[Open Maker License](https://github.com/aaronse/OpenMakerLicense) —— 即附带制造商补充条款的 AGPL-3.0。明确允许个人、教育、维修和小型工作室使用;而托管服务和商业再分发则需要获得许可。
此处引入的第三方材料 —— xagon0 的分析、Kohler 的指南与控制器 UI,以及继承自 `timelery` 的内容 —— **不**在涵盖范围内,并且**不**属于我们许可的对象。有关范围划分表,请参见 [LICENSE.md](LICENSE.md)。标签:MITM代理, React, Syscalls, Web界面, 云资产清单, 协议分析, 数据可视化, 智能家居, 权限提升, 物联网, 自定义脚本, 逆向工程