HomeAssistant-服务调用原理

智能家居是未来的一个朝阳方向,欢迎感兴趣的小伙伴联系我一起燥起来,兵不再多,贵在精。人数够的话想弄一个小工作室。欢迎一些python大牛,懂嵌入式开发或者对对软硬件都非常懂的小伙伴联系我。

从软件到硬件了解一个系统,再从硬件到软件改良一个系统,为了方便了解HomeAssistant是如何添加一个服务模块或者一个实体进入自己的控制系统,我们今天从ESPHome说起。

ESPHome 是一套工具,由 ESPHomelib 和 ESPHomeyaml 组成。前者安装在 ESP8266 或 ESP32 上,后者为其编译固件。ESPHomelib 主要通过MQTT 与 Home Assistant 通讯,可以说专为 Home Assistant 而设计。简单易用且支持硬件多,可以通过简单而强大的配置控制ESP8266/ESP32,还可以通过接入家庭自动化系统实现远程被控。

ESP8266是一个开发版(屏蔽了我们对电路知识的了解)

../_images/nodemcu_esp8266-full.jpg

下面通过一个简单的流程让大家了解一下ESPhome如何搭配mqtt和homeAssistant来使用(不涉及具体实现,具体实现可以从参考的文章里面去看,本文仅做一个介绍)

ESPhome项目页面

img

添加一个模块

img

配置各种模块以及设备接入的针脚

img

根据上面的配置,编译好固件,把生成的bin下载下来

img

用esptool.py或者带gui的工具把下载好的.bin文件烧写到esp8266上

img

把传感器和8266的开发板连接好

img

过一会儿可以看到设备上线

前面的8266里面配置了一个mqtt的服务地址(可以使用docker自己起一个mqtt服务),订阅node2这个设备可以看到网络连接的情况,信号强度,和传感器详细信息。

img

在homeAssistant里面也配置好同一个mqtt服务器,它会自动发现设备,就可以把上面的信息可视化了。

img

通过上面的流程大家肯定发现了,homeAssistant在某些方面和prometheus有点类似,定时收集数据然后用图表的形式展示出来(一段固定时间长度的数据折线图等),并不会去做耦合,自身还是一个集成系统。那么如何接入一些其他的外部服务呢?比如SMTP(Simple Mail Transfer Protocol)

添加SMTP服务,实现homeAssistant可以向目标邮箱发送邮件提醒,只需要在homeAssistant的 configuration.yaml 中添加以下配置即可

具体是利用163邮箱提供的smtp服务作为中转站将邮件转发出去(这个服务需要自己在163邮箱开启,免费),能够直接添加进去的原因是smtp服务的模块已经被添加到homeAssistant的支持服务中了。对于一些还没有被支持,想自己接入的服务是怎么封装给homeAssistant来调用的呢?

这里我们以一个外部模块 和风天气 来举例子,具体操作过程可见 源码

这里我再对源码进行一些分析,方便大家了解整个调用的脉络

如图上面是和风天气插件,接入到homeAssistant中重点只需要manifest.json和sensor.py这两个文件,manifest.json是一个描述文件、一个清单列表,记录了插件的名称、域、文档地址等,sensor.py文件是一个具体的实现,做的事情就是适配homeAssistant的集成系统,把自己收集的数据以homeAssistant的规范传给它。

我们来看一下是如何适配的:

首先从参数开始,和风天气插件(下称插件)扩展了原来的基本参数,扩展的参数是如下几个

可以看到对于options是有限制的,限定在了OPTIONS里面,这个是 和风天气 能够收集到的所有关于天气的参数,OPTIONS里面的内容可以在插件源码里面看到

对应配置里面的如下:

platform这个参数是原来基础参数

然后我们来看重点的一个函数和两个对象,分别是setup_platform,HeWeatherSensor(Entity),WeatherData(object),第一个函数是homeAssistant每当需要获取天气相关展示数据的时候就会调用一次,而setup_platform里面创建了第二个和第三个类的实例,第二个实例继承了homeAssistant的原生Entity这个类,这个是homeassistant中的实体对象,包含了一个实体里面所有的参数,这个类主要是对Entity获取参数的填充(扩展的参数里面的参数无法直接获取,需要通过类似于key,value的形式传过去,使用的字段是_type和_state),最后一个类是插件能够获取到的全量数据的一个实体类,里面包含了一个定时函数,每隔30分钟自动更新全量数据,保证第二个类里面获取到的数据的实时性。

如果我们自己需要把自己的插件接入到homeAssistant,可以按照和风天气这样的方式封装成一个模块接入到homeAssistant。

最后给一个简单插件应用的画面(公司5Gwifi无法接入设备)

参考:

1.https://zhuanlan.zhihu.com/p/122208151

2.https://esphome.io/index.html

3.https://github.com/esphome

和风天气源码:https://github.com/morestart/HeWeather

homeAssistant源码:https://github.com/home-assistant/core

posted @ 2021-10-11 18:49  orangeScc  阅读(2442)  评论(0编辑  收藏  举报