很早以前就有想过整智能家居了。由于我是开源Nerd,所以对米家等闭源方案不感兴趣,之前也一直用的是 Home Assistant。
我的上一版本的电源站(带桌面灯带控制器)使用了HTTP服务器强行接入了 Home Assistant,不是很优雅。当 Matter 协议出来之后,想着要不把灯光控制器用 Matter 协议接入 Home Assistant 吧,这样不用每次都自己写配置文件手动改了。于是乎,我就进入了这个坑爹的大坑里面。
硬件准备工作
开始之前,我们首先需要有一块 ESP32 开发板。我这里用的是 ESP32-C3,对于一个简单的灯光控制器来说够用。然后是按照官方教程准备好ESP-IDF和对应的 Matter SDK。
在当前版本中,Matter SDK只能在Linux环境中使用。我是没想到我能在这一步就翻车的。Matter SDK是真的巨大,我在第一次克隆的时候居然傻傻的没开浅克隆,直接就把我 NAS 上所剩无几的磁盘空间给占满了。就算按照教程里面的开了浅克隆,也建议预留 15G 以上的空间,不然真的没办法编译。
然后可以进入 examples/light
里面,使用 idf.py
编译并烧录固件到开发板上了。
继续跟着教程走,尝试在你的设备上使用 chip-tool
配对设备并操作开关。恭喜你!现在你已经有一个 Matter 设备了。
Home Assistant 大坑
然后,你就需要开始准备你的 Home Assistant 了。让我们来看看官方教程是怎么说的:
1. 在 Home Assistant 中,点击 Add Integration,选择 Matter,添加服务
2. 准备 Matter 桥接服务器
– 如果你正在使用官方的 HAOS,那么服务器已经预先安装好了
– 如果不是,那么提供了 Docker 镜像需要自行安装
很棒!我现在正在使用 Docker,我需要自行安装 matter-server。官方的说明已经给出了 Docker 的命令,那么很明显对应 Docker Compose 格式的配置文件就是这样的:
version: '3'
services:
matter-server:
image: ghcr.io/home-assistant-libs/python-matter-server:stable
restart: unless-stopped
security_opt:
- apparmor:unconfined
volumes:
- ./matter_data:/data
- /run/dbus:/run/dbus:ro
network: host
然后启动这个镜像,就出现问题了。程序提示我:CHIP Error 0x000000C1: Endpoint pool full
。在 Github 上搜了下,发现有对应的 Issue,里面的老哥给出了原因。这个原因是当前系统里面有太多网卡,而这个 Matter 服务器不支持这么多网卡。然后官方不认为这是一个问题,建议我们使用 HAOS,或者在一个独立的服务器上安装。
还好,我的NAS上面跑着一个PVE平台,要开个新的虚拟机还是随随便便的。于是我就下载了HAOS的镜像准备安装。安装过程就不多说了,这里说两个巨坑无比的地方:
1. 你没有办法修改镜像,不能设置代理。在国内这种网络环境下,它能安装完成都是一个奇迹;
2. 你可以将 Docker 版本的 HomeAssistant 备份还原到 HAOS 版本上,但是不能反过来!
问题1的问题很大,不仅是第一次启动 Home Assistant 初始化的时候需要代理,而是因为 Matter 服务器在第一次配对完毕后,会尝试去 Github 上拉证书。如果你不能设置代理,那么你的证书就拉不下来,你的设备就完全没办法连接。
正因为这样,我放弃了 HAOS 的方案,然后准备迁移回去。接着我就遇到了问题2,备份没法还原。所以各位迁移前一定要考虑清楚,不要迁移完了才发现没法还原。
还好,上面的 Issue 的 dasfuu 老哥提供了一个基于macvlan的方法。使用这个方法,可以把matter服务器与其他网卡隔离,这样就不会出现上面的错误了。
费了九牛二虎之力,终于把 matter 服务器给搭起来了,接下来就应该是配对工作了。打开手机APP,点击添加设备,选择 Matter 设备,然后就可以扫描二维码开始配对了。这里我又遇到了两个坑:
1. 只有在谷歌商店上的完整版才有这个配对 Matter 设备的功能。而我用的是在 F-Droid 上下载的应用,它没有这个功能,只会提示你使用手机APP开。
2. 如果你的手机自动弹出了配对框框,那么请将它关掉。只有在 Home Assistant 里面点击配对的过程才能完成配对并添加到 Home Assistant。谷歌自动弹出来的那个只能配对,添加的时候会提示超时。
如果一切顺利,那么你就应该能看到这个 Matter 设备成功地出现在你的设备列表里面了。
如果你的网络没办法正常下载证书,那么你可以使用以下步骤设置代理服务器:
1. 设置环境变量 HTTP_PROXY, HTTPS_PROXY
2. 当然只做这一步是不够的,你需要修改代码让它能使用你的环境变量:
docker-compose exec matter-server bash # 进入容器
cd /usr/local/lib/python3.11/site-packages/matter_server/server/helpers
sed -i "s/raise_for_status=True/raise_for_status=True,trust_env=True/g" paa_certificates.py
exit # 退出容器
docker-compose restart matter-server # 重启服务
自定义设备名称
现在一切都准备就绪了,可以开始开发了。如果我想要自定义设备名称,那么我需要:
1. 在 menuconfig 里面,设置几个信息都是读取通过分区里面的数据得到的
CONFIG_ENABLE_ESP32_FACTORY_DATA_PROVIDER=y
CONFIG_ENABLE_ESP32_DEVICE_INSTANCE_INFO_PROVIDER=y
CONFIG_ENABLE_ESP32_DEVICE_INFO_PROVIDER=y
CONFIG_ESP_MATTER_NVS_USE_COMPACT_ATTR_STORAGE=y
- 使用
mfg_tool
生成分区数据,然后使用esptool.py
把生成的数据写入到nvs分区 - 注意生成使用的证书的PID和VID要和你menuconfig里面配置的一致,不然会无法配对。
2 条评论
LoneStar · 2024 年 8 月 21 日 上午 10:43
对Thread的支持怎么样了?
线框仔 · 2023 年 12 月 14 日 上午 11:52
刚了解MATTER时兴奋激动,然后看着一座又一座大山等着翻越,感觉不可能爬过去。
看来我还是只配搞搞mqtt了。