上一篇我們介紹了MQTT設備如何接入HomeAssistant(打卡智能家居之旅(2):設備接入HomeAssistant的方法),這一篇就給大家講一下Ai-M61/M62 開發(fā)板或者模組怎么通過編程來接入HomeAssistant。正式開始之前,我們先要確定擁有以下條件:
有一個Linux 系統(tǒng),推薦Ubunt20.04,能夠使用SSH進行遠程訪問
已經(jīng)搭建好的HomeAssistant 并且可以正常訪問(局域網(wǎng)或者公網(wǎng))
有一個MQTT服務器,并且可以連接
HomeAssistant 的MQTT集成已經(jīng)成功連接到MQTT 服務器
重中之重,有一塊帶有燈的Ai-M61/M62的開發(fā)板
確保自己已經(jīng)擁有以上條件,這次的帖子會從開發(fā)環(huán)境搭建開始講,一直到HomeAssistant 控制Ai-M61-Kit 開發(fā)板的藍燈,會有點長,請耐心看完。
1、開發(fā)環(huán)境搭建
很多同學可能疑惑,之前已經(jīng)有了開發(fā)環(huán)境搭建的帖子,為什么還要重新講?
因為這次的開發(fā)環(huán)境和之前的開發(fā)環(huán)境不一樣,雖然流程都差不多,但是有很多細節(jié)要注意的地方,為了大家都能夠跟著這次帖子順利點燈,還是重新講一遍比較好。
1.1 安裝依賴(適合沒有搭建過小安派開發(fā)環(huán)境的同學,搭建過的請?zhí)^)
VScode登錄:
使用VScode 打開SSH 遠程,如果不知道怎么連接請看:(四)零基礎開發(fā)小安派-Eyes-S1【入門篇】——Win下SSH連接Linux
1.2 Windows的PowerShell 的SSH 登錄:
在桌面摁住 鍵+鼠標右鍵,選擇“在此處打開Powershell窗口”,然后在PowerShell 輸入指令:
ssh 用戶名@IP地址
例如:ssh seahi@192.168.16.102
回車輸入密碼即可登錄。
1.3 依賴安裝
登錄打開終端之后,手動復制以下指令:
sudo apt-get install make gcc vim cmake git ninja-build -y
2、SDK克隆
因為本貼主要面向國內(nèi)的同學,所以git 首選使用gitee。
2.1 克隆SDK
找一個浪漫一點的路徑(這個很重要),運行以下指令:
git clone https://gitee.com/Ai-Thinker-Open/AiPi-Open-Kits.git
成功如下:
2.2 拉取子模塊
使用指令進入到SDK當中,逐行運行以下指令(一定要全部執(zhí)行成功):
cd AiPi-Open-Kits/
注意:git submodule update 就會開始更新倉庫的子模塊,時間會有點長,只要不報錯都是正常的,耐心等待拉取完成:
2.3 設置SDK
使用指令把小安派的配置同步到SDK內(nèi)部,并設置編譯工具,逐行運行以下指令(一定要全部執(zhí)行成功):
. update_sdk.sh . export.sh
成功如下:
2.4 編譯例程,驗證SDK 是否搭建成功
逐行運行以下指令(一定要全部執(zhí)行成功):
cd examples/blank/ make
編譯成功如下:
2.5 命令上燒錄測試程序
2.5.1 修改SDK的配置文件,實現(xiàn)先編譯再燒錄
推薦使用VScode 修改文件,在"AiPi-Open-Kits/bl61x_SDK/os這個路徑下找到:project.build打開project.build 之后,找到 第 55 行,先把 COM5 改成 : "/dev/ttyUSB0"。
picocom /dev/ttyUSB0 -b 2000000
改成的原因是,當只有一個Ai-M61/M62開發(fā)板(或TTL工具)插入到ubuntu 中的時候,驅(qū)動中會顯示 “/dev/ttyUSB0”,可以使用以下指令查看是否已經(jīng)插入:
ls /dev/ttyUSB*
運行結(jié)果:
最后找到 找到 第 88 行,在"flash:" 后面加入:"build":
確保終端已經(jīng)在examples/blank/目錄,使用指令燒錄程序:
make flash
2.5.2 修改報錯
這個時候肯定會報錯,而且一定是這樣的報錯內(nèi)容:
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] - [Errno 2] No such file or directory: '/home/seahi/GDBS/AiPi-Open-Kits/examples/blank/../../bl61x_SDK/AiPi_bsp/board/bl616dk/config'/font?>
這時候,在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
然后把下面的內(nèi)容注釋掉(用# 號注釋):
[edata] filedir = ../../bl61x_SDK/AiPi_bsp/board/bl616dk/config/edata.bin address = 0x3e0000
修改后:
2.5.3 再次編譯燒錄 make flash
就能看到按鍵提示后,按一下開發(fā)板上的復位鍵就能燒錄:
2.6 命令行的log 查看
先安裝串口監(jiān)控工具:
sudo apt-get install picocom
安裝成功之后,使用指令:
picocom /dev/ttyUSB0 -b 2000000
運行成功:
再按一次復位鍵之后,就能看到log了:
如果你也輸出了log,那恭喜你,現(xiàn)在只搭建好了開發(fā)環(huán)境,可以正式進入下面的HomeAssistant 連接,?保持耐心?。
3、對接HomeAssistant
3.1 克隆對接例程
在終端使用 "cd" 指令進入到 “example”目錄:
cd example
執(zhí)行克隆指令:
git clone https://gitee.com/Ai-Thinker-Open/HomeAssistant_example.git
成功如下:
你以為這樣就能直接編譯里面的例程了嗎?以我的風格,怎么可能會這么簡單。其實是這樣,我在做一個HomeAssistant的連接庫,例程會直接使用這個庫來連接HomeAssistant,為了確保各個例程使用的庫函數(shù)保持最新且一致,我不得不把庫以子模塊的形式存在于例程當中。
所以,在還需要到例程倉庫里面拉取子模塊,逐行運行以下指令(一定要全部執(zhí)行成功):
cd HomeAssistant_example/ git submodule init git submodule update
拉取成功:
3.2 新建連接程序
3.2.1 復制例程并且重命名
新建程序我建議直接復制原有的工程:HomeAssistant_basic,這個例程中有一個開關的實體,適合點燈,但是連接的服務器是安信可的MQTT服務器,只需要做一下簡單的修改就可以實現(xiàn)連接了。你可以使用VS code 的復制粘貼功能(因為大家都已經(jīng)知道了,所以我就不打算再講),也可以使用命令行 的"cp"指令(為了能夠正常運行,建議命名和我的保持一致):
cp HomeAssistant_basic/ -r HomeAssistant_switch
復制結(jié)果如下:
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
如下:
一定要改好,不要再燒錄的時候回出錯。
3.2.3 修改WiFi 連接
這個例程有一個簡單的WiFi 連接,默認連接的WiFi 是:
WiFi名稱:FAE@Seahi
備注:這個是筆者的路由器名稱和密碼,如果不修改的話,是不能正常連接網(wǎng)絡的。
VScode 找到 “HomeAssistant_example/HomeAssistant_switch/components/wifi”目錄下的“wifi_event.c”文件并打開,編輯界面找到 第 62 行 ,把:staWiFiConnect("FAE@Seahi", "fae12345678");里面的參數(shù)改成你自己的WiFi名稱和密碼,切記WiFi名稱一定是2.4GHz的:
staWiFiConnect(“WiFi名稱”, "密碼");
3.2.4 修改MQTT 配置
在例程當中,MQTT配置使用的是默認的MQTT參數(shù),這些默認參數(shù)可以在 "Ai-M6x_HomeAssistant-C/HomeAssistant-C/"目錄中的 “homeAssistantDevConfig.h”文件中找到:
當然,你可以直接修改配置文件里面相關宏定義,也可以在main.c 中修改參數(shù),所以就有兩種方法修改MQTT配置參數(shù)。
方法一:修改ha_device 結(jié)構(gòu)體參數(shù)
在 HomeAssistant_switch/main目錄中打開 main.c ,編輯頁下拉到第 75 行 ,回車添加以下內(nèi)容:
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";
一定要記住,服務器地址要和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”文件,然后修改宏定義后面的內(nèi)容。
不推薦的原因:homeAssistantDevConfig.h 文件是 HomeAssistant-C庫里面的內(nèi)置文件,一旦更新倉庫之后還需要重新配置一遍。你的程序就沒辦法按照之前的配置連接到正確的MQTT服務器上。
3.2.5 修改實體信息
原工程 HomeAssistant_basic 中的實體有個唯一的信息,它在你的HomeAssistant 中表示這個實體的ID,所以必須要修改,在 HomeAssistant_switch/main的main.c中找到第 38 行 ,把 .unique_id= "switch1"改成:
.unique_id = "switch_v1",
可以改成其他的數(shù)值,只要是確保唯一性就行,推薦使用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]);
然后就可以燒錄測試,查看連接狀況情況了,運行:
cd HomeAssistant_switch
連接成功的LOG:
查看HomeAssistant 中的連接情況:
3.2.6 修改設備信息
當然設備信息也是可以改的,只需要在MQTT 配置信息的下面加入以下配置:
ha_device.name="我的板子"; //設備名稱 ha_device.model="Ai-M61開發(fā)板";//模塊名稱 ha_device.manufacturer="取個名字真難";//產(chǎn)商名稱
添加之后如下:
重新燒錄上線之后,HomeAssistant 的設備信息:
4、控制一盞LED
4.1 GPIO驅(qū)動編寫
我現(xiàn)在用的板子是AiPi-Eyes-DU 開發(fā)板,就按點亮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);
實際代碼如下:
4.2 接收HomeAssistant 的控制指令并控制LED燈
在 main.c 中的第 29 行 ,ha_event_cb函數(shù),是庫中的HomeAssistant 事件回調(diào)函數(shù),當我們在HomeAssistant 下發(fā)控制指令,會觸發(fā)回調(diào)。
控制燈的回調(diào)事件是: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);
結(jié)果如下:
燒錄驗證:
4.3 在HomeAssistant 中加入開關按鈕
在概覽頁面選擇右上角的三個點,然后選擇編輯儀表盤:
然后在右下腳選擇"添加卡片",在彈出里選擇"水平堆疊":
之后在水平堆疊卡片里選擇"實體"卡片:
接著在實體卡片里選擇"開關實體":
然后保存就行,在概覽中就多了一個開關,這個就是控制開發(fā)板燈的開關。
5、添加更多開關實體
從 3.2.5 修改實體信息 這個小結(jié)可以知道,要添加多個開關實體,就在代碼需要定義多個開關,而且開關的unique_id 必須保持唯一。創(chuàng)建完成之后,使用 "homeAssistant_device_add_entity" 函數(shù)進行添加。下面就加多兩個開關:
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);
這樣燒錄運行之后,HomeAssistant 上的開發(fā)板這個設備就有三個開關:
甩一個問題:
三個開關怎么識別只有開關1能控制藍燈?
審核編輯 黃宇
-
智能家居
+關注
關注
1928文章
9562瀏覽量
185118 -
SDK
+關注
關注
3文章
1036瀏覽量
45941 -
燒錄
+關注
關注
8文章
259瀏覽量
35581 -
MQTT
+關注
關注
5文章
651瀏覽量
22505
發(fā)布評論請先 登錄
相關推薦
評論