联网与数据交换 / 云端设备发布 内容更新

ESP RainMaker 做远程小灯:先分清设备、账号和云服务

固定Classic1.17.0和Home6.2.1 Global,完成小灯固件、配网认领与参数回读的可操作步骤,区分断网、本地输出、账号移除和实体清理。

读完能做什么
拿到默认本地关闭云端的独立小灯工程,能逐项验证自己的claim、用户关联、参数控制与移除,选择清楚的本地替代路线。
开始之前
已会构建原生IDF、读取串口和确认GPIO接线;账号/手机操作由读者对自己的设备执行。
所需器材
官方ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8、桥口USB数据线、Kingbright WP7113ID红LED、330Ω/10kΩ电阻、常开按键、短线与面包板、自己的2.4GHz WPA2 AP、Internet、手机与Classic Global账号(本站未注册/使用)
版本组合
ESP-IDF:5.5.5 / b774170ff46c393eeb5e495ea37936038d3f4f4fClassic:esp_rainmaker1.17.0 / v1.17.0 a98d0fed4894c683759ef027e423b6ba401297f8手机说明:Home v6.2.1 / Android Global APK / Classic / c78d5e8d2702ba5c177427ec2247bb091bf09942;未安装运行网络helper:1.4.5固定源码;仅遮蔽凭据日志关键实际依赖:rmaker_common1.9.0、network_provisioning1.2.5;全部依赖以锁文件为准
适用范围

仅官方S3 DevKitC-1 v1.1 N8R8、IDF5.5.5;8MiB DIO80、PSRAM关闭、桥接UART115200。Classic公共Global路线,不是Neo、CN、自部署、Matter设备或继电器控制;所有实物/手机/云操作仍pending。

这篇验证到了哪一步

资料核对已通过
固定主源、组件映射与安装输入逐字核对;docs/esp32-evidence/cloud-gateway-sources.json版本:ESP-IDF5.5.5验证日期:
构建 / 配置已通过
n10-local、n10-cloud:实际原生构建,完整命令/日志/输入与产品SHA见cloud-gateway-builds.json;不等于设备运行。对象:esp32s3版本:5.5.5验证日期:
仿真已通过
button7组+真实main回调体5组,主机ASan/UBSan;仅同源主机逻辑/本机服务,不是ESP32电气或射频仿真。验证日期:
本站实板待验证
没有实板、射频、传感器、手机或公共云运行记录;观察CSV只有表头。

构建通过只说明指定环境中的代码或配置通过检查;实物功能、功耗和稳定性以对应的实板记录为准。

01 / 云端设备

先选云路线:本篇为什么仍用 Classic

这次的完成物是一颗可由自己的手机账号发送Power目标值的外接LED。账号登录、设备claim、用户—节点关联、GPIO输出和手机回读各有一个检查点。没有先把这些边界分清,只看到GOT_IP或App列表,就很容易把尚未控制到的灯当成成功。

2026-08-05官方发布Neo并推荐新项目采用,Classic仍维护。当前Neo文档要求IDF≥6.0.2,5.5分支只作CI编译覆盖。本系列工具固定5.5.5,因此选择仍声明IDF≥5.1的Classic1.17.0,而不是把Neo硬称为5.5.5受支持。两个后端不能直接互换。

做到这里,你应该看到
版本单写明Classic / IDF5.5.5;没有混入Neo库或Neo账号。

参考:[1] Classic v1.17.0组件manifest:IDF≥5.1与依赖[4] Neo官方支持IDF≥6.0.2;5.5仅CI编译覆盖[5] Espressif 2026-08-05 Neo发布、Classic维护边界

02 / 云端设备

固定 App、地区和当前条款

手机路线限定官方正式发行Home v6.2.1(2026-09-25)的Android Global APK,按同版源码核查,初始平台卡选Classic;不扩展成iOS已验组合。该版本同时有Neo/自部署入口;CN与Global也有独立后端。界面中文不代表切换成中国区云。本文没有下载APK、安装App、登录账号或连接设备。

2026-10-18阅读的Classic条款段标明2020-03-01生效;同页另有Private Agent的2026年条款。Neo条款则是独立入口、2026-08-01生效。不要串用日期或把源码许可证当作公共云的永久使用承诺。注册前阅读自己实际地区的现行条款/隐私页面,确认账号与限制;本文不承诺免费配额、SLA或商用授权。

