将公牛智家设备接入 Home Assistant

在文章将 Yeelight 烛光氛围灯接入 Apple HomeKit 中,笔者介绍了通过 Homebridge 将设备加入 HomeKit 的方法。此后,笔者也发现,Home Assistant 相比于 Homebridge 功能更加强大,能够将全部智能设备集中管理,创建自动化也非常方便,因此切换到了 Home Assistant。不过,家中还有大量的公牛智家开关没有找到办法接入 Home Assistant,原因是这一型号的智能开关并不像小米等品牌有开放的协议用于控制,网络上也没有找到相关的开源代码。这样就只能通过对公牛智家 App 的抓包和逆向分析,来得到通过 Home Assistant 进行控制的方法了。

经过分析,实现设备操作需要的几个 API 分别是:

  • /v1/auth/form,提交用户名和密码进行登录(如果是在公牛智家 App 中通过手机验证码登录,就需要先设置密码)
    登录成功后,服务器将下发 access_tokenrefresh_tokenopenid
  • /v1/auth/token,提交 refresh_token,换一个新的 access_token
    出于安全原因,access_token 的有效期并不长,因此需要定时刷新
  • /v2/home/devices,提交 access_token,获取设备列表
  • /v1/dc/setDeviceProperty/,提交 access_token 和设备 Id,改变设备开关状态

同时,当用户通过物理按键操作了开关之后,还需要能够在 Home Assistant 中接收到反馈,实时更新开关的状态。在公牛智家 App 中,发现了相关的 MQTT 代码。订阅 MQTT 需要提供 access_tokenopenid,订阅成功后就可以获取到设备的状态通知了。

全部代码已开源至 hass-iotbull,可以直接在 Home Assistant 中使用。