# 小米电风扇接入homekit


小米电风扇通过WiFi支持米家app联动。 可以借助于home assistant来将米家WiFi和homekit打通。

# 安装home assistant

我尝试过很多方案， 最后还是决定使用docker的方案来安装， 可以避免一些python依赖版本不一致或者gcc等导致无法启动的问题。

> 非常感谢https://home-assistant.cc/提供了大量的中文资料。

## vmbox安装centos8虚拟机

这次是在windows上通过Oracle VirtualBox安装了一台centos8的虚拟机， 然后再安装docker环境的， 如果觉得麻烦 可以直接在windows上安装docker。 我是习惯了在linux环境下使用docker， 相关的命令感觉用得更顺手一下。

这部分就不记录了， 网络使用桥接windows宿主机的网卡即可

## centos安装docker环境

这个就是傻瓜式安装， 建议是直接参考官网链接：https://docs.docker.com/engine/install/centos

## 运行home assistant镜像

这个是docker官方镜像仓库dockerhub提供的地址， https://hub.docker.com/r/homeassistant/home-assistant 常规来说， 我们直接使用
```shell
docker pull homeassistant/home-assistant
```
即可将镜像拉取到本地。
> 但如果你发现拉取速度奇慢， 就算是走了全局代理还是拉不下来的话， 建议你增加一个dockerhub的镜像源，用于加速。 dockerhub镜像源这部分，原来的话是有很多的，但是不知道为啥大量的镜像仓库关闭了。我找到了这个地址，建议按照这个方法修改一下，然后再拉取就可以了。https://gist.github.com/y0ngb1n/7e8f16af3242c7815e7ca2f0833d3ea6

拉取完镜像咱们还得启动。 和大多数的镜像一样，都需要我们挂载一个持久卷，home assistant也不例外。

借助一下https://home-assistant.cc/installation/docker/ 提供的脚本
```shell
docker run -d --name="home-assistant" -v /你的/config/路径:/config -v /etc/localtime:/etc/localtime:ro --net=host homeassistant/home-assistant
```
上面的脚本是home-assitant.cc提供的脚本。我个人习惯于安装到home下，修改后
```shell
docker run -d --name="home-assistant" -v /home/homeassitant:/config -v /etc/localtime:/etc/localtime:ro --net=host homeassistant/home-assistant
```

启动以后， 通过访问该centos获取到的IP地址， 加上home assitant默认的端口即可通过浏览器访问home assitant服务。

http://你的centos虚拟机获取到的IP地址:8123/

# 安装小米风扇插件

## 安装HACS

上一步中， 我们已经可以方案home assistant了， 根据它页面的引导我们创建了用户名和密码。 但是默认下， home assistant没有直接支持小米电风扇， 所以你在“集成”中搜索不到小米电风扇的支持。

https://github.com/syssi/xiaomi_fan/ 这个GitHub repo才是支持小米电风扇的“插件”。 但是你想要安装这个插件之前， 你得先安装这个repo指定的插件商店，也就是我标题中写的HACS

https://hacs.xyz/ 这个是HACS的官网， 在官网中有一个很明显的安装引导。
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188594397/6biK58wxB.png)

HACS的安装方法就建议根据其官网给出的方案进行即可。

安装HACS其实本身并不复杂， HACS也是依赖于home assistant的特性做的一个插件。home assitant支持在其配置文件同级目下创建`custom_components`文件夹，然后你将hacs的文件夹放到这个创建好的`custom_components`下，home assitant便可以识别了。

如果你按照我上面docker运行的shell来做的，那么安装hacs的路径就是这个样子
```shell
/home/homeassitant/custom_components/hacs/这里就是hacs的一些文件了
```
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188595854/5EArBNN3Y.png)

放好以后， 我们还需要重启home assitant。

因为我是用的docker安装的，所以我直接使用
```shell
docker restart 容器ID
```
即可实现重启的效果。

重启好了以后， 可以在home assitant左侧导航栏中看到HACS的选项
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188597125/Vm6QezZF_.png)

剩下的就是根据HACS的引导去设置你的GitHub账号的token，用以HACS往后去下载GitHub上的repo。

> 这一步我没有失败， 因为整个过程中我都是全局代理。 我在windows宿主机上科学上网并开启了局域网共享，所以我在centos8中跑了一行命令用于全局代理
> ```shell
> export all_proxy=socks5://ip:port
> ```
> 如果你的没有socks5的方案， http和https的脚本依次是
> ```shell
> export http_proxy=http://ip:port
> export https_proxy=https://ip:port
> ```


安装好了以后， 就可以正常使用HACS了
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188598434/kKncoCQwn.png)

## 安装xiaomi_fan

https://github.com/syssi/xiaomi_fan

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188599818/moEy3DjwS.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188601240/n0NhhsoTH.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188602758/tfctV4oH0.png)
在这个`Add Costom repository URL`中直接复制粘贴`https://github.com/syssi/xiaomi_fan`即可， 右侧的目录， 建议选择`Integration`， 最后直接点击ADD按钮即可。