需要账户时,用自己的邮箱/当前App提供的账号方式完成注册验证,登录同一Global/Classic后端。若商店已变版,记录实际版本并重新核对官方步骤;不能以关闭TLS或改错云地址来绕过失败。

做到这里,你应该看到
记录Home版本、地区、Classic选择及条款阅读日期;不记录公开密码或令牌。

参考:[3] Home v6.2.1正式发行(2026-09-25)[6] Classic Global当前服务条款;2026-10-18核查[7] Neo当前服务条款;独立入口[14] Home6.2.1具体Classic/Neo平台选择[15] Home6.2.1地区与Global/CN账号部署边界

03 / 云端设备

先让本地灯和按钮成为可靠的对照

固定板为官方ESP32-S3-DevKitC-1 v1.1 / WROOM-1-N8R8,桥接UART115200、8MiB DIO80、PSRAM不启用。断电接下表,单路USB-to-UART供电;不接原生USB、继电器或任何市电负载。

WP7113ID手册Vf=1.9V是10mA条件的典型值。用它粗估330Ω约4.2mA只是选限流电阻的起点,不是本站测量,也不是该电流的精确Vf;F03的1kΩ可作较暗的初检。按键四脚先用断电通断档分组,避免同侧两脚一直短接。

连线固定连接检查
灯GPIO4/J1-4 → 330Ω → WP7113ID阳极;阴极/平边→GND/J1-22限流串联、极性正确
按钮GPIO5/J1-5 → 常开按键 → GND内部上/下拉关闭
外部上拉3V3/J1-1或2 → 10kΩ → GPIO5松开应为高电平
做到这里,你应该看到
默认local-only刷入后,稳定释放按钮再短按释放,日志输出ON/OFF;实体亮灭另观察。

参考:[8] DevKitC-1 v1.1 固定用户指南:J1与供电选项[9] Kingbright WP7113ID V.14A,第1/2页极性与Vf条件

04 / 云端设备

从默认关闭到显式开启云端

下载含完整main、同源按键模型、固定网络helper、manifest/依赖锁、README、许可与空观察表。默认N10_CLASSIC_CLOUD=n只运行本地按钮,不初始化Wi-Fi/BLE/RainMaker;库被编译进依赖图不等于固件运行时已联网。

激活IDF5.5.5,在新B目录执行idf.py -B build-local -D IDF_TARGET=esp32s3 build。核对自有串口与原布局备份后,再flash monitor,先看到LOCAL_ONLY。云端另用build-classic目录运行menuconfig,在N10 explicit cloud consent中主动开启,再build/flash;避免沿用旧sdkconfig。限制并发用环境变量IDF_PY_BUILD_JOBS=2。

本例分区表在0xc000,普通nvs为0x10000/0x6000,factory app为0x20000/0x360000,独立fctry为0x780000/0x6000。更换布局前私密备份同板原Flash、分区和需要保留的身份区;不以erase-flash作为入门步骤。没有启用OTA服务,也没有启用Flash/NVS加密;存在nvs_key分区不能证明加密已启用。

做到这里,你应该看到
默认/云端是两个明确配置,实际sdkconfig的target、8MiB和开关值都已核对。
如果卡住了
NVS初始化失败会停云端且不自动擦除。固定helper内部使用ESP_ERROR_CHECK,初始化的底层致命错误可能中止/重启;不能把所有启动错误都描述为继续联网。

参考:[1] Classic v1.17.0组件manifest:IDF≥5.1与依赖[2] 同commit网络helper 1.4.5:异步网络、随机PoP与Security2[8] DevKitC-1 v1.1 固定用户指南:J1与供电选项

05 / 云端设备

把 claim 与配网、用户关联分别做完

主程序依固定例程顺序:NVS → void app_network_init → esp_rmaker_node_init →标准Lightbulb及System服务→agent start→异步app_network_start。首次node初始化会准备设备密钥/随机PoP;assisted claim在手机帮助下取得云证书,再连接AP。不要先手工STA联网跳过该流程。

固定helper使用Security2(SRP6a/AES-GCM),用户名wifiprov,POP_TYPE_RANDOM从factory随机数据生成8位hex PoP;PoP不是MAC、Wi-Fi口令或账号密码。二维码包含私有PoP,直接扫描串口二维码,不公开串口截图、带PoP链接或Flash备份。

