『瀚思彼岸』» 智能家居技术论坛

 找回密码
 立即注册
查看: 847|回复: 0

[基础教程] 智能家居之旅,第三站:Ai-M61/M62 接入HomeAssistant 实现点灯

[复制链接]

11

主题

27

帖子

152

积分

注册会员

Rank: 2

积分
152
金钱
125
HASS币
0
发表于 2024-6-24 17:21:14 | 显示全部楼层 |阅读模式
前言
上一篇我们介绍了MQTT设备如何接入HomeAssistant,这一篇就给大家讲一下Ai-M61/M62 开发板或者模组怎么通过编程来接入HomeAssistant。正式开始之前,我们先要确定拥有以下条件:
  • 有一个Linux 系统,推荐Ubunt20.04,能够使用SSH进行远程访问
  • 已经搭建好的HomeAssistant 并且可以正常访问(局域网或者公网)
  • 有一个MQTT服务器,并且可以连接
  • HomeAssistant 的MQTT集成已经成功连接到MQTT 服务器
  • 重中之重,有一块带有灯的Ai-M61/M62的开发板
确保自己已经拥有以上条件,这次的帖子会从开发环境搭建开始讲,一直到HomeAssistant 控制Ai-M61-Kit 开发板的蓝灯,会有点长,请耐心看完。
一、开发环境搭建
很多同学可能疑惑,之前已经有了开发环境搭建的帖子,为什么还要重新讲?
因为这次的开发环境和之前的开发环境不一样,虽然流程都差不多,但是有很多细节要注意的地方,为了大家都能够跟着这次帖子顺利点灯,还是重新讲一遍比较好。
1.1 安装依赖,(适合没有搭建过小安派开发环境的同学,搭建过的请跳过
  • VScode登录:
使用VScode 打开SSH 远程,如果不知道怎么连接请看:
   2.Windows的PowerShell 的SSH 登录:
在桌面摁住 <shift>键+鼠标右键,选择“在此处打开Powershell窗口”,然后在PowerShell 输入指令:
  • ssh 用户名@IP地址

[color=rgb(68, 68, 68) !important]复制代码

例如:ssh [email protected]
回车输入密码即可登录。
3.依赖安装
登录打开终端之后,手动复制以下指令:
  • sudo apt-get install make gcc vim cmake git ninja-build -y

[color=rgb(68, 68, 68) !important]复制代码

二、SDK克隆
因为本贴主要面向国内的同学,所以git 首选使用gitee。
2.1 克隆SDK
找一个浪漫一点的路径(这个很重要),运行以下指令:

[color=rgb(68, 68, 68) !important]复制代码

成功如下:

                               
登录/注册后可看大图

2.2 拉取子模块
使用指令进入到SDK当中,逐行运行以下指令(一定要全部执行成功):
  • cd AiPi-Open-Kits/

[color=rgb(68, 68, 68) !important]复制代码

注意:git submodule update 就会开始更新仓库的子模块,时间会有点长,只要不报错都是正常的,耐心等待拉取完成:

                               
登录/注册后可看大图

2.3 设置SDK
使用指令把小安派的配置同步到SDK内部,并设置编译工具,逐行运行以下指令(一定要全部执行成功):
  • . update_sdk.sh
  • . export.sh

[color=rgb(68, 68, 68) !important]复制代码

成功如下:

                               
登录/注册后可看大图

2.4 编译例程,验证SDK 是否搭建成功
逐行运行以下指令(一定要全部执行成功):
  • cd examples/blank/
  • make

[color=rgb(68, 68, 68) !important]复制代码

编译成功如下:

                               
登录/注册后可看大图

2.5 命令上烧录测试程序
2.5.1 修改SDK的配置文件,实现先编译再烧录
推荐使用VScode 修改文件,在"AiPi-Open-Kits/bl61x_SDK/os这个路径下找到:project.build
打开project.build 之后,找到 第 55 行,先把 COM5 改成 : "/dev/ttyUSB0"。
  • picocom /dev/ttyUSB0 -b 2000000

[color=rgb(68, 68, 68) !important]复制代码

改成的原因是,当只有一个Ai-M61/M62开发板(或TTL工具)插入到ubuntu 中的时候,驱动中会显示 “/dev/ttyUSB0”,可以使用以下指令查看是否已经插入:
  • ls /dev/ttyUSB*

[color=rgb(68, 68, 68) !important]复制代码

运行结果:

                               
登录/注册后可看大图

最后找到 找到 第 88 行,在"flash:" 后面加入:"build":

                               
登录/注册后可看大图

确保终端已经在examples/blank/目录,使用指令烧录程序:
  • make flash

[color=rgb(68, 68, 68) !important]复制代码

2.5.2 修改报错
这个时候肯定会报错,而且一定是这样的报错内容:
  • Built target combine
  • ./../../bl61x_SDK/os//tools/bflb_tools/bouffalo_flash_cube/BLFlashCommand-ubuntu --interface=uart --baudrate=2000000 --port=/dev/ttyUSB0 --chipname=bl616 --cpu_id= --config=flash_prog_cfg.ini
  • [10:22:46.164] - Serial port is /dev/ttyUSB0
  • [10:22:46.164] - ==================================================
  • [10:22:46.164] - [<font color="#ff0000"><b>Errno 2] No such file or directory: '/home/seahi/GDBS/AiPi-Open-Kits/examples/blank/../../bl61x_SDK/AiPi_bsp/board/bl616dk/config'</b></font>

[color=rgb(68, 68, 68) !important]复制代码

这时候,在blank(AiPi-Open-Kits/examples/blank) 例程的目录下打开 flash_prog_cfg.ini 文件,把 "filedir =./../bl61x_SDK/AiPi_bsp/board/bl616dk/config/Rx_boot2_*.bin"  改成:
  • filedir = ./build/build_out/boot2_*.bin

[color=rgb(68, 68, 68) !important]复制代码

然后把下面的内容注释掉(用# 号注释):
  • [edata]
  • filedir = ../../bl61x_SDK/AiPi_bsp/board/bl616dk/config/edata.bin
  • address = 0x3e0000

[color=rgb(68, 68, 68) !important]复制代码

修改后:

                               
登录/注册后可看大图

2.5.3 再次编译烧录 make flash
就能看到按键提示后,按一下开发板上的复位键就能烧录:

                               
登录/注册后可看大图

2.6 命令行的log 查看
先安装串口监控工具:
  • sudo apt-get install picocom

[color=rgb(68, 68, 68) !important]复制代码

安装成功之后,使用指令:
  • picocom /dev/ttyUSB0 -b 2000000

[color=rgb(68, 68, 68) !important]复制代码

运行成功:

                               
登录/注册后可看大图

再按一次复位键之后,就能看到log了:

                               
登录/注册后可看大图

如果你也输出了log,那恭喜你,现在只搭建好了开发环境,可以正式进入下面的HomeAssistant 连接,❀保持耐心❀。
三、对接HomeAssistant
3.1 克隆对接例程
在终端使用 "cd" 指令进入到 “example”目录:
  • cd example

[color=rgb(68, 68, 68) !important]复制代码

执行克隆指令:

[color=rgb(68, 68, 68) !important]复制代码

成功如下:

                               
登录/注册后可看大图

你以为这样就能直接编译里面的例程了吗?以我的风格,怎么可能会这么简单。其实是这样我在做一个HomeAssistant的连接库,例程会直接使用这个库来连接HomeAssistant,为了确保各个例程使用的库函数保持最新且一致,我不得不把库以子模块的形式存在于例程当中。
所以,在还需要到例程仓库里面拉取子模块,逐行运行以下指令(一定要全部执行成功):
  • cd HomeAssistant_example/
  • git submodule init
  • git submodule update

[color=rgb(68, 68, 68) !important]复制代码

拉取成功:

                               
登录/注册后可看大图

3.2 新建连接程序
说两句闲话,按照流程的话,应该给大家介绍一下 “HomeAssistant-C”这个库的,但是实在不知道从哪讲起,而且讲了之后,大家估计也不懂怎么用。既然这样,还不如直接开始对接,边用边讲。
3.2.1 复制例程并且重命名
新建程序我建议直接复制原有的工程:HomeAssistant_basic,这个例程中有一个开关的实体,适合点灯,但是连接的服务器是安信可的MQTT服务器,只需要做一下简单的修改就可以实现连接了。你可以使用VS code 的复制粘贴功能(因为大家都已经知道了,所以我就不打算再讲),也可以使用命令行 的"cp"指令(为了能够正常运行,建议命名和我的保持一致):
  • cp HomeAssistant_basic/ -r HomeAssistant_switch

[color=rgb(68, 68, 68) !important]复制代码

复制结果如下:

                               
登录/注册后可看大图

3.2.2 修改烧录配置文件
打开 “HomeAssistant_switch下的 “flash_prog_cfg.ini” 文件,把 第 26 行filedir = ./build/build_out/HomeAssistant_basic_$(CHIPNAME)*.bin”改成:
  • filedir = ./build/build_out/HomeAssistant_switch_$(CHIPNAME)*.bin

[color=rgb(68, 68, 68) !important]复制代码

如下:

                               
登录/注册后可看大图

一定要改好,不要再烧录的时候回出错。
3.2.3 修改WiFi 连接
这个例程有一个简单的WiFi 连接,默认连接的WiFi 是:
  • WiFi名称:FAE@Seahi

[color=rgb(68, 68, 68) !important]复制代码

这个是我的路由器名称和密码,如果不修改的话,是不能正常连接网络的。
VScode 找到 “HomeAssistant_example/HomeAssistant_switch/components/wifi”目录下的“wifi_event.c”文件并打开,编辑界面找到 第 62 行 ,把:staWiFiConnect("FAE@Seahi", "fae12345678");里面的参数改成你自己的WiFi名称和密码,切记WiFi名称一定是2.4GHz的:
  • staWiFiConnect(“WiFi名称”, "密码");

[color=rgb(68, 68, 68) !important]复制代码

3.2.4 修改MQTT 配置
在例程当中,MQTT配置使用的是默认的MQTT参数这些默认参数可以在 "Ai-M6x_HomeAssistant-C/HomeAssistant-C/"目录中的 “homeAssistantDevConfig.h”文件中找到:

                               
登录/注册后可看大图

当然,你可以直接修改配置文件里面相关宏定义,也可以在main.c 中修改参数,所以就有两种方法修改MQTT配置参数。
  • 方法一:修改ha_device 结构体参数
在 HomeAssistant_switch/main目录中打开 main.c ,编辑页下拉到第 75 行 ,回车添加以下内容
  • ha_device.mqtt_info.mqtt_clientID="Ai-M6X_Kit_Switch";
  • ha_device.mqtt_info.mqtt_host="你的服务器地址";
  • ha_device.mqtt_info.port=1883;
  • ha_device.mqtt_info.mqtt_username="HomeAssistant_switch";

[color=rgb(68, 68, 68) !important]复制代码

一定要记住,服务器地址要和HomeAssistant 上的MQTT连接的服务器地址保持一致,比如我的HomeAssistant 上MQTT连接的地址:

                               
登录/注册后可看大图

那我的MQTT 配置就是这样:
ha_device.mqtt_info.mqtt_clientID="Ai-M6X_Kit_Switch";
ha_device.mqtt_info.mqtt_host="wx.ai-thinker.com";
ha_device.mqtt_info.port=1883;
ha_device.mqtt_info.mqtt_username="HomeAssistant_switch";


  • 方法二:homeAssistantDevConfig.h 相关宏定义(不推荐)
直接打开Ai-M6x_HomeAssistant-C/HomeAssistant-C/"目录中的 “homeAssistantDevConfig.h”文件,然后修改宏定义后面的内容。
不推荐的原因:homeAssistantDevConfig.h 文件是 HomeAssistant-C库里面的内置文件,一旦更新仓库之后还需要重新配置一遍。你的程序就没办法按照之前的配置连接到正确的MQTT服务器上。
3.2.5 修改实体信息
原工程 HomeAssistant_basic 中的实体有个唯一的信息,它在你的HomeAssistant 中表示这个实体的ID,所以必须要修改,在 HomeAssistant_switch/main的main.c中找到第 38 行 ,把 .unique_id= "switch1"改成:
  • .unique_id = "switch_v1",

[color=rgb(68, 68, 68) !important]复制代码

可以改成其他的数值,只要是确保唯一性就行,推荐使用MAC地址来赋值,像这样:
  •   static ha_sw_entity_t entity_sw1 = {
  •                  .name = "开关1",
  •                  .icon = "mdi:power",
  •             };
  •             entity_sw1.unique_id = pvPortMalloc(16);
  •             uint8_t STA_MAC[6] = { 0 };
  •             aiio_wifi_sta_mac_get(STA_MAC);
  •             sprintf(entity_sw1.unique_id, "sw_%02x%02x", STA_MAC[4], STA_MAC[5]);

[color=rgb(68, 68, 68) !important]复制代码

然后就可以烧录测试,查看连接状况情况了,运行:
  • cd <b style="background-color: rgb(255, 255, 255);">HomeAssistant_switch</b>

[color=rgb(68, 68, 68) !important]复制代码

连接成功的LOG:

                               
登录/注册后可看大图

查看HomeAssistant 中的连接情况:

                               
登录/注册后可看大图

3.2.6 修改设备信息
当然设备信息也是可以改的,只需要在MQTT 配置信息的下面加入以下配置:
  • ha_device.name="我的板子"; //设备名称
  •     ha_device.model="Ai-M61开发板";//模块名称
  •     ha_device.manufacturer="取个名字真难";//产商名称

[color=rgb(68, 68, 68) !important]复制代码

添加之后如下:

                               
登录/注册后可看大图

重新烧录上线之后,HomeAssistant 的设备信息:

                               
登录/注册后可看大图

四、控制一盏LED
4.1 GPIO驱动编写
我现在用的板子是AiPi-Eyes-DU 开发板,就按点亮RGB 的蓝灯为例,RGB的蓝灯接在了GPIO15,跟着泽哥的教程,写一份让GPIO15输出的代码:
  • struct bflb_device_s* gpio;//全局变量
  • gpio = bflb_device_get_by_name("gpio");
  •     bflb_gpio_init(gpio, GPIO_PIN_15, GPIO_OUTPUT | GPIO_PULLUP | GPIO_SMT_EN | GPIO_DRV_0);
  •     bflb_gpio_reset(gpio, GPIO_PIN_15);

[color=rgb(68, 68, 68) !important]复制代码

实际代码如下:

                               
登录/注册后可看大图

4.2 接收HomeAssistant 的控制指令并控制LED灯
在 main.c 中的第 29 行ha_event_cb函数,是库中的HomeAssistant 事件回调函数,当我们在HomeAssistant 下发控制指令,会触发回调。
控制灯的回调事件是:HA_EVENT_MQTT_COMMAND_SWITCH。
我们就在这个事件里,做点灯,在第 58 行 里加入:
  • if (ha_dev->entity_switch->command_switch->switch_state) {
  •                 bflb_gpio_set(gpio, GPIO_PIN_15);
  •             }
  •             else bflb_gpio_reset(gpio, GPIO_PIN_15);

[color=rgb(68, 68, 68) !important]复制代码

结果如下:

                               
登录/注册后可看大图

烧录验证:

                               
登录/注册后可看大图

4.3 在HomeAssistant 中加入开关按钮
在概览页面选择右上角的三个点,然后选择编辑仪表盘:

                               
登录/注册后可看大图

然后在右下脚选择"添加卡片",在弹出里选择"水平堆叠":

                               
登录/注册后可看大图

之后在水平堆叠卡片里选择"实体"卡片:

                               
登录/注册后可看大图

接着在实体卡片里选择"开关实体":

                               
登录/注册后可看大图

然后保存就行,在概览中就多了一个开关,这个就是控制开发板灯的开关。
五、添加更多开关实体
3.2.5 修改实体信息 这个小结可以知道,要添加多个开关实体,就在代码需要定义多个开关,而且开关的unique_id 必须保持唯一。创建完成之后,使用 "homeAssistant_device_add_entity" 函数进行添加。下面就加多两个开关:
  • static ha_sw_entity_t entity_sw1 = {
  •                  .name = "开关1",
  •                  .icon = "mdi:power",
  •                  .unique_id = "sw1",
  •             };
  •             static ha_sw_entity_t entity_sw2 = {
  •                  .name = "开关2",
  •                  .icon = "mdi:power",
  •                  .unique_id = "sw2",
  •             };
  •             static ha_sw_entity_t entity_sw3 = {
  •                  .name = "开关3",
  •                  .icon = "mdi:power",
  •                  .unique_id = "sw3",
  •             };
  •             homeAssistant_device_add_entity(CONFIG_HA_ENTITY_SWITCH, &entity_sw1);
  •             homeAssistant_device_add_entity(CONFIG_HA_ENTITY_SWITCH, &entity_sw2);
  •             homeAssistant_device_add_entity(CONFIG_HA_ENTITY_SWITCH, &entity_sw3);

[color=rgb(68, 68, 68) !important]复制代码

这样烧录运行之后,HomeAssistant 上的开发板这个设备就有三个开关:

                               
登录/注册后可看大图

甩一个问题:三个开关怎么识别只有开关1能控制蓝灯?








评分

参与人数 1金钱 +10 收起 理由
book123 + 10 高手,这是高手!

查看全部评分

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Hassbian

GMT+8, 2024-11-24 17:19 , Processed in 0.071659 second(s), 24 queries .

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表