shawshuai
shawshuai
发布于 2024-10-07 / 106 阅读
0
0

On/Off Light

Matter定义了“照明Lighting”大类别用于照明相关设备,其中包含四个具体的设备类型。本文以“开关灯On/Off Light”为例,开发一个此类别的设备。

目标

本项目的目标如下:

  • 完成“开关灯On/Off Light”的开发,可以添加到Matter生态中并完成相关功能的测试

开发

本文选择直接使用开发板上的IO口驱动低压灯带,不使用继电器。

编写控制代码

先打开项目中的模板抄一抄。 定义用于保存ID的变量。

uint16_t onoff_light_endpoint_id = 0;

创建一个Matter的on/off灯配置,并使用get_id()方法将获取到的id赋值给上一步定义的变量。

on_off_light::config_t tangoo_light_config;
tangoo_light_config.on_off.on_off = DEFAULT_POWER;
tangoo_light_config.on_off.lighting.start_up_on_off = nullptr;
endpoint_t *endpoint_tangoo = on_off_light::create(node, &tangoo_light_config, ENDPOINT_FLAG_NONE, 0);
tangoo_light_endpoint_id = endpoint::get_id(endpoint_tangoo);
gpio_reset_pin(TANGOO_LIGHT_GPIO); //重置IO口
gpio_set_direction(TANGOO_LIGHT_GPIO, GPIO_MODE_OUTPUT); //设置IO口为输出模式
gpio_set_level(TANGOO_LIGHT_GPIO, DEFAULT_POWER);//设置输出与默认电源相等

选择一个 IO 口作为输出口,这里选择 IO10 。

#define TANGOO_LIGHT_GPIO GPIO_NUM_10

在以下方法中获取控制指令更新状态。

// This callback is called for every attribute update. The callback implementation shall
// handle the desired attributes and return an appropriate error code. If the attribute
// is not of your interest, please do not return an error code and strictly return ESP_OK.
static esp_err_t app_attribute_update_cb(attribute::callback_type_t type, uint16_t endpoint_id, uint32_t cluster_id,
                                         uint32_t attribute_id, esp_matter_attr_val_t *val, void *priv_data)
{
    esp_err_t err = ESP_OK;

    // 添加到这里……

    return err;
}

配置如下:

  if (type == PRE_UPDATE) { // 如果类型是Matter的PRE_UPDATE
        // Tangoo
        if (endpoint_id == tangoo_light_endpoint_id) // 如果endpoint的id与定义、获取并更新后的灯具ID相等
        {
            if (cluster_id == OnOff::Id)
            {
                gpio_set_level(TANGOO_LIGHT_GPIO, val->val.b); // 更新IO10口的状态
                return err;
            }
            
        }
    }

以上用到了芯片的IO相关内容,所以导入一下头文件:

#include "driver/gpio.h"

这样,一个Matter的灯具就定义完成了!可以将程序编译和烧写到开发板上。将开发板连接到电脑上之前,首先安装串口的驱动程序。把灯带拆下来,负极接在开发板的GND引脚上,正极接在IO10口上(前面已经提及过)。

烧写程序和配置

使用上方的命令烧写程序之后,终端中将启用监控打印配件的日志。可以使用chiptool工具在命令行中为开发板指定要链接的Wi-Fi,但这种方式控制对应的灯具也需要使用命令方式发送。我自己平时使用的智能家居大多是在Apple家庭中进行控制的,而家庭刚好就支持Matter配件。所以本文以Apple家庭为例添加和管理完成改造的灯。

将开发板连接到电脑上。在之上的目录中执行以下命令:

因为我们的开发板是ESP32C3,所以我们指定target为esp32c3:

idf.py set-target esp32c3

文档也建议:第一次烧写SDK内容时建议使用如下命令清除整个闪存:

idf.py erase_flash

然后执行如下命令就可以将程序烧写到开发板,并开启一个日志窗口查看开发板的串口日志。

idf.py flash monitor

烧写程序后稍微等待,待终端显示出绿色的文字后基本表明已经完成了启动。

可以看到系统的提示:还没有连接到适合的热点。现在可以使用对应的平台进行测试啦!可以使用命令行的CHIPTOOL,乐鑫也有Espressif App可以调试。调试前不知道家庭App这种是否能直接添加进平台,不过测试之后是可以的。

于是使用了家庭App添加设备尝试。右上角“+”->"添加或扫描配件"然后扫描开发者网站给出的二维码。点击”添加“按钮,确认未经认证的提示,依旧添加。然后就可以使用家庭App控制对应的设备了。使用Siri测试了结果之后可行后,就可以焊接设备啦。焊接的流程就省略啦!

使用Apple设备相机、家庭App、Google Home App、三星SamrtThings等支持Matter的应用都可以扫描这个二维码添加Matter设备。每一家都需要自己的中枢设备才能添加到平台,但是添加的过程中发现虽然我没有咕咕噜的音响,但是也莫名其妙显示添加到了Google服务;但是在Google Home中又看不到对应的设备……看起来应该是个bug?


评论