Home的+选择扫码,或Bluetooth只选自己串口显示的N10_...,完成该设备的会话/claim。再选择自有2.4GHz WPA2 AP,输入正确密码,等App完成用户—节点关联并在Home出现设备。按手机系统要求开放蓝牙/附近设备或位置权限,配网时保持App前台。

  1. 确认Classic Global账号已登录,而非Neo/自部署。
  2. 识别自己串口设备名与PoP;只操作自有板。
  3. 完成claim后再发送AP凭据,分别记录各阶段。
  4. 等用户关联完成与Power控件出现,不能只以GOT_IP判成功。
做到这里,你应该看到
设备列表出现与节点身份对应、claim与关联均有记录;本文仅给执行方法,未声称已完成。

参考:[2] 同commit网络helper 1.4.5:异步网络、随机PoP与Security2[12] Classic固定core:初始化、assisted claiming与时间同步[14] Home6.2.1具体Classic/Neo平台选择[16] Classic Home当前配网与移除操作说明

06 / 云端设备

同源按键模型:上电按住不会清配置

先稳定释放30ms才接受按下;短按释放切Power,稳定按住至少5秒再释放才请求一次Wi-Fi reset。持续按住不重复触发,上电就压着也不算一次授权。时间使用64位毫秒。下方文件直接由主程序包含,主机夹具测试的是同一个函数。

代码 / 配置
// ---- main/light_model.h ----
/* SPDX-License-Identifier: MIT */
#pragma once
#include <stdbool.h>
#include <stdint.h>
typedef enum {N10_NONE,N10_SHORT,N10_WIFI_RESET} N10Action;
typedef struct {bool raw,stable,ready,pressed;uint64_t changed,down;} N10Button;
/* Initialize raw/stable to the actual level at boot. A stable release must be
   observed before accepting any press; actions occur only on debounced release. */
static inline N10Button n10_button_init(bool down,uint64_t now){return(N10Button){.raw=down,.stable=down,.changed=now};}
static inline N10Action n10_button_tick(N10Button*b,bool down,uint64_t now){
 if(down!=b->raw){b->raw=down;b->changed=now;}
 if(now<b->changed||now-b->changed<30)return N10_NONE;
 if(!down&&!b->ready){b->ready=true;b->stable=false;b->pressed=false;return N10_NONE;}
 if(!b->ready||b->stable==down)return N10_NONE;
 b->stable=down;
 if(down){b->pressed=true;b->down=now;return N10_NONE;}
 if(!b->pressed)return N10_NONE;
 b->pressed=false;return now>=b->down&&now-b->down>=5000?N10_WIFI_RESET:N10_SHORT;
}
做到这里,你应该看到
先用local-only验证按钮接线;长按复位只在云端agent已启动后允许。

参考:[2] 同commit网络helper 1.4.5:异步网络、随机PoP与Security2[11] rmaker_common1.9.0固定系统reset实现:普通NVS与Wi-Fi

07 / 云端设备

完整主程序:请求排队,GPIO只有一个 owner

标准LED设备只创建Name与Power,Power为布尔目标值。SDK写回调验证参数与类型,投递8项队列;队列满返回错误,不悄悄覆盖。唯一owner依接收顺序应用目标并写GPIO4,然后请求参数报告。物理短按进入同一owner;Power不写入持久NVS,重启初始OFF。

代码每5秒可请求一次最新Power报告,输出改变会提前请求;SDK接受报告仍不证明手机已经收到。多控制端没有跨重启命令序号事务;重复ON不会累加动作,先后不同目标按接收顺序决定。

