十年匠心定制 · 商业建站与技术教学双线并行 咨询热线:400-886-1026 service@lmnt.cn
ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

ESP Weaver 智能家居本地控制 SDK:基于 esp_local_ctrl 与 mDNS 的 Home Assistant 局域网设备接入指南

ESP Weaver 智能家居本地控制 SDK:基于 esp_local_ctrl 与 mDNS 的 Home Assistant 局域网设备接入指南 物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载导读本文以 ESP-IoT-Solution 中的 ESP Weaver 设备端 SDK 为核心系统讲解如何基于 esp_local_ctrl 协议与 mDNS 服务发现在 ESP32 系列芯片上构建可被 Home Assistant 本地发现与控制的智能家居设备。读完本文你将掌握 Weaver 的设备/参数模型、SEC1 安全通信与 PoP 配对机制、Kconfig 配置要点以及如何通过 LED 灯与 IMU 手势两个真实示例快速落地自己的产品。一、ESP Weaver 是什么ESP Weaver 是 ESP-IoT-Solution 仓库中提供的一个设备端智能家居 SDK位于 components/esp_weaver用于构建支持 Home Assistant 本地发现和控制的智能设备。它基于 ESP-IDF 的esp_local_ctrl组件和 mDNS 服务发现实现具备以下核心特征低延迟本地控制基于 mDNS 服务发现与 esp_local_ctrl 协议实现局域网内毫秒级响应离线可用设备与 Home Assistant 在局域网内直接通信无需互联网连接即可正常控制端到端加密采用 Proof of PossessionPoP拥有证明进行设备认证Security1 协议基于 Curve25519 密钥交换与 AES-CTR 加密零配置发现设备联网后通过 mDNS 自动广播服务无需手动配置即可被 Home Assistant 发现简洁设备模型直观的设备/参数模型用于智能家居集成支持参数实时更新。支持的芯片支持的芯片ESP32ESP32-C2ESP32-C3ESP32-C5ESP32-C6ESP32-C61ESP32-S3支持状态✅✅✅✅✅✅✅与 ESP RainMaker 的关系重要边界ESP Weaver不是ESP RainMaker 的直接替换品。虽然它使用兼容的本地控制协议和类似的设备/参数模型但 API 命名空间esp_weaver_*、类型和功能集均有所不同。云端功能MQTT、OTA、定时任务、场景等被有意排除同时每个进程仅支持一个 weaver 节点单例模式。这一点在 components/esp_weaver/README_CN.md 中有明确说明设计 Weaver 应用时需注意这些边界。二、系统架构与工作原理ESP Weaver 的整体架构遵循「设备广播 集成发现 本地控制」的经典局域网智能家居模型------------------- mDNS Discovery ------------------- | | ------------------- | | | Home Assistant | | ESP Device | | (ESP-Weaver) | ------------------- | (ESP Weaver) | | | Local Control | | ------------------- ------------------- | | | Local Network | ------------------------------------------工作流程分为四个步骤广播ESP 设备启动后连接 WiFi并通过 mDNS 广播服务发现Home Assistant 中的 ESP-Weaver 集成自动发现局域网内的设备配对用户输入设备的 PoP 码完成配对认证通信通过 Local Control 协议进行双向通信。从源码结构看该架构被拆分为两个核心模块esp_weaver.c负责设备/参数模型的管理节点、设备、参数的创建与生命周期esp_weaver_local_ctrl.c负责将模型桥接到 esp_local_ctrl 传输层包括 HTTP 服务、mDNS 广播、PoP 安全握手以及参数推送。这种分层使业务开发者只需关注「定义设备与参数」而将协议细节、安全握手与发现机制全部交给 SDK。三、快速开始五分钟构建一个智能灯安装组件推荐通过 ESP Component Registry 添加依赖idf.py add-dependency espressif/esp_weaver*也可以手动安装克隆仓库后将 components/esp_weaver 整个目录复制到项目components/下。组件使用project_include.cmake与patches/idf/idf.patch通过 tools/apply_patches.py 应用确保其能正确集成到 ESP-IDF 构建系统。最小可运行代码下面这段代码来自 components/esp_weaver/README_CN.md展示了创建一个可控智能灯的最小流程#include esp_weaver.h #include esp_weaver_standard_types.h #include esp_weaver_standard_params.h void app_main(void) { // 初始化 weaver 节点单例 esp_weaver_config_t config ESP_WEAVER_CONFIG_DEFAULT(); esp_weaver_node_t *node esp_weaver_node_init(config, 我的设备, Lightbulb); // 创建灯泡设备 esp_weaver_device_t *dev esp_weaver_device_create(Light, ESP_WEAVER_DEVICE_LIGHTBULB, NULL); esp_weaver_device_add_bulk_cb(dev, my_write_cb); // 添加参数 esp_weaver_param_t *power esp_weaver_param_create(ESP_WEAVER_DEF_POWER_NAME, ESP_WEAVER_PARAM_POWER, esp_weaver_bool(true), PROP_FLAG_READ | PROP_FLAG_WRITE | PROP_FLAG_PERSIST); esp_weaver_device_add_param(dev, power); esp_weaver_device_assign_primary_param(dev, power); esp_weaver_param_t *brightness esp_weaver_param_create(ESP_WEAVER_DEF_BRIGHTNESS_NAME, ESP_WEAVER_PARAM_BRIGHTNESS, esp_weaver_int(50), PROP_FLAG_READ | PROP_FLAG_WRITE | PROP_FLAG_PERSIST); esp_weaver_param_add_bounds(brightness, esp_weaver_int(0), esp_weaver_int(100), esp_weaver_int(1)); esp_weaver_device_add_param(dev, brightness); esp_weaver_node_add_device(node, dev); // 启动本地控制所有设置来自 Kconfig esp_weaver_local_ctrl_start(); }代码中的my_write_cb即为批量写入回调当 Home Assistant 下发控制指令时被 SDK 调用业务逻辑在其中完成对真实硬件的操作详见下文「写入回调」。四、核心 API 详解API 完整定义见 components/esp_weaver/include/esp_weaver.h标准类型与标准参数见 esp_weaver_standard_types.h 与 esp_weaver_standard_params.h。1. 节点管理Node节点是设备模型的顶层容器采用单例模式——同一进程内同时只能存在一个节点。// 初始化 weaver 节点返回节点句柄失败返回 NULL esp_weaver_node_t *esp_weaver_node_init(const esp_weaver_config_t *config, const char *name, const char *type); // 反初始化并释放所有资源设备、参数一并释放 esp_err_t esp_weaver_node_deinit(const esp_weaver_node_t *node); // 获取节点 ID const char *esp_weaver_get_node_id(void);配置结构体esp_weaver_config_t目前仅有一个字段node_id自定义节点 ID最长 32 字符传NULL时 SDK 会根据 MAC 地址自动生成节点 ID。默认配置可直接使用宏ESP_WEAVER_CONFIG_DEFAULT()。在示例日志中可以看到自动生成的节点 ID例如6055F9F919EC。2. 设备管理Device// 创建新设备dev_name 需唯一type 如 esp.device.lightbulb esp_weaver_device_t *esp_weaver_device_create(const char *dev_name, const char *type, void *priv_data); // 删除设备需先从节点移除参数会一并释放 esp_err_t esp_weaver_device_delete(esp_weaver_device_t *device); // 向设备添加参数一个设备最多支持 255 个参数 esp_err_t esp_weaver_device_add_param(esp_weaver_device_t *device, esp_weaver_param_t *param); // 添加批量写入回调一次处理多个参数 esp_err_t esp_weaver_device_add_bulk_cb(esp_weaver_device_t *device, esp_weaver_device_bulk_write_cb_t write_cb); // 指定设备的主参数供客户端优先展示 esp_err_t esp_weaver_device_assign_primary_param(esp_weaver_device_t *device, esp_weaver_param_t *param); // 将设备添加到节点 / 从节点移除设备 esp_err_t esp_weaver_node_add_device(const esp_weaver_node_t *node, esp_weaver_device_t *device); esp_err_t esp_weaver_node_remove_device(const esp_weaver_node_t *node, esp_weaver_device_t *device); // 获取设备名称 / 私有数据 const char *esp_weaver_device_get_name(const esp_weaver_device_t *device); void *esp_weaver_device_get_priv_data(const esp_weaver_device_t *device); // 按名称或类型获取参数 esp_weaver_param_t *esp_weaver_device_get_param_by_name(const esp_weaver_device_t *device, const char *param_name); esp_weaver_param_t *esp_weaver_device_get_param_by_type(const esp_weaver_device_t *device, const char *param_type);priv_data参数允许携带任意业务上下文会在回调中被原样传回便于将参数与硬件驱动状态关联。3. 参数管理Param参数是 Weaver 模型的最小单元每个参数由「名称 类型 值 属性标志」组成。// 创建参数val 同时决定了参数的数据类型 esp_weaver_param_t *esp_weaver_param_create(const char *param_name, const char *type, esp_weaver_param_val_t val, uint8_t properties); // 删除未加入设备的参数 esp_err_t esp_weaver_param_delete(esp_weaver_param_t *param); // 添加 UI 类型供客户端渲染控件 esp_err_t esp_weaver_param_add_ui_type(esp_weaver_param_t *param, const char *ui_type); // 添加值边界min/max/stepstep 传 0 表示不限定步进 esp_err_t esp_weaver_param_add_bounds(esp_weaver_param_t *param, esp_weaver_param_val_t min, esp_weaver_param_val_t max, esp_weaver_param_val_t step); const char *esp_weaver_param_get_name(const esp_weaver_param_t *param); const esp_weaver_param_val_t *esp_weaver_param_get_val(const esp_weaver_param_t *param); // 仅更新参数值标记待上报供多参数批量上报场景使用 esp_err_t esp_weaver_param_update(esp_weaver_param_t *param, esp_weaver_param_val_t val); // 更新并立即推送给已连接的客户端本地状态变化时应使用本接口 esp_err_t esp_weaver_param_update_and_report(esp_weaver_param_t *param, esp_weaver_param_val_t val);属性标志esp_weaver_param_property_flags_t位于 esp_weaver.h支持位或组合标志值含义PROP_FLAG_WRITE1 0参数可写可被客户端下发PROP_FLAG_READ1 1参数可读可被客户端查询PROP_FLAG_PERSIST1 3参数值持久化到 NVS重启后恢复多参数批量上报技巧esp_weaver_param_update()只更新本地值而不上报因此当多个参数需要一起推送时可以对前 x-1 个参数调用esp_weaver_param_update()对最后一个参数调用esp_weaver_param_update_and_report()SDK 会把此前累积的所有变更一并推送给客户端。头文件注释中给出了示例update(param1) → update(param2) → update_and_report(param3)会把三个参数的变化一次上报。4. 写入回调Bulk Write Callback设备通过批量回调统一处理来自客户端的写请求原型定义在 esp_weaver.htypedef esp_err_t (*esp_weaver_device_bulk_write_cb_t)(const esp_weaver_device_t *device, const esp_weaver_param_write_req_t write_req[], uint8_t count, void *priv_data, esp_weaver_write_ctx_t *ctx);其中esp_weaver_param_write_req_t包含param参数句柄与val待写入的值两个字段esp_weaver_write_ctx_t携带请求来源srcESP_WEAVER_REQ_SRC_INIT表示初始化阶段从 NVS 恢复持久化值ESP_WEAVER_REQ_SRC_LOCAL表示来自本地控制 HTTP 请求。注意该回调可能在传输层专属任务上下文如 HTTPD 任务中执行而非主任务。官方头文件注释明确要求回调内避免阻塞操作访问共享状态时需做好同步。led_light 示例 中的bulk_write_cb是标准写法遍历write_req数组通过esp_weaver_param_get_name()识别参数名将值写入硬件驱动最后调用esp_weaver_param_update(param, val)回写 SDK 缓存static esp_err_t bulk_write_cb(const esp_weaver_device_t *device, const esp_weaver_param_write_req_t write_req[], uint8_t count, void *priv_data, esp_weaver_write_ctx_t *ctx) { for (int i 0; i count; i) { esp_weaver_param_t *param write_req[i].param; esp_weaver_param_val_t val write_req[i].val; const char *param_name esp_weaver_param_get_name(param); if (strcmp(param_name, ESP_WEAVER_DEF_POWER_NAME) 0) { app_light_set_power(val.val.b); } else if (strcmp(param_name, ESP_WEAVER_DEF_BRIGHTNESS_NAME) 0) { app_light_set_brightness(val.val.i); } // ... 其余参数同理 esp_weaver_param_update(param, val); } return ESP_OK; }5. 本地控制服务// 启动本地控制HTTP mDNS所有设置来自 Kconfig esp_err_t esp_weaver_local_ctrl_start(void); // 停止本地控制服务 esp_err_t esp_weaver_local_ctrl_stop(void); // 设置自定义 PoP必须在启动前调用 esp_err_t esp_weaver_local_ctrl_set_pop(const char *pop); // 获取当前 PoP const char *esp_weaver_local_ctrl_get_pop(void); // 设置自定义 mDNS TXT 记录需在启动后调用 esp_err_t esp_weaver_local_ctrl_set_txt(const char *key, const char *value); // 将参数变化推送给已连接客户端 esp_err_t esp_weaver_local_ctrl_send_params(void);其中esp_weaver_local_ctrl_send_params()用于配合esp_weaver_param_update()使用先批量update再统一调用send_params()推送。五、标准类型与值辅助宏设备类型宏值用途ESP_WEAVER_DEVICE_LIGHTBULBesp.device.lightbulb智能灯泡ESP_WEAVER_DEVICE_IMU_GESTUREesp.device.imu-gestureIMU 手势设备参数类型宏值含义ESP_WEAVER_PARAM_NAMEesp.param.name设备名称ESP_WEAVER_PARAM_POWEResp.param.power电源开关ESP_WEAVER_PARAM_BRIGHTNESSesp.param.brightness亮度等级ESP_WEAVER_PARAM_HUEesp.param.hue色相ESP_WEAVER_PARAM_SATURATIONesp.param.saturation饱和度ESP_WEAVER_PARAM_CCTesp.param.cct相关色温ESP_WEAVER_PARAM_GESTURE_TYPEesp.param.gesture-type手势类型ESP_WEAVER_PARAM_GESTURE_CONFIDENCEesp.param.gesture-confidence手势置信度ESP_WEAVER_PARAM_SENSITIVITYesp.param.sensitivity灵敏度完整列表见 esp_weaver_standard_types.h含 toss/flip/shake/rotation/push/circle/clap 等全套手势事件类型与三轴方向参数。对应地esp_weaver_standard_params.h 提供了建议的默认参数名称如Power、Brightness、Hue。这些名称并非强制——开发者完全可以使用 Core API 自定义参数名。UI 类型宏值含义ESP_WEAVER_UI_TEXTesp.ui.text文本显示ESP_WEAVER_UI_TOGGLEesp.ui.toggle开关切换ESP_WEAVER_UI_SLIDEResp.ui.slider滑块控制ESP_WEAVER_UI_HUE_SLIDEResp.ui.hue-slider色相滑块值类型与辅助宏esp_weaver_param_val_t是一个「类型 联合体」结构见 esp_weaver.htype字段决定val联合体中哪个成员有效。支持六种值类型布尔、整数32 位有符号、浮点、字符串、JSON 对象字符串、JSON 数组字符串。使用辅助宏可以快速构造esp_weaver_bool(x) // 创建布尔值 esp_weaver_int(x) // 创建整数值 esp_weaver_float(x) // 创建浮点值 esp_weaver_str(x) // 创建字符串值 esp_weaver_obj(x) // 创建 JSON 对象值如 {name:value} esp_weaver_array(x) // 创建 JSON 数组值如 [1,2,3]注意STRING 类型的val.s指向动态分配的内存SDK 会在参数/设备销毁时自动释放。六、安全机制PoP 与 SEC0/SEC1ESP Weaver 支持两种安全模式可通过idf.py menuconfig → ESP Weaver配置SEC0无安全性通信明文传输可被网络中的攻击者窃听或篡改。仅用于开发调试严禁在生产环境使用SEC1默认推荐基于 Curve25519 密钥交换 AES-CTR 加密并配合拥有证明PoP完成设备认证所有生产部署都应使用此模式。设备首次启动时SDK 会自动随机生成 PoP 码并持久化到 NVS串口日志会打印I (10592) esp_weaver_local_ctrl: No PoP in NVS. Generating a new one. I (10592) esp_weaver_local_ctrl: PoP for local control: 8f820513后续重启会从 NVS 读取并复用同一 PoP日志显示PoP read from NVS保证设备身份稳定。也可以在启动本地控制前调用esp_weaver_local_ctrl_set_pop()编程设置自定义 PoP。PoP 的解析优先级为用户自定义 PoP NVS 中存储的 PoP 自动生成的新 PoP见 esp_weaver.h 的文档说明。在 Home Assistant 的 ESP-Weaver 集成中添加设备时需要输入串口日志中显示的 PoP 码完成配对。七、Kconfig 配置项全解所有本地控制相关配置均通过idf.py menuconfig的ESP Weaver菜单配置定义见 components/esp_weaver/Kconfig配置项默认值范围说明ESP_WEAVER_LOCAL_CTRL_HTTP_PORT80801-65535本地控制 HTTP 服务端口ESP_WEAVER_LOCAL_CTRL_HTTP_CTRL_PORT123121-65535esp_local_ctrl 内部控制端口必须与 HTTP 端口不同冲突时可修改ESP_WEAVER_LOCAL_CTRL_STACK_SIZE6144—HTTP 服务器任务栈大小遇栈溢出时增大省内存时减小ESP_WEAVER_LOCAL_CTRL_SECURITY_VERSION10-10 SEC0无安全1 SEC1带 PoP安全默认值ESP_WEAVER_NVS_PARTITION_NAMEnvs—存储 PoP 的 NVS 分区名应用使用自定义分区如fctry时需修改ESP_WEAVER_LOCAL_CTRL_MAX_PROPERTIES42-32注册到 esp_local_ctrl 的最大属性数默认 4config params 2 预留Kconfig 帮助文本明确建议SEC1 是安全默认值SEC0 仅限隔离开发环境中调试使用。八、实战示例一LED 智能灯led_lightexamples/weaver/led_light 是最完整的入门示例演示如何用 ESP Weaver 构建可控 RGB 智能灯。详见其 README_CN.md。功能电源开/关控制、亮度调节0-100%、HSV 颜色控制色相 0-360°饱和度 0-100%。硬件要求支持芯片的开发板 RGB LEDWS2812 或 3 引脚 RGB 模块 WiFi 路由器LED 类型与 GPIO 可通过idf.py menuconfig → Example Configuration修改示例使用开发板 BOOT 按钮。编译与运行idf.py set-target chip_name # 例如 esp32c6 idf.py menuconfig # 配置 WiFi SSID/密码可选配置安全版本 idf.py -p PORT flash monitor # 编译烧录并查看串口输出Ctrl-] 退出监视器设备模型该示例在 app_light.c 中创建了名为Light的灯泡设备注册了五个参数参数名类型UI 类型边界属性Nameesp.param.nameesp.ui.text—READPoweresp.param.poweresp.ui.toggle—READ | WRITE | PERSIST主参数Brightnessesp.param.brightnessesp.ui.slider0-100step 1READ | WRITE | PERSISTHueesp.param.hueesp.ui.hue-slider0-360step 1READ | WRITE | PERSISTSaturationesp.param.saturationesp.ui.slider0-100step 1READ | WRITE | PERSIST启动流程app_main.c初始化 NVS → 初始化硬件驱动 → 初始化 Weaver 节点节点名/类型来自CONFIG_EXAMPLE_NODE_NAME/CONFIG_EXAMPLE_NODE_TYPE→ 创建并挂载灯设备 → 初始化网络并连接 WiFi → 启动本地控制 → 设置自定义 mDNS TXT 记录。启动成功后的串口日志形如I (10552) esp_weaver: Weaver initialized: ESP Weaver Device (Lightbulb), node_id: 6055F9F919EC I (10562) app_main: Node ID: 6055F9F919EC I (10572) esp_weaver_local_ctrl: Starting local control with HTTP transport and security version: 1 I (10592) esp_weaver_local_ctrl: PoP for local control: 8f820513 I (10602) esp_weaver_local_ctrl: Local control started on port 8080, node_id: 6055F9F919EC在 Home Assistant 中操作灯光时设备串口会打印控制日志I (37132) app_light: Light received 1 params in write I (37132) app_light: Light.Power false I (40532) app_light: Light received 1 params in write I (40532) app_light: Light.Brightness 63 I (42272) app_light: Light received 1 params in write I (42272) app_light: Light.Hue 141九、实战示例二IMU 手势检测imu_gestureexamples/weaver/imu_gesture 展示了 Weaver 模型在「事件上报型」设备上的用法——设备本身不可被写而是通过传感器检测手势并向 Home Assistant 推送状态。详见其 README_CN.md。支持的硬件支持芯片的开发板 BMI270 传感器。支持的手势包括toss抛起、flip翻转、shake摇晃、rotation旋转、push推动、circle画圆、clap_single/clap_double/clap_triple单/双/三次拍手。该示例在 esp_weaver_standard_types.h 中对应了完整的手势参数类型esp.param.gesture-toss、esp.param.gesture-flip等以及三轴方向参数esp.param.orientation-x/y/z。设备检测到手势后通过esp_weaver_param_update_and_report()将事件值实时推送给 Home Assistant——这正是 Weaver 参数「实时推送」能力的典型应用也说明同一种模型既能承载「下行控制」也能承载「上行事件」。十、接入 Home Assistant设备侧完成启动后接入 Home Assistant 的步骤为在 Home Assistant 中安装ESP-Weaver 自定义集成乐鑫开发的对应 Home Assistant 集成组件通过 esp_local_ctrl 协议实现对 ESP 设备的本地发现与控制设备连接 WiFi 后会被自动发现零配置无需手动录入 IP输入设备的 PoP 码完成配对设备实体电源、亮度、颜色或手势类型、置信度、方向、角度将出现在 Home Assistant 中。故障排查要点来自 led_light 示例文档WiFi 连接失败检查 menuconfig 中的 WiFi 凭据确保设备在 WiFi 范围内设备未被发现确保 Home Assistant 和 ESP 设备在同一局域网且已安装 ESP-Weaver 集成PoP 码被拒绝验证输入的 PoP 码与串口日志显示的一致。十一、测试套件如何验证你的实现组件在 components/esp_weaver/test_apps 中包含完整的测试套件共 18 个用例可直接验证 SDK 行为也是学习 API 语义的最佳参考。测试覆盖范围见 test_apps/README.md类别验证内容[weaver][init]节点 init/deinit、单例约束、生命周期与状态转换[weaver][device]创建/删除、重名拒绝、从节点添加/移除[weaver][param]全部值类型、UI/边界、更新、类型不匹配检查[weaver][device][param]按名称/类型查找、重名拒绝、主参数[weaver][integration]完整流程、set_params 回调、变更追踪、端到端数据流[weaver][memory]字符串参数生命周期、完整流程循环、内存泄漏检测运行方式cd components/esp_weaver/test_apps idf.py set-target esp32 idf.py build flash monitor监视器提示时输入*运行全部用例或输入标签如[init]进行过滤。测试用例实现见 test_esp_weaver.c其中对单例约束、重名参数拒绝、类型不匹配等边界行为的断言直接反映了 SDK 的语义约束。十二、总结ESP Weaver 是 ESP-IoT-Solution 为「Home Assistant 本地化智能家居」场景提供的一站式设备端 SDK通过 esp_local_ctrl mDNS 实现零配置发现与毫秒级局域网控制通过 Curve25519 AES-CTR PoP 保证端到端安全通过简洁的设备/参数模型让开发者以极低的学习成本接入 Home Assistant 生态。无论是控制类设备如 led_light还是事件上报类设备如 imu_gesture都可以在统一模型下快速实现。建议下一步阅读 组件 README 与 头文件 API 文档 获取完整参考运行 led_light 示例 完成端到端验证再参考 test_apps 中的用例规范你的设备模型边界。赞分享物联网嵌入式驱动开发硬件开发【免费下载链接】esp-iot-solutionEspressif IoT Library. IoT Device Drivers, Documentations and Solutions.项目地址https://gitcode.com/GitHub_Trending/es/esp-iot-solution点击查看免费下载相关推荐ESP Weaver 设备端 SDK 实战指南基于 esp_local_ctrl mDNS 构建 Home Assistant 本地控制的 ESP32 智能家居设备ESP Weaver 设备端 SDK 实战指南基于 esp_local_ctrl mDNS 构建 Home Assistant 本地控制的 ESP32 智物联网嵌入式驱动开发硬件开发ESP Weaver 智能家居本地控制 SDK 完全指南基于 esp_local_ctrl 与 mDNS 的 Home Assistant 离线集成方案ESP Weaver 智能家居本地控制 SDK 完全指南基于 esp_local_ctrl 与 mDNS 的 Home Assistant 离线集成方案 导读物联网嵌入式驱动开发硬件开发ESP Weaver 组件详解基于 ESP-IDF 的 Home Assistant 本地发现与智能家居控制 SDKESP Weaver 组件详解基于 ESP IDF 的 Home Assistant 本地发现与智能家居控制 SDK 导读 ESP Weaver 是 esp物联网嵌入式驱动开发硬件开发创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表