本帖最后由 louis_lee 于 2025-10-16 01:28 编辑
搞定了哈哈
流程可以完善下:
1. 方太幸福家添加设备
2. 路由器设置dns 将api.fotile.com指向本地机器,并在路由器设置禁止方太设备连接互联网
3. 启一个mqtt broker,如果使用的是HAOS,可以在HA OS中安装 emqx 加载项并配置好HA对应的MQTT集成(由于不是默认的Mosquitto,所以得自己额外配置,Mosquitto由于鉴权问题在这个项目中不建议使用)
4. DNS指向的机器(需80端口可用)运行楼主已经写好的代理服务器程序,记得把api.fotile.com对应的真实ip填下(自己ping下)。再替换转发的mqtt服务器,如果使用HAOS自带的emqx,可以就填HAOS的内网IP
5. 拔烟机电源,等完全关闭后再插上,稍等一会(5min)就可以观察到代理服务器程序输出
6. 从代理服务器程序的输出中,抓住涉及mqtt topic的请求,如下
"clientId": "Fotile_APP_452875346",
"ip": "48.87.26.43",
"port": 1873,
"topics": [{
"indentifier": "control",
"isSubPub": 2,
"level": 1,
"name": "control/{product_id}/{device_id}"
}],
"vendorId": "Fotile"
}
其中 control/{product_id}/{device_id}是用来发送开、关等命令,sync/{product_id}/{device_id}是用来获取状态
7. 打开home assistant mqtt集成的配置功能,可以用来监听sync topic,同时操控下烟机,可以观察到sync topic下的输出。再根据观察的情况,结合官方文档iot.fotile.com,可以尝试向control主题发送内容。调试一会很容易掌握规则。
8. 最后就是使用mqtt集成添加设备(这个地方有个bug,就是风扇使用前端无法配置状态,某字段有问题)。f2i参考配置如下,直接改改放在configuration.yaml中重启即可:
mqtt:
- switch:
command_topic: control/XXX/XXX
device:
identifiers:
- 02K7M3WYP9TJ9WX2582QM64Z63
model: Fotile
model_id: f2i
name: Fotile-hood
device_class: switch
name: "\u7535\u6E90\u5F00\u5173"
payload_off: '{"PowerSwitchAll": 1}'
payload_on: '{"PowerSwitchAll": 2}'
qos: 1.0
state_off: '1'
state_on: '2'
state_topic: sync/XXX/XXXX
unique_id: 02K7M3WYP9TJ9WX2582QM64Z63_99e521fd2eac41218f492b1c37081fe4
value_template: '{{ value_json.PowerSwitchAll }}'
- switch:
command_topic: control/2e41d092c1b6a9a832a119ba3428361f/1146142769
device:
identifiers:
- 02K7M3WYP9TJ9WX2582QM64Z63
model: Fotile
model_id: f2i
name: Fotile-hood
device_class: switch
name: "\u7167\u660E\u706F"
payload_off: '{"Light": 0 }'
payload_on: '{"Light": 255 }'
qos: 1.0
state_off: '0'
state_on: '255'
state_topic: sync/xxx/xxx
unique_id: 02K7M3WYP9TJ9WX2582QM64Z63_eb14aeac36e9455ab0df9e83ab7f1594
value_template: '{{ value_json.Light }}'
- fan:
command_template: '{% if value == "ON" -%}{"WorkMode":2,"FanLevel":3}{%- else
-%}{"WorkMode":0,"FanLevel":0}{%- endif %}'
command_topic: control/xxx/xxx
device:
identifiers:
- 02K7M3WYP9TJ9WX2582QM64Z63
model: Fotile
model_id: f2i
name: Fotile-hood
name: 烟机风扇
payload_off: 'OFF'
payload_on: 'ON'
payload_reset_preset_mode: None
preset_mode_command_template: "{% if value == '\u81EA\u52A8' -%}{"WorkMode"\
:2,"FanLevel":3}{%- elif value == '\u5F3A' -%}{"WorkMode":1,"FanLevel"\
:3}{%- elif value == '\u5F31' -%}{"WorkMode":1,"FanLevel":3}{%- else -%}{"\
WorkMode":0,"FanLevel":0}{%- endif %}"
preset_mode_command_topic: control/xxx/xxx
preset_mode_state_topic: sync/xxx/xxx
preset_mode_value_template: "{% if value_json.WorkMode == 2 -%}\u81EA\u52A8{%-\
\ elif value_json.WorkMode == 0 -%}\u5173\u95ED{%- elif value_json.FanLevel\
\ == 2 -%}\u5F31{%- else -%}\u5F3A{%- endif %}"
preset_modes:
- "\u81EA\u52A8"
- "\u5F3A"
- "\u5F31"
- "\u5173\u95ED"
qos: 1.0
state_topic: sync/xxx/xxx
unique_id: 02K7M3WYP9TJ9WX2582QM64Z63_cb4d0472006141fc97da3550bd630f18
state_value_template: '{% if value_json.FanLevel >0 -%}ON{%- else -%}OFF{%- endif
%}'
至于代理服务器要一直跑嘛?目前看只要烟机不断电重启就不用,不过我看有些时间同步的API一直在调用,似乎可以保障时间准确,后续把代理服务器程序做成服务跑起来试试。
|