代码 / 配置
// ---- main/main.c ----
/* SPDX-License-Identifier: MIT */
#include <stdio.h>
#include <stdint.h>
#include <stdbool.h>
#include <stdatomic.h>
#include "freertos/FreeRTOS.h"
#include "freertos/task.h"
#include "freertos/queue.h"
#include "driver/gpio.h"
#include "esp_timer.h"
#include "esp_log.h"
#include "esp_event.h"
#include "esp_wifi.h"
#include "nvs_flash.h"
#include "esp_rmaker_core.h"
#include "esp_rmaker_standard_params.h"
#include "esp_rmaker_standard_devices.h"
#include "esp_rmaker_standard_types.h"
#include "esp_rmaker_standard_services.h"
#include "esp_rmaker_utils.h"
#include "app_network.h"
#include "sdkconfig.h"
#include "light_model.h"
#define LED GPIO_NUM_4
#define BUTTON GPIO_NUM_5
static const char*TAG="N10";
static QueueHandle_t writes;
static _Atomic(esp_rmaker_param_t*) power_param;
static atomic_bool cloud_ready,reset_pending;
static uint64_t ms(void){return (uint64_t)esp_timer_get_time()/1000;}
#if CONFIG_N10_CLASSIC_CLOUD
static esp_err_t write_cb(const esp_rmaker_device_t*d,const esp_rmaker_param_t*p,const esp_rmaker_param_val_t v,void*priv,esp_rmaker_write_ctx_t*ctx){
 (void)d;(void)priv;(void)ctx;
 if(atomic_load(&reset_pending))return ESP_ERR_INVALID_STATE;
 if(p!=atomic_load(&power_param)||v.type!=RMAKER_VAL_TYPE_BOOLEAN)return ESP_ERR_INVALID_ARG;
 const bool requested=v.val.b;
 /* Callback accepts a bounded request; only owner changes GPIO and reports. */
 return xQueueSend(writes,&requested,0)==pdTRUE?ESP_OK:ESP_ERR_NO_MEM;
}
static void status_event(void*unused,esp_event_base_t base,int32_t id,void*data){
 (void)unused;(void)data;
 if(base==IP_EVENT&&id==IP_EVENT_STA_GOT_IP)ESP_LOGI(TAG,"GOT_IP: not cloud/account association proof");
 if(base==WIFI_EVENT&&id==WIFI_EVENT_STA_DISCONNECTED)ESP_LOGW(TAG,"AP_DISCONNECTED: local button remains active; helper handles reconnect");
}
#endif
static void owner(void*unused){
 (void)unused;bool state=false,dirty=true,reset_requested=false;uint64_t report_at=0;
 N10Button button=n10_button_init(gpio_get_level(BUTTON)==0,ms());
 for(;;){
  bool requested;while(xQueueReceive(writes,&requested,0)==pdTRUE){if(!reset_requested){state=requested;dirty=true;}}
  const uint64_t now=ms();N10Action a=n10_button_tick(&button,gpio_get_level(BUTTON)==0,now);
  if(a==N10_SHORT&&!reset_requested){state=!state;dirty=true;}
  if(a==N10_WIFI_RESET&&!reset_requested){
   if(atomic_load(&cloud_ready)){
    reset_requested=true;atomic_store(&reset_pending,true);state=false;dirty=true;
    /* Fixed upstream API returns acceptance, not verified erase/reboot. */
    esp_err_t rc=esp_rmaker_wifi_reset(2,2);ESP_LOGW(TAG,"WIFI_RESET_REQUEST=%s; verify reboot and BLE provisioning physically",esp_err_to_name(rc));
   }else ESP_LOGW(TAG,"LOCAL_ONLY_OR_START_FAILED: no Wi-Fi credentials reset requested");
  }
  if(dirty){
   esp_err_t rc=gpio_set_level(LED,state?1:0);
   if(rc!=ESP_OK){state=false;(void)gpio_set_level(LED,0);ESP_LOGE(TAG,"GPIO_ERROR=%s, OFF requested",esp_err_to_name(rc));}
   ESP_LOGI(TAG,"OUTPUT_LATCH=%s; not optical feedback or phone confirmation",state?"ON":"OFF");
   dirty=false;report_at=0;
  }
  esp_rmaker_param_t*p=atomic_load(&power_param);
  if(p&&atomic_load(&cloud_ready)&&now>=report_at){
   esp_err_t rc=esp_rmaker_param_update_and_report(p,esp_rmaker_bool(state));
   ESP_LOGI(TAG,"REPORT_REQUEST=%s; remote display/delivery must be observed separately",esp_err_to_name(rc));report_at=now+5000;
  }
  vTaskDelay(pdMS_TO_TICKS(10));
 }
}
void app_main(void){
 gpio_config_t out={.pin_bit_mask=UINT64_C(1)<<LED,.mode=GPIO_MODE_OUTPUT,.pull_up_en=GPIO_PULLUP_DISABLE,.pull_down_en=GPIO_PULLDOWN_DISABLE,.intr_type=GPIO_INTR_DISABLE};
 ESP_ERROR_CHECK(gpio_config(&out));ESP_ERROR_CHECK(gpio_set_level(LED,0));
 gpio_config_t in={.pin_bit_mask=UINT64_C(1)<<BUTTON,.mode=GPIO_MODE_INPUT,.pull_up_en=GPIO_PULLUP_DISABLE,.pull_down_en=GPIO_PULLDOWN_DISABLE,.intr_type=GPIO_INTR_DISABLE};ESP_ERROR_CHECK(gpio_config(&in));
 writes=xQueueCreate(8,sizeof(bool));if(!writes)return;
 if(xTaskCreate(owner,"light_owner",4096,NULL,5,NULL)!=pdPASS)return;
#if !CONFIG_N10_CLASSIC_CLOUD
 ESP_LOGW(TAG,"LOCAL_ONLY: Classic cloud disabled; no Wi-Fi/BLE/account operation. Button works, power resets OFF.");return;
#else
 esp_err_t rc=nvs_flash_init();if(rc!=ESP_OK){ESP_LOGE(TAG,"NVS=%s: stop cloud, preserve contents; no automatic erase",esp_err_to_name(rc));return;}
 app_network_init(); /* Fixed helper is void and uses ESP_ERROR_CHECK internally. */
 ESP_ERROR_CHECK(esp_event_handler_register(IP_EVENT,ESP_EVENT_ANY_ID,status_event,NULL));
 ESP_ERROR_CHECK(esp_event_handler_register(WIFI_EVENT,ESP_EVENT_ANY_ID,status_event,NULL));
 esp_rmaker_config_t config={.enable_time_sync=true};
 esp_rmaker_node_t*node=esp_rmaker_node_init(&config,"N10 Owned LED","Light");if(!node){ESP_LOGE(TAG,"node_init failed; local button only");return;}
 esp_rmaker_device_t*device=esp_rmaker_lightbulb_device_create("LED",NULL,false);if(!device)return;
 esp_rmaker_param_t*p=esp_rmaker_device_get_param_by_type(device,ESP_RMAKER_PARAM_POWER);if(!p)return;
 atomic_store(&power_param,p);ESP_ERROR_CHECK(esp_rmaker_device_add_cb(device,write_cb,NULL));ESP_ERROR_CHECK(esp_rmaker_node_add_device(node,device));
 esp_rmaker_system_serv_config_t system={.flags=SYSTEM_SERV_FLAG_REBOOT|SYSTEM_SERV_FLAG_FACTORY_RESET|SYSTEM_SERV_FLAG_WIFI_RESET,.reboot_seconds=2,.reset_seconds=2,.reset_reboot_seconds=2};
 ESP_ERROR_CHECK(esp_rmaker_system_service_enable(&system));
 rc=esp_rmaker_start();if(rc!=ESP_OK){ESP_LOGE(TAG,"agent_start=%s",esp_err_to_name(rc));return;}
 atomic_store(&cloud_ready,true);
 rc=app_network_start(POP_TYPE_RANDOM);if(rc!=ESP_OK){atomic_store(&cloud_ready,false);ESP_LOGE(TAG,"provision_start=%s; local button only, inspect factory/claim configuration",esp_err_to_name(rc));return;}
 ESP_LOGW(TAG,"CLASSIC network/claim agent started: no claim, account mapping, phone control or removal result asserted");
#endif
}
做到这里,你应该看到
OUTPUT_LATCH、REPORT_REQUEST、App回读和LED光学观察分开填表,后者仍pending。

