记录第一次HomeAssistant开发插件的历程

插件地址

其实已经有不少人用百度的接口来做人脸识别,但是看了一圈,没有我想要的效果,于是看了一些插件的写法就入手了。

在开发的过程中遇到一些令人难忘的坑,接下来一一道来。

问题1

总体结构写完后,马上在自己的HA测试,一直没有效果,因为是用docker下运行的,所以又重新新建了一个空的HA进行测试,发现有信息显示,但是之前的HA一直没有效果,反反复复试了好多次,一直排查不出来是为什么。

就这样测试了一天,还是没有效果,刚好遇上HA更新了,就重新更新下HA并安装,这下好了,两个docker都无法使用了。

这时候突然想起来,把计算机运行的东西打印出来,就这样一个个像断点测试一样,打印出日志,每个地方排除错误,终于最后让我发现问题所在了,原因在baidu-aip这个包的版本问题,因为我用的接口是需要最新版本的,而开发HA插件中有一个manifest.json这个文件可以指定包的版本,而我因为是第一次开发,照着别人的代码进行改,刚好那个人没写这些,所以系统会自动帮我安装一个版本,所以,最后再这个文件中指定了版本,问题也就解决了。

问题2

除了这个问题,在开发中还碰到一个偶然发生的Bug,重启初始化的时候,会有某个实体不可用,这个问题排查了好久,一直不知道哪里有问题,后来一直更改配置,发现代码是没有问题的,然后反复测试,直觉告诉我,实体的启动顺序有点问题,也就是本来是第一个启动的,却一直没有成功,然后导致不可用,那么我的想法是会不会启动太快了,然后我在关键部分加了个sleep缓冲了一下,果然问题解决了。

问题3

因为我是用了两个接口,需要返回两个结果,如果识别不到信息,某个接口可能会返回None,一般来说,这种可能发生异常的情况都在try,catch中完成,在代码结构中,我往往先用res1来接收第一个接口的结果,然后res2接收第二个接口的结果,在某次测试中发现,有个结果一直不出来,于是又用断点思路进行排查,把日志打印出来一个个看,发现了一个问题,如果第一个res没有结果,那么在try中你用res2是无效的,是没有办法接收到第二个接口的结果,所以最后我的解决方法是,对他们的接收过程进行一个排序,永远有结果的先接收,然后可能会返回没有结果的排在后面。

用户体验

这个部分主要讲一些用户的体验,插件的本质是抓取每一秒的图片然后返回百度进行识别,也就是每次识别百度都会返回一个结果,在初始的时候插件是显示“未知”,有识别的时候会替换成相关信息,这里就有个问题是,插件如果返回None,要不要保留上一个用户的信息,还是说替换成”未知”,因为插件是每一刻都在运行,相当于每一秒就收到一个结果,思考了一下后,我觉得要一直保留上一次的人脸信息,直到有新的人脸信息,才进行刷新,而不会刷新成”未知”,因为这样会导致没有感知。当然,有一个实体例外,就是人脸识别这个,如果返回None,就会刷新成无,因为这个实体是返回真人名字,所以如果你一直保留直到下一个新名字出现才刷新的话,会有一种违和感,因为陌生人的信息是没有在百度中,所以会返回None,要是一直保留这个人脸信息,当我们需要识别陌生人的时候,而人脸识别还是显示上一个人的信息就很怪异,所以这个实体我是根据每次识别返回该有的信息进行展示。

最后一句结束语,真-智能家居离我们还有多远?