-
项目背景
最近项目中,分配到了对接智能家居设备的任务,即需要通过调用api的方式,从而达到控制设备的目的。
-
需求分析
需要在代码中或者其他地方调用api来控制设备。那这不就是物联网了嘛。找几个对接平台,对比下价格,然后去调用对应平台的API去控制设备,岂不是简简单单?(后面发现是我太天真了) 开冲开冲。
-
技术方案选择
.米家
说起小米,无人不知,无人不晓了吧。米家就是其旗下的智能生活平台,米家里面有个专门的硬件设备对接平台(小米IoT开发者平台),进去一看,
麻瓜了、米家没有api接口对外开放。pass
.涂鸦智能
涂鸦智能Tuya是一个全球化的物联网平台,提供设备连接、云服务、数据分析等全面的解决方案。这是其开发者平台的官网(Tuya Smart Developer Center),里面有个云开发的IoT Core连接服务,可以以api的方式控制设备。刚好符合要求。有一个月的试用期
ps:首次进云开发 需要创建云项目,然后购买资源包
但是,后续的费用有点惊人,考虑到成本问题,暂时搁置该选择。
.Home Assistant
Home Assistant 是一个基于Python 3开发的开源家庭自动化平台。可以跟踪和控制家庭中的所有设备,
并实现自动化控制。重点是:免费、开源、且提供API。完美。
-
部署Home Assistant
部署采用的基于Linux系统的docker 方式,没有安装docker的先自行安装docker。
1.拉取官方稳定版镜像
docker pull ghcr.io/home-assistant/home-assistant:stable
2.在Linux服务器上创建一个文件夹,用来挂载HA的配置文件,否则重启项目后,配置会丢失。
我的文件路径是 /data/home-assistant/config
3.使用docker运行该镜像、这里我是没有指定端口的,默认端口是8123
docker run -d --name=home-assistant --privileged -v /data/home-assistant/config:/config -v /run/dbus:/run/dbus:ro --net=host ghcr.io/home-assistant/home-assistant:stable
指令说明
1.docker run:启动一个新的 Docker 容器
2.-d:以“分离模式”(后台运行)启动容器
3.--name=home-assistant:为容器指定名称为“home-assistant”
4.--privileged:给予容器特权模式,允许访问主机设备(通常用于访问硬件设备)
5.-v /data/home-assistant/config:/config:将主机的 /data/home-assistant/config 目录挂载到容器的 /config 目录,用于存储 Home Assistant 的配置文件
6.-v /run/dbus:/run/dbus:ro:将主机的 D-Bus 系统总线挂载到容器中,以只读模式(ro)访问
7.--net=host:使用主机的网络模式,容器将直接使用主机的网络接口
8.ghcr.io/home-assistant/home-assistant:stable:指定要运行的 Docker 镜像,这里是 Home Assistant 的稳定版
4.在浏览器地址栏输入 ip:8123 即可访问项目、我这个页面是初始化后的。
首次进来后,需要创建账号、密码、以及一些初始化设置,按照步骤进行即可。然后再进行登录。
-
Home Assistant集成米家
由于我现有的设备是小爱同学,所以需要集成米家进来。
.安装米家插件
1.通过HACS(HA的第三方应用商店)安装米家插件。前提是需要你先安装好HACS。
2.直接下载米家的插件(https://github.com/XiaoMi/ha_xiaomi_home/blob/main/doc/README_zh.md),
下载源码的zip包,然后解压,将文件夹中的custom_components文件夹放到挂载目录的 /data/home-assistant/config 下面。然后重启项目。(我采用的是这种方式)
.集成米家并授权
1.设置------>设备与服务
2.添加设备--选择小米
3.授权
这是会出现错误,不用担心,把homeassistant.local换成自己的部署服务器的IP即可。
请注意:这里有个隐藏的坑,就是你授权的小米账号下如果是没有设备的话,是无法继续往下步骤走的。
添加成功后,即可在页面看到小米home
然后点击箭头
就可以在页面看到设备的具体信息以及操作了。
-
以api的方式控制设备
这是HA的官方文档地址(REST API | Home Assistant Developer Docs)
这里面最重要的接口是
domain 是实体
service 是服务
小爱同学的控制面板上有很多操作,比如播放、暂停等。怎么去调用呢?
先进去设备页面。然后有个自动化的选项。然后选择 + 号创建
创建新自动化---->添加动作----->按钮
按钮选中后,在下发的目标中 选择选择--->小爱同学 选择实体---->播放
点击右上角的三个点哪里,有个 运行动作的按钮。可以测试下该步骤是否正常。正常后点击右下角的保存
保存后(不保存也可以,只是为了看yaml),再点击三个点、往下拖到,有个YAML编辑的选择、点击进去
看到action中的 button.press没有?
button 就是domain
press 就是service
entity_id: button.xiaomi_cn_8******1_lx01_play_a_4_2 是接口的json参数。
所以接口的curl就是
curl --location 'http://IP:8123/api/services/button/press' \
--header 'Authorization: Bearer TOKEN' \
--header 'Content-Type: application/json' \
--data '{
"entity_id": "button.xiaomi_cn_8*******_lx01_play_music_a_5_4"
}'
这个API接口就可以调用小爱的播放功能了。如果还需要调用其他功能呢?
按照上面的步骤,选择不同的按钮就可以了。
因为这种方式可以完整得拿到对应的domain以及service,还有实体ID。
ps:去以下截图的地方可以找到所有的实体ID
这时候有细心的同学就发现了。请求头不是还有个token的呢?没错。请求接口的时候。还需要带上token。
有的 兄弟,有的
然后,去postman测试下。
调用成功、至此,收工。过程中有问题、可以交流。