参考:[1] Classic v1.17.0组件manifest:IDF≥5.1与依赖[12] Classic固定core:初始化、assisted claiming与时间同步[13] Classic固定Lightbulb标准设备:Name与Power

08 / 云端设备

断网时保留一个本地可操作的对照

先完成一次ON/OFF双向检查,再关自己的AP。观察AP_DISCONNECTED,同时短按物理按钮;App可能保留旧值或标离线,不能代表当前GPIO。恢复AP后,等待SDK重连、参数报告和App重新读取,再比对最新值。

固定网络helper在断连事件请求重连,不是N01的指数退避实现,不承诺恢复时限、离线命令队列或恰好一次。若Power错误,先看owner日志和电路,再查手机/云状态,不拿Wi-Fi连接成功替代端到端检查。

  1. 手机ON→OFF,各等一次日志、回读、实体观察。
  2. 物理按钮切换,记录App反向更新。
  3. AP断开期间本地切换,保留旧值/离线证据。
  4. 恢复网络后重新读取,核最新目标与实际灯。
做到这里,你应该看到
每次操作都记录目标、软件输出、手机结果、实体结果;没有网络或板时保持空CSV。

参考:[2] 同commit网络helper 1.4.5:异步网络、随机PoP与Security2

09 / 云端设备

配网失败、换 AP 与恢复

初次配网窗口5分钟,最多5次PoP不匹配;配置连接有3次尝试,错误凭据失败会按helper重置配网状态。超时或锁定后先保留原因、RESET重开窗口,不降成无安全配网。检查Classic/Global、正确设备名/PoP、AP密码、DNS/Internet/系统时间与手机权限。

