948462448/rinnai-c33-ha

GitHub: 948462448/rinnai-c33-ha

一个实验性的 Home Assistant 集成,通过透明 TCP 代理拦截和解析通信协议,实现对 Rinnai C33 锅炉的本地控制与状态监控。

Stars: 0 | Forks: 0

# Rinnai C33 Capture for Home Assistant [中文说明](README.zh-CN.md) 这是一个用于 Rinnai C33 锅炉的实验性 Home Assistant 集成,使用 HF-LPB100 WiFi 遥控模块。 本项目将 Home Assistant 变为 Rinnai WiFi 遥控器与原厂云服务器之间的透明 TCP 代理。它可以观测原始的本地流量,在 Home Assistant 中公开有用的状态,并向已连接的遥控器发送少量经过测试的命令。 本项目与 Rinnai 没有任何隶属关系,也未获得其认可。 ## 支持的功能 已在一个配备 HF-LPB100 WiFi 遥控器的 Rinnai C33 设备上进行了测试。 支持的命令: | Home Assistant 服务 | 含义 | | --- | --- | | `rinnai_c33_capture.set_dhw_temperature` | 设置生活热水目标温度 | | `rinnai_c33_capture.set_heating` | 启用或禁用供暖 | | `rinnai_c33_capture.set_fast_hot_water` | 启用或禁用快速热水模式 | 公开的状态: | 实体 | 含义 | | --- | --- | | `sensor.rinnai_c33_last_packet` | 代理状态、数据包计数器、最后数据包元数据 | | `sensor.rinnai_c33_dhw_target_temperature` | 生活热水目标温度 | | `switch.rinnai_c33_heating` | 底层供暖状态镜像 | | `switch.rinnai_c33_fast_hot_water` | 底层快速热水状态镜像 | | `sensor.rinnai_c33_temperature_42` | 候选只读温度或状态字段 | | `sensor.rinnai_c33_temperature_43` | 候选只读温度或状态字段 | | `binary_sensor.rinnai_c33_field_47` | 候选二进制 runtime/状态字段 | 其他 Rinnai 型号、固件版本或区域云 endpoint 的表现可能有所不同。 ## 工作原理 HF-LPB100 模块通常被配置为 TCP 客户端。在观测到的设置中,它会连接到: ``` wifiboiler_s1.rinnai.com.cn:6969 ``` 此集成没有更改模块自身的服务器地址,而是保持该设备设置不变,并更改家庭网络内部的 DNS 解析: ``` wifiboiler_s1.rinnai.com.cn ``` 此后,WiFi 遥控器将向 Home Assistant 发起其原有的 TCP 连接。 然后,Home Assistant 会向真实的上游服务器打开第二个 TCP 连接,并双向转发字节。 ``` HF-LPB100 remote -> wifiboiler_s1.rinnai.com.cn:6969 -> router DNS/hosts override -> Home Assistant rinnai_c33_capture:6969 -> real Rinnai cloud server:6969 ``` 在转发流量时,集成会解析如下所示的 frame: ``` fa d4 ff ff ``` 稳定观测到的字段有: | 字段 | 含义 | | --- | --- | | `0x14` | 生活热水目标温度 | | `0x18` | 启用供暖 | | `0x13` | 快速热水 | 在控制方面,集成会向已连接的遥控器写入 cloud 风格的命令 frame。例如,将生活热水目标温度设置为 44 C 会发送: ``` fa d4 9f 37 ff ff 04 00 14 0e 01 2c ``` 详细的协议说明位于 [docs/protocol.md](docs/protocol.md) 中。 ## HACS 安装 是的,本仓库的结构支持作为 HACS 自定义仓库进行安装。 HACS 会将集成安装在 Home Assistant 的 `custom_components` 目录下。 1. 在 Home Assistant 中打开 HACS。 2. 进入 **Integrations**。 3. 打开右上角的三点菜单并选择 **Custom repositories**。 4. 添加此仓库 URL: https://github.com/948462448/rinnai-c33-ha 5. 选择类别 **Integration**。 6. 下载 **Rinnai C33 Capture**。 7. 重启 Home Assistant。 HACS 安装完文件后,请继续进行下方的 YAML 和路由器 DNS 设置。 ## 手动安装 将此目录复制到 Home Assistant 中: ``` custom_components/rinnai_c33_capture ``` 最终路径应如下所示: ``` /custom_components/rinnai_c33_capture/manifest.json /custom_components/rinnai_c33_capture/__init__.py /custom_components/rinnai_c33_capture/services.yaml ``` 复制文件后,请重启 Home Assistant。 ## Home Assistant YAML 将以下内容添加到 `configuration.yaml`: ``` rinnai_c33_capture: host: 0.0.0.0 port: 6969 upstream_host: wifiboiler_s1.rinnai.com.cn upstream_ip: 123.56.82.103 upstream_port: 6969 remote_host: 192.168.1.90 log_file: rinnai_c33_capture.log ``` 配置选项: | 选项 | 必填 | 默认值 | 含义 | | --- | --- | --- | --- | | `host` | 否 | `0.0.0.0` | TCP 代理的监听地址 | | `port` | 否 | `6969` | TCP 代理的监听端口 | | `upstream_host` | 否 | `wifiboiler_s1.rinnai.com.cn` | 原始云端主机名 | | `upstream_ip` | 否 | 空 | 上游服务器的可选固定 IP | | `upstream_port` | 否 | `6969` | 原始云端 TCP 端口 | | `remote_host` | 否 | 空 | WiFi 遥控器的可选 IP;用于选择命令 socket | | `log_file` | 否 | `rinnai_c33_capture.log` | HA 配置目录内的抓取日志文件 | 当您的路由器 DNS 覆盖将云端域名指向 Home Assistant 时,`upstream_ip` 非常有用。如果没有 `upstream_ip`,Home Assistant 可能会解析到相同的被覆盖地址,从而意外地连接回自身。 ## 路由器 DNS 或 Hosts 设置 在您的路由器上添加本地 DNS 或 hosts 覆盖: ``` wifiboiler_s1.rinnai.com.cn ``` 示例: ``` 192.168.1.240 wifiboiler_s1.rinnai.com.cn ``` 在 Xiaomi 或 Redmi 路由器上,这可以通过 Xiaomi WiFi 应用的自定义 Hosts 页面来完成。格式如下: ``` IP domain ``` 请保留一条恢复途径。如果遥控器或移动应用停止工作,请移除此 hosts 覆盖并重启或重新通电 WiFi 遥控器。遥控器随后应恢复到原始的云端路径。 ## 可选的 UI 控制 该集成公开了底层状态和服务。要实现常规的可点击 UI 控制,请将: ``` examples/rinnai_c33_controls.yaml ``` 复制到您的 Home Assistant `packages` 目录中,或将其合并到您自己的 template YAML 中。 如果您尚未使用 packages,请将以下内容添加到 `configuration.yaml`: ``` homeassistant: packages: !include_dir_named packages ``` 然后将示例文件放置在: ``` /packages/rinnai_c33_controls.yaml ``` 重启 Home Assistant。之后您应该会获得: | 实体 | 用途 | | --- | --- | | `number.rinnai_dhw_target_temperature` 或本地化等效项 | 可点击的目标温度控制 | | `switch.rinnai_heating_control` 或本地化等效项 | 可点击的供暖开关 | | `switch.rinnai_fast_hot_water_control` 或本地化等效项 | 可点击的快速热水开关 | Home Assistant 可能会根据显示名称生成本地化的实体 ID。如果确切的实体 ID 不同,请在开发者工具中搜索 `Rinnai`。 ## 使用服务 设置生活热水目标温度: ``` service: rinnai_c33_capture.set_dhw_temperature data: temperature: 44 ``` 开启供暖: ``` service: rinnai_c33_capture.set_heating data: enabled: true ``` 关闭供暖: ``` service: rinnai_c33_capture.set_heating data: enabled: false ``` 开启快速热水: ``` service: rinnai_c33_capture.set_fast_hot_water data: enabled: true ``` 关闭快速热水: ``` service: rinnai_c33_capture.set_fast_hot_water data: enabled: false ``` 请从无害的空操作(no-op)测试开始,例如再次设置当前温度,或者关闭一个已经关闭的功能。 ## 验证清单 重启 Home Assistant 后: 1. 确认 `sensor.rinnai_c33_last_packet` 存在。 2. 它的初始状态可能是 `listening`。 3. 如果未重新连接,请重启或重新通电 WiFi 遥控器。 4. 连接后,传感器属性应包含 `peer` 地址,并且 `packet_count` 应该增加。 5. 使用空操作(no-op)服务调用来验证命令注入。 需要检查的示例状态: ``` sensor.rinnai_c33_last_packet sensor.rinnai_c33_dhw_target_temperature switch.rinnai_c33_heating switch.rinnai_c33_fast_hot_water ``` ## 独立工具 在 Home Assistant 外部运行本地透明代理: ``` python3 tools/rinnai_c33_tcp_capture.py --host 0.0.0.0 --port 6969 \ --upstream-host 123.56.82.103 --upstream-port 6969 ``` 运行带有微型本地控制 API 的代理: ``` python3 tools/rinnai_c33_tcp_capture.py --host 0.0.0.0 --port 6969 \ --upstream-host 123.56.82.103 --upstream-port 6969 \ --control-host 127.0.0.1 --control-port 6970 ``` 控制 API 示例: ``` curl 'http://127.0.0.1:6970/dhw?temperature=44' curl 'http://127.0.0.1:6970/heating?enabled=0' curl 'http://127.0.0.1:6970/fast?enabled=1' ``` 解码抓取的日志: ``` python3 tools/rinnai_c33_decode_capture.py captures/example.log ``` ## 安全注意事项 - 本项目用于控制供暖设备。请仔细测试。 - 数据包抓取可能包含设备标识符和家庭行为数据。 - 除非您已进行审查和脱敏处理,否则请勿发布原始抓取数据。 - 确保路由器 hosts 覆盖易于撤销。 - 这是一个实验性的逆向工程集成,不是安全系统。 ## 许可证 MIT
标签:Home Assistant, TCP代理, 并发处理, 智能家居, 智能锅炉, 流量拦截, 物联网, 逆向工具