找回密码
 立即注册

微信扫码登录

搜索
楼主: sm1314

[技术探讨] 方太F2.i油烟机局域网接入HomeAssistant

[复制链接]

18

主题

585

回帖

4568

积分

元老级技术达人

积分
4568
金钱
3930
HASS币
182
发表于 3 天前 | 显示全部楼层
我正好有个方太油烟机一直没研究咋介入,谢谢!
回复

使用道具 举报

18

主题

585

回帖

4568

积分

元老级技术达人

积分
4568
金钱
3930
HASS币
182
发表于 昨天 01:21 | 显示全部楼层
本帖最后由 louis_lee 于 2025-10-16 01:28 编辑

搞定了哈哈

图像2025-10-16 00.48.jpeg

流程可以完善下:
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一直在调用,似乎可以保障时间准确,后续把代理服务器程序做成服务跑起来试试。

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian ( 晋ICP备17001384号-1 )

GMT+8, 2025-10-17 03:39 , Processed in 0.112982 second(s), 7 queries , MemCached On.

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表