云端agent启动后,稳定按住按钮≥5秒再释放,程序请求关灯并发esp_rmaker_wifi_reset(2,2)。它是2秒后reset、再2秒后reboot的SDK请求参数,不是本站计时测量;固定包装函数的返回也不能当作擦除完成证明。观察实体重启和BLE重新出现,再重新配网。

该操作恢复Wi-Fi配置,不等于账号移除、清除fctry密钥或安全擦除。reset_pending期间不接受新的云目标;默认local-only或启动失败时长按只记日志,不启动不存在的云复位。

做到这里,你应该看到
记录重启与配网窗口真实现象,不能写“返回ESP_OK所以已清理”。

参考:[2] 同commit网络helper 1.4.5:异步网络、随机PoP与Security2[11] rmaker_common1.9.0固定系统reset实现:普通NVS与Wi-Fi

10 / 云端设备

移除账号关联,不要误认为板上已全清

按同一Home6.2.1/Classic:Home点本设备→右上设置→底部红色Remove Device→确认。固定App对支持System服务的节点先尽力发factory reset,再解除云关联;reset失败会捕获,离线设备也可能从账号列表消失。

本例System的factory reset清默认普通NVS、恢复Wi-Fi并重启,独立fctry保留。因此在线移除后分别观察列表、串口重启、BLE重新可见;离线移除只记云关联结果,恢复供电后再核实体配置。退役或交接还需按部署方流程处理设备身份、备份与密钥,不能把列表消失或普通NVS复位说成安全擦除。

做到这里,你应该看到
至少区分“云关联已移除”“实体reset已观察/未确认”“fctry身份处置”三项。

参考:[10] Home v6.2.1移除前尝试实体reset,失败仍继续云移除[11] rmaker_common1.9.0固定系统reset实现:普通NVS与Wi-Fi[16] Classic Home当前配网与移除操作说明

11 / 云端设备

实际证据覆盖到哪里

默认与cloud配置均使用真实IDF编译,具体结果、原始失败及修正、源与产品SHA列在cloud-gateway-builds.json。按键7组和从实际main提取的回调体5组ASan/UBSan检查覆盖输入与排队边界;没有在主机伪装云claim或安全握手。

本站没有该板、账号/手机操作或实体LED观察,全部保留pending。下载records/cloud-observations.csv只有表头。保留完整错误与不同阶段的实际结果,不把教程中的预期步骤抄成本站验收。

做到这里,你应该看到
能够指出每项证据实际执行的对象;构建和host通过不能抵消hardware pending。
12 / 云端设备

不采用公共云时,选择可维护的本地路线

只需家庭LAN、没有合适App或不接受当前服务条件时,可先保留本工程local-only按钮,或另烧N02局域网页灯/N07自有broker工程。它们是独立固件与服务,不是尚未认领Classic节点自动附带的本地Web接口。后续学习先回到自己的网络和版本锁,避免把两个云栈混装。

BACK TO THE SOURCE

资料来源与版本说明

2026-10-18实读官方固定SDK/helper/App源码、当前Classic/Neo文档与条款。没有用Neo的公开体验政策替Classic承诺服务;构建与实体结果分列。资料核对日期:。资料核对、程序构建与实板测试分别记录,不互相替代。

  1. Classic v1.17.0组件manifest:IDF≥5.1与依赖
  2. 同commit网络helper 1.4.5:异步网络、随机PoP与Security2
  3. Home v6.2.1正式发行(2026-09-25)
  4. Neo官方支持IDF≥6.0.2;5.5仅CI编译覆盖
  5. Espressif 2026-08-05 Neo发布、Classic维护边界
  6. Classic Global当前服务条款;2026-10-18核查
  7. Neo当前服务条款;独立入口
  8. DevKitC-1 v1.1 固定用户指南:J1与供电选项
  9. Kingbright WP7113ID V.14A,第1/2页极性与Vf条件
  10. Home v6.2.1移除前尝试实体reset,失败仍继续云移除
  11. rmaker_common1.9.0固定系统reset实现:普通NVS与Wi-Fi
  12. Classic固定core:初始化、assisted claiming与时间同步
  13. Classic固定Lightbulb标准设备:Name与Power
  14. Home6.2.1具体Classic/Neo平台选择
  15. Home6.2.1地区与Global/CN账号部署边界
  16. Classic Home当前配网与移除操作说明