> 我在这里卡了很久，每次等了很久以后，就只等到一个闪退。幸好home assitant的日志不难读。 使用docker logs查看日志
> ```shell
> docker logs -f 容器ID
> ```
> 我得到的错误信息是网络请求`raw.githubusercontent.com`出现ssl验证错误。这种问题遇得多了，无非就是时间差，IP获取失败，代理挂了。我最先检查得就是代理，因为我用得是windows开得局域网共享代理，直接查看相关日志，没有问题，IP请求都是OK的。第二是检查centos时间，因为我安装centos8这个虚拟机已经很久没用了，`date`一看，时间戳确实不对。再仔细检查时区是美国，改成了上海。第三检查了一下IP，因为`raw.githubusercontent.com`这个域名应该被dns污染，我自己常用的macOS中都是自建了一个dnsproxy服务，我没有直接进入容器，直接在centos上ping了一下这个域名，发现解析出来的结果居然是127.0.0.1，我也懒得去查真正的原因是啥了，在网上找了一个在线dns解析的服务，拿到了真正的IP，修改centos hosts文件，重启docker容器完事。

## 配置xiaomi_fan

配置xiaomi_fan这个插件其实很简单， 就是去修改home assitant提供的配置文件， 使用的`yaml`这种格式， 所以修改的时候只要注意格式别弄错了就好了。

麻烦的是需要去拿小米电风扇的一个token。

再次感谢https://home-assistant.cc/component/xiaomi/wifi/ （虽然home assitant官网也有相关的教程，但是没有home-assitant.cc提供的接地气）

### 获取xiaomi_fan所需的token

这个方法理论上是适用于所有的WiFi接入的米家设备。

我手里只有一台没电的小米4是安卓机了，所以我首先考虑的方案就是安装安卓模拟器，事实证明，这种方案真的是省事不少。https://www.yeshen.com/ 我用的是夜神，安装简单，就不描述了

装好夜神模拟器以后， 需要安装5.0.19版本的米家， 这个也是https://home-assistant.cc/component/xiaomi/wifi/提供的。

安装好米家app以后， 需要登录小米账号， 并且操作一下小米电风扇（因为这个时候米家app才会真正的去连接风扇，我们才能拿到我们想要的token）

操作一次以后，我们可以在夜神模拟器上安装ES文件浏览器。
**注意**， 如果你这个时候全部照着https://home-assistant.cc/component/xiaomi/wifi/操作的话，会出问题，因为/data/data下没有数据了。这个可能是因为安卓模拟器提供的Android操作系统版本导致的差别，但是ES文件浏览器有提供搜索功能，所以我们只需要搜索`miio2.db`也是可以找到这个文件的然后再使用`aSQLiteManager`去读取`miio2.db`这个数据库文件即可。
> 补充一点， 因为数据库里面有很多token，所以你最好是根据IP去筛选，home-assitant.cc也是这样建议的，并且还直接写好了sql语句。 但是判断IP还是多多少少有些麻烦，如果你的路由器设备页面中，你无法根据主机名去判断的话，我建议你可以先拔掉风扇的电源，截图，然后插电连上WiFi，再比较就可以找到IP地址了。

### 修改home assitant配置文件

这一步建议直接参考https://github.com/syssi/xiaomi_fan 提供的readme.md

## 确认home assitant可以直接操作风扇

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188604516/EPuLqOuCy.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188606286/u89cL4-Fe.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188608059/uO2oRS0aD.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188609827/hCmPdabtL.png)
尝试一下，没别的问题这里就可以直接操作你的小米电风扇了。

# 打通homekit

## 配置homekit支持

这个是home assitant自带的。 入口是配置->集成->右下角的加号
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188611205/4RLLQOgmiH_.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188613375/wnF3SrZUz.png)
创建桥接器，然后选择设备类型，因为我目前只有一个风扇，所以我去掉了默认的选项，只勾选上了一个fan
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188615421/sU-Np6dTge.png)
点击提交，选择一个区域，比如我就选择客厅了
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188617194/um0vD4dxA.png)
点击完成，一个homekit桥接器就创建好了。

这个时候就是激动到搓手手的时候了。

## 使用IOS 家庭App连接homekit

手机上的操作就非常简单了，打开家庭app，有一个扫码的入口，完了以后，找到home assitant左侧这个通知，点它就可以拿到你想要的二维码了
> 不得不说， 这个二维码入口有点隐藏了，最开始的时候， 我不知道， 一直在那个homekit桥接点点点。。。

![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188618617/2YRBf1uVu.png)

这个二维码扫描一次以后 就会消失了。如果下次还想绑定的话 就直接删掉homeit桥接重新新建吧
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188620204/wMF2syDKB.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188621703/iKQAL0CB3.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188623257/hjaQXjR3H.png)
![](https://cdn.hashnode.com/res/hashnode/image/upload/v1654188625103/NrY21bhiX.png)

还有一个问题没有解决，就是homekit桥接器过一会儿就会无响应，但是日志里面没有什么明显的操作，在网上查了小半天没找到解决方案，后续找到了再更新。

到此END！
