docs/prompts: 必测项 manifest 生成器 + 测试计划按优先级四层重构

- scripts/gen-must-test-manifest.ts + test-plan/must-test.manifest.ts:
  从 ONES 必测项-AI自动化(CQz9YCNX/EPfZfC9Y) 生成映射清单 187 条
  (添加73 + 功能9 + 控制105step双协议),npm run gen:must-test
- docs/generate_test_plan.py + docx: 测试计划由"品类/16周Phase"重构为
  "优先级四层 backlog"(必测项→单品探索→全功能→平台),添加提到最前(串口前置),
  补充人力安排(1人) + 基于AI的逐功能人力预估(总~105-135人日)
- prompts/test_plan_conversion.md: 新增"按测试计划驱动转换"执行总纲
- prompts/ones_to_automation.md: 登记测试计划/必测项子提示词组合

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
woan 2026-05-29 14:55:40 +08:00
parent e33b042c69
commit cf994c1aad
7 changed files with 793 additions and 224 deletions

Binary file not shown.

View File

@ -79,7 +79,8 @@ doc.add_heading('1. 项目概述', level=1)
doc.add_heading('1.1 背景', level=2)
doc.add_paragraph(
'SwitchBot App 涵盖 100+ 款 IoT 设备,需要对每款设备的 App 功能进行自动化回归测试。'
'本计划基于已验证的 Vitest + Appium 技术框架,按品类批量推进覆盖所有设备。'
'本计划基于已验证的 Vitest + Appium 技术框架,按优先级分层推进:'
'必测项 → 单品探索 → 全功能 → 平台,高优先级层先达标再投入下一层。'
)
doc.add_heading('1.2 技术栈', level=2)
@ -104,10 +105,11 @@ rows = [
add_table_with_header(doc, ['设备', '脚本文件数', '覆盖模块', '通过率'], rows)
doc.add_heading('1.4 目标', level=2)
doc.add_paragraph('• 覆盖 82 款未自动化设备的核心功能测试')
doc.add_paragraph('• 实现设备添加流程自动化(需串口配合)')
doc.add_paragraph('• 覆盖通用自动化/场景联动测试')
doc.add_paragraph('• 总工期 16 周,覆盖率目标 100%')
doc.add_paragraph('• P0 必测项:各单品添加 + 核心控制(双协议)准入闸门,来源 ONES 必测项-AI自动化')
doc.add_paragraph('• P1 单品探索82 款单品主流程冒烟,覆盖广度')
doc.add_paragraph('• P2 全功能全维度回归card/control/setting/scene/logs覆盖深度')
doc.add_paragraph('• P3 平台:账号/房间/消息/家庭分享/场景等平台功能')
doc.add_paragraph('• 按优先级 backlog 依次交付,各层有独立退出标准(不绑定固定周次)')
doc.add_page_break()
@ -238,240 +240,240 @@ doc.add_page_break()
# ======================== 3. 测试维度说明 ========================
doc.add_heading('3. 测试维度说明', level=1)
doc.add_paragraph('每款设备根据功能复杂度,覆盖以下测试维度')
doc.add_paragraph('每款设备根据功能复杂度,覆盖以下测试维度。人力预估基于 AI 辅助Claude Code 边跑边写)首台需建模分析,同品类复用台仅改配置,工时约减半或更低。')
rows = [
('card', '{device}_card.test.ts', '首页卡片展示与交互', '3-5', '所有设备'),
('control', '{device}_control.test.ts', '功能页核心操作(开关/模式/参数调节)', '8-20', '所有设备'),
('setting', '{device}_setting.test.ts', '设备设置页(名称/房间/固件/信息)', '5-8', '所有设备'),
('connect', '{device}_connect.test.ts', '设备添加/配对流程', '3-5', 'Phase 4'),
('scene', '{device}_scene.test.ts', '自动化/场景联动', '3-8', 'Phase 4'),
('logs', '{device}_logs.test.ts', '操作日志查看', '2-4', '可选'),
('card', '{device}_card.test.ts', '首页卡片展示与交互', '3-5', 'P1 / P2', '0.3 / 0.1'),
('control', '{device}_control.test.ts', '功能页核心操作(开关/模式/参数调节)', '8-20', 'P0 / P1 / P2', '1.0 / 0.3'),
('setting', '{device}_setting.test.ts', '设备设置页(名称/房间/固件/信息)', '5-8', 'P2', '0.5 / 0.2'),
('connect', '{device}_connect.test.ts', '设备添加/配对流程', '3-5', 'P0 / P2', '0.5 / 0.2'),
('scene', '{device}_scene.test.ts', '自动化/场景联动', '3-8', 'P3', '0.5 / 0.2'),
('logs', '{device}_logs.test.ts', '操作日志查看', '2-4', 'P2(可选)', '0.2 / 0.1'),
]
add_table_with_header(doc,
['维度', '文件命名', '内容', '用例数', '适用阶段'],
rows
['维度', '文件命名', '内容', '用例数', '优先级层', 'AI预估(人日:首台/复用)'],
rows,
col_widths=[1.3, 3.8, 4.2, 1.2, 2, 3]
)
doc.add_paragraph()
doc.add_paragraph('用例数量估算:每设备平均 25-40 条82款设备总计约 2000-3000 条自动化用例。')
doc.add_paragraph('AI 提效口径:单维度脚本首台 0.2-1 人日、复用台 0.1-0.3 人日;串口添加框架为一次性投入(见 §5.2。下列各层人力预估均按此口径单位为人日1 人)。')
doc.add_page_break()
# ======================== 4. Phase 1 ========================
doc.add_heading('4. Phase 1: 高复用品类调试W1-W4', level=1)
# ======================== 4. 测试优先级分层 ========================
doc.add_heading('4. 测试优先级分层', level=1)
doc.add_paragraph(
'策略:同品类 UI 高度相似,已有脚本模板。每周选定一个品类,'
'调通首台设备后,通过修改设备名称配置快速扩展到同品类其他型号'
'本计划按优先级分四层推进,依次为:必测项 → 单品探索 → 全功能 → 平台。'
'高优先级层先达标再投入下一层;不绑定固定周次,按相对工作量排 backlog'
)
rows = [
('W1', '窗帘系列', '9', '用例脚本×9、通用curtain_helper', '~225', '1人'),
('W2', '锁系列', '12', '用例脚本×12、通用lock_helper', '~360', '1人'),
('W3', '插座+开关', '6', '用例脚本×6、通用relay_helper', '~150', '1人'),
('W4', '灯光系列', '10', '用例脚本×10、通用light_helper', '~250', '1人'),
('P0 必测项', '各单品添加 + 核心控制(双协议)', 'ONES 必测项-AI自动化 (CQz9YCNX)', '187', '每次提测/版本必跑', '通过率≥95%'),
('P1 单品探索', '每单品主流程冒烟card+核心control', '按单品模板', '82款各1遍', '每迭代', '全单品冒烟通过'),
('P2 全功能', '全维度回归(card/control/setting/scene/logs)', '各品类用例库', '~2366', '版本回归', '通过率≥85%'),
('P3 平台', '账号/房间/消息/家庭分享/场景等平台功能', 'App平台用例库', '平台模块', '版本回归', '平台用例通过'),
]
add_table_with_header(doc,
['周次', '品类', '设备数', '输出内容', '用例数', '人力'],
rows
['优先级', '范围', '来源', '用例量', '运行频率', '退出标准'],
rows,
col_widths=[2.2, 4, 3.5, 1.3, 2.5, 2.5]
)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('里程碑:').bold = True
p.add_run(' 第4周末交付 37 款设备自动化脚本,覆盖率提升至 45%')
doc.add_heading('W1 窗帘系列详细计划', level=2)
doc.add_paragraph('• Day 1-2: 调通 Curtain Rod 全套脚本card/control/setting')
doc.add_paragraph('• Day 3: 验证 Curtain U Rail / Curtain 3 复用性,修复差异')
doc.add_paragraph('• Day 4-5: 批量扩展到9款整理通用 curtain_helper.ts')
doc.add_paragraph('• 通用 helper 内容: 窗帘位置控制、校准流程、定时器操作、群组控制')
doc.add_heading('W2 锁系列详细计划', level=2)
doc.add_paragraph('• Day 1-3: 调通 Lock (JP) 全套脚本(含密码管理、开锁记录)')
doc.add_paragraph('• Day 4: Lock Pro 系列扩展(指纹/NFC额外功能')
doc.add_paragraph('• Day 5: Lock Ultra / Vision Deadbolt 新UI适配')
doc.add_paragraph('• 通用 helper 内容: 密码管理、开锁方式切换、自动锁定设置、电量监控')
doc.add_heading('W3 插座+开关详细计划', level=2)
doc.add_paragraph('• Day 1-2: 调通 Plug Mini 脚本(开关/定时/功率监控)')
doc.add_paragraph('• Day 3-4: Relay Switch 系列适配')
doc.add_paragraph('• Day 5: 通用 relay_helper 整理')
doc.add_paragraph('• 通用 helper 内容: 开关操作、定时器、功率/电量统计、过载保护')
doc.add_heading('W4 灯光系列详细计划', level=2)
doc.add_paragraph('• Day 1-2: Strip Light 系列调通(亮度/色温/颜色/模式)')
doc.add_paragraph('• Day 3: Ceiling Light 调通')
doc.add_paragraph('• Day 4-5: Floor Lamp / Candle Lamp / Outdoor Lights 扩展')
doc.add_paragraph('• 通用 helper 内容: RGB颜色控制、亮度调节、模式切换、渐变设置')
doc.add_page_break()
# ======================== 5. Phase 2 ========================
doc.add_heading('5. Phase 2: 中等复杂度W5-W8', level=1)
# ======================== 5. P0 必测项 ========================
doc.add_heading('5. P0 必测项(最高优先)', level=1)
doc.add_paragraph(
'策略这些品类功能较复杂或有较大UI差异每周处理一个品类。'
'扫地机需要处理地图和清扫模式,传感器需要读取数据图表'
'必测项是提测/版本更新的准入闸门,来源 ONES 测试计划「必测项-AI自动化」(plan CQz9YCNX / lib EPfZfC9Y)'
'映射清单见 test-plan/must-test.manifest.ts转换规则见 prompts/must_test_conversion.md。'
)
doc.add_heading('5.1 必测项构成', level=2)
rows = [
('W5', '扫地机系列', '9', '用例脚本×9、robot_helper增强', '~270', '1-2人'),
('W6', '传感器+温控', '7', '用例脚本×7、sensor_helper', '~175', '1人'),
('W7', '风扇+空净+加湿', '6', '用例脚本×6、climate_helper', '~150', '1人'),
('W8', '摄像头+门铃+OSC', '3', '用例脚本×3、复用camera框架', '~90', '1人'),
('添加 (connect)', '每单品型号一条「添加X验证」', '73', 'connect 维度,需串口配合'),
('单品功能 (feature)', '绑定手持/学习遥控器/keypad密码指纹/温湿度单位等', '9', 'control/setting 维度'),
('控制 (control)', '2条协议超级用例逐 stepBLE 49 + WiFi 56', '105', 'control 维度,双协议各跑一遍'),
]
add_table_with_header(doc,
['周次', '品类', '设备数', '输出内容', '用例数', '人力'],
rows
)
add_table_with_header(doc, ['类型', '说明', '条数', '落点/备注'], rows)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('里程碑').bold = True
p.add_run(' 第8周末交付 25 款设备,累计覆盖率提升至 76%')
p.add_run('合计:').bold = True
p.add_run('187 条(另 2 条 nasafety alarm 无目录、强绑定解绑归平台)。控制粒度在 step按 (用例号#step)+协议精确回写 ONES。')
doc.add_heading('W5 扫地机系列重点', level=2)
doc.add_paragraph('• S1/S1P: 基础吸力模式、边刷/滚刷状态')
doc.add_paragraph('• K10+Pro/K11+: 地图管理、禁区设置、多楼层')
doc.add_paragraph('• K20+/S20: 新一代UI - 自清洁基站控制、拖布清洗')
doc.add_paragraph('• 难点: 地图加载需等待、清扫区域选择涉及画布操作')
doc.add_heading('W6 传感器+温控重点', level=2)
doc.add_paragraph('• Meter Pro: 温湿度数据展示、历史图表、告警设置')
doc.add_paragraph('• Presence Sensor: 人体存在检测、灵敏度调节')
doc.add_paragraph('• Weather Station: 多传感器数据聚合展示')
doc.add_paragraph('• 难点: 数据图表验证需截图比对或文本提取')
doc.add_heading('W7 风扇+空净+加湿重点', level=2)
doc.add_paragraph('• Fan: 风速/模式/摇头/定时')
doc.add_paragraph('• Air Purifier: 空气质量指标、滤网寿命、自动模式')
doc.add_paragraph('• Humidifier: 湿度目标、加湿模式、水箱状态')
doc.add_heading('W8 摄像头+门铃重点', level=2)
doc.add_paragraph('• 猫狗定制款: 复用Camera脚本验证宠物检测功能')
doc.add_paragraph('• Video Doorbell: 门铃呼叫、访客记录、对讲新UI')
doc.add_paragraph('• OSC KVS: 复用OSC脚本基础')
doc.add_page_break()
# ======================== 6. Phase 3 ========================
doc.add_heading('6. Phase 3: 新品+特殊设备W9-W12', level=1)
doc.add_heading('5.2 前置:设备添加自动化(关键路径,最先启动)', level=2)
doc.add_paragraph(
'策略这些设备UI独特或为全新品类需要从头编写测试脚本'
'依赖设备到位和UI稳定'
'必测含 73 条添加,添加流程需硬件配合(串口控制设备进入配对模式),分 BLE 直连与 Wi-Fi 配网两种模式。'
'此为 P0 第一阻塞项,须最先启动;控制部分(无需串口)可并行先行。'
)
rows = [
('W9', 'Hub系列 + 门控安防', '5', '用例脚本×5', '~125', '1人'),
('W10', 'AI产品 + Art Frame', '5', '用例脚本×5新UI框架', '~150', '1-2人'),
('W11', '机器人+联名款', '5', '用例脚本×5', '~125', '1-2人'),
('W12', '收尾+回归', '3+全量', '剩余设备+全量回归报告', '', '1人'),
]
add_table_with_header(doc,
['周次', '品类', '设备数', '输出内容', '用例数', '人力'],
rows
)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('里程碑:').bold = True
p.add_run(' 第12周末交付全部 82 款设备,单品功能覆盖率 100%')
doc.add_heading('W9 Hub + 门控安防', level=2)
doc.add_paragraph('• Hub 3: 设备管理列表、红外学习、Matter配对')
doc.add_paragraph('• AI Hub Show (带屏): 全新UI - 屏幕展示、语音交互')
doc.add_paragraph('• Garage Door Opener: 开关门状态、传感器绑定')
doc.add_paragraph('• Safety Alarm: 报警状态、音量设置')
doc.add_paragraph('• Radiator Thermostat: 温度设置、时间表')
doc.add_heading('W10 AI产品', level=2)
doc.add_paragraph('• Art Frame: 画框显示模式、图片管理、AI生图')
doc.add_paragraph('• AI Pet: 宠物互动、投食、AI识别')
doc.add_paragraph('• AI PinNote: 便签管理、AI助手')
doc.add_paragraph('• 难点: 全新UI框架无法复用已有模板需要从Figma/UX重新分析')
doc.add_heading('W11 机器人+联名', level=2)
doc.add_paragraph('• OBBOTO: 全新品类需确认UI')
doc.add_paragraph('• Robotic Actuator/Arm/Picker: 机械臂控制UI')
doc.add_paragraph('• KATA Friends: Bot复用 + 定制UI皮肤验证')
doc.add_heading('W12 收尾', level=2)
doc.add_paragraph('• 补充 FindCard、Outdoor PTC 等遗留设备')
doc.add_paragraph('• 全量回归执行,生成覆盖率报告')
doc.add_paragraph('• 修复回归中发现的失败用例')
doc.add_page_break()
# ======================== 7. Phase 4 - 添加+自动化 ========================
doc.add_heading('7. Phase 4: 设备添加 + 自动化场景W13-W16', level=1)
doc.add_heading('7.1 设备添加自动化', level=2)
doc.add_paragraph(
'设备添加流程需要硬件配合(串口控制设备进入配对模式),'
'分为 BLE 直连和 Wi-Fi 配网两种主要模式。'
)
doc.add_heading('前置条件', level=3)
rows = [
('串口命令协议文档', '统一所有设备"进入配对模式"的串口指令', '嵌入式+测试'),
('串口命令协议文档', '统一所有设备“进入配对模式”的串口指令', '嵌入式+测试'),
('串口控制模块', 'serial_controller.ts (基于 serialport库)', '测试'),
('添加流程通用框架', 'connect_base_helper.ts', '测试'),
('Wi-Fi 配网模块', 'wifi_connect_helper.ts', '测试'),
('硬件环境', 'USB Hub + USB转TTL × N', '测试'),
('硬件环境', 'USB Hub + USB转TTL × 5-10', '测试'),
]
add_table_with_header(doc, ['任务', '输出', '负责'], rows)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('框架一次性投入:').bold = True
p.add_run('serial_controller + connect_base_helper + wifi_connect_helper ≈ 1-1.5 人日纯代码serial 基于现成桌面 serialport 工具薄封装、add 流程复用现有 addDeviceViaBLE仅 wifi 配网 helper 需新写。硬件联调USB-TTL 接线/端口/时序)由嵌入式主导,为 wall-clock 不确定项,不计入纯人日。')
doc.add_paragraph(
'关键:添加流程 app 侧通用,逐设备差异仅为“开发版上进入配对模式的按键/串口指令”,由嵌入式提供的「设备→串口键」配置表驱动,逐设备近乎零编码。'
'app 侧只需按类别区分设置步骤BLE 直连 / Wi-Fi 配网 / 带屏 / 锁含校准),约 4-5 类,而非 73 份脚本。'
)
doc.add_heading('5.3 添加 backlog通用流程 + 配置表驱动)', level=2)
rows = [
('首验', 'BLE直连(Bot/Meter/Sensor) + Wi-Fi配网框架打通', '端到端 demo', '0.5'),
('BLE 直连类', '窗帘/传感器/风扇/遥控器/插座开关/灯 等', '设备→串口键配置 + 验证', '1'),
('Wi-Fi 配网类', 'Hub/摄像头/扫地机 等(额外配网步骤)', '配网流程 + 配置', '1.5'),
('带屏 / 锁类', 'AI Hub Show / Lock 系列(含校准)', '类别专属设置步骤', '1.5'),
]
add_table_with_header(doc, ['批次', '范围', '交付物', 'AI预估(人日)'], rows)
doc.add_paragraph('添加小计:约 4-6 人日(流程通用、按 4-5 类区分;逐设备仅配置串口键,成本主要在逐台硬件验证的 wall-clock非人日')
doc.add_heading('5.4 控制 backlog双协议105 step', level=2)
doc.add_paragraph('• 协议为运行模式PROTO=ble关WiFi/热点、开蓝牙)/ PROTO=wifi开WiFi/热点、关蓝牙),各跑一遍。')
doc.add_paragraph('• camera/robot/osc 仅 WiFiBot/Lock/Curtain/Meter 等两协议都覆盖。')
doc.add_paragraph('• 控制内容含开关/开锁/百分比/meter温湿度校正/camera出流3min/robot清扫暂停回充/Humidifier2绑温湿度计。')
doc.add_paragraph('• 结果按 [ONES:号#step][协议] 锚点 step 级回写 plan CQz9YCNX。')
doc.add_paragraph('控制小计:约 3-4 人日(大部分品类已有 _control 用例 → P0 主要是给既有断言打 [P0][#step][协议] 锚点 + 双协议切换 harness ~1 人日 + 补少量缺口;双协议第二遍仅切前置、增量低)。')
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('P0 合计:').bold = True
p.add_run('约 11-15 人日(串口框架~1-1.5 + 添加 4-6 + 控制 3-4 + 功能9条~3 + step回写工具~0.5)。控制大部分品类已有 _control 用例可复用,主要是打锚点 + 双协议 harness功能 9 条为 keypad 密码指纹/学习遥控/绑定手持等较复杂项;硬件联调由嵌入式主导,单列不计入。')
doc.add_page_break()
# ======================== 6. P1 单品探索 ========================
doc.add_heading('6. P1 单品探索(覆盖广度)', level=1)
doc.add_paragraph(
'必测项达标后,为全部 82 款单品各跑通一遍主流程冒烟,确保每款设备最低限度可用。'
'范围 = card首页卡片+ 核心 control开关/主模式),不含设置/场景/日志等深度回归。'
)
doc.add_paragraph('• 目标82 款单品各 1 套冒烟,广度优先、深度浅。')
doc.add_paragraph('• 复用必测项已建的 control helper单品只补 card 与主流程断言。')
doc.add_paragraph('• 退出标准每款单品冒烟用例通过card 可见 + 核心控制响应)。')
doc.add_paragraph('• 运行频率:每迭代跑一遍,作为单品级回归基线。')
doc.add_paragraph('• 人力预估AI 辅助):约 12-16 人日(建立在 P0 已建 control helper 之上82 款多为同品类复用,首台 ~0.3、复用台 ~0.1 人日/款)。')
doc.add_page_break()
# ======================== 7. P2 全功能 ========================
doc.add_heading('7. P2 全功能(深度回归)', level=1)
doc.add_paragraph(
'对每款单品做全维度回归card/control/setting/scene/logs。按品类批量推进'
'同品类 UI 高度相似,调通首台后改设备名配置快速扩展,并沉淀通用 helper。'
'不绑定周次,按复用度从高到低排批次。'
)
rows = [
('批1·高复用', '窗帘9 / 锁12 / 插座开关6 / 灯光10', '37', '脚本×37 + curtain/lock/relay/light helper', '~25'),
('批2·中复杂', '扫地机9 / 传感器温控7 / 风扇空净加湿6 / 摄像头门铃3', '25', '脚本×25 + robot/sensor/climate helper', '~27'),
('批3·新品特殊', 'Hub门控安防5 / AI产品5 / 机器人联名5', '15+', '脚本×15 + 全新UI框架', '~28'),
]
add_table_with_header(doc,
['批次', '品类', '设备数', '交付物', 'AI预估(人日)'],
rows,
col_widths=[2.3, 5, 1.3, 5, 2.2]
)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('覆盖目标:').bold = True
p.add_run('全部 82 款单品全维度回归,~2366 条用例,单品功能覆盖率 100%')
p = doc.add_paragraph()
p.add_run('P2 合计:').bold = True
p.add_run('约 75-90 人日(仅 card/control/setting 约 60-70含 scene/logs 约 75-90。约 50 款为“已有/复用”可低成本适配;真正“需新写”的新品 UI 约 30 款(扫地机新机/Lock Ultra·Vision/AI产品/机器人)需 Figma/UX 重新分析AI 辅助有限、为主要成本add/control 已被 P0/P1 覆盖可复用。')
doc.add_heading('添加设备排期', level=3)
doc.add_heading('7.1 高复用品类要点', level=2)
doc.add_paragraph('• 窗帘: 位置控制、校准流程、定时器、群组控制 → curtain_helper')
doc.add_paragraph('• 锁: 密码管理、开锁方式切换、自动锁定、电量监控 → lock_helper')
doc.add_paragraph('• 插座开关: 开关、定时器、功率/电量统计、过载保护 → relay_helper')
doc.add_paragraph('• 灯光: RGB颜色、亮度、模式切换、渐变 → light_helper')
doc.add_heading('7.2 中复杂品类要点', level=2)
doc.add_paragraph('• 扫地机: 地图管理/禁区/多楼层、清扫模式、自清洁基站(地图画布操作为难点)')
doc.add_paragraph('• 传感器+温控: 温湿度展示、历史图表、告警、灵敏度(图表验证需截图/文本提取)')
doc.add_paragraph('• 风扇+空净+加湿: 风速/模式/摇头/定时、空气质量/滤网、湿度目标/水箱')
doc.add_paragraph('• 摄像头+门铃: 出流/录像/事件、门铃呼叫/访客/对讲、OSC 复用')
doc.add_heading('7.3 新品+特殊要点', level=2)
doc.add_paragraph('• Hub 3 / AI Hub Show: 设备管理、红外学习、Matter、带屏交互')
doc.add_paragraph('• 门控安防: Garage Door、Safety Alarm、Radiator Thermostat')
doc.add_paragraph('• AI产品: Art Frame、AI Pet、AI PinNote全新UI需从Figma/UX重新分析')
doc.add_paragraph('• 机器人+联名: OBBOTO、Robotic Actuator/Arm/Picker、KATA FriendsBot复用+定制皮肤)')
doc.add_page_break()
# ======================== 8. P3 平台 ========================
doc.add_heading('8. P3 平台功能', level=1)
doc.add_paragraph(
'单品三层达标后,覆盖跨单品的平台级功能(必测项中约 12 条平台项 + 平台用例库)。'
)
doc.add_heading('8.1 平台功能范围', level=2)
rows = [
('W13', 'BLE直连类(Bot/Meter/Sensor)验证\n+ Wi-Fi配网框架', '3', '端到端demo验证'),
('W14', '窗帘/锁/灯光批量铺开', '31', 'connect脚本×31'),
('W15', '扫地机/传感器/风扇等', '22', 'connect脚本×22'),
('W16', 'AI产品/新品收尾 + 全量回归', '29', 'connect脚本×29 + 回归报告'),
('账号', '注册/登录/登出/忘记密码/第三方登录/欧区账号', '账号2.0'),
('家庭与房间', '创建房间、家庭分享3.0、家庭分组', '分享/分组用例库'),
('消息与商城', '消息中心3.0、商城、我的、小组件', '对应平台库'),
('其他', '覆盖安装、插件热更、第三方服务接入', 'App必测项平台模块'),
]
add_table_with_header(doc, ['周次', '任务', '设备数', '输出'], rows)
add_table_with_header(doc, ['模块', '内容', '来源'], rows)
doc.add_heading('7.2 自动化/场景联动测试', level=2)
doc.add_paragraph('自动化场景测试验证设备间联动的可靠性,覆盖以下维度:')
doc.add_heading('8.2 自动化/场景联动', level=2)
doc.add_paragraph('验证设备间联动可靠性(复用已有 automation 脚本基础)')
doc.add_paragraph('• 创建自动化:手动/条件触发/定时触发')
doc.add_paragraph('• 执行验证:触发条件满足后动作执行')
doc.add_paragraph('• 编辑/删除:修改条件或动作、删除自动化')
doc.add_paragraph('• 多设备联动A设备触发 → B设备执行')
doc.add_paragraph('• 异常处理:设备离线时的自动化表现')
rows = [
('W15', '通用自动化创建/编辑/删除', '已有automation脚本基础', '~20'),
('W15', '条件触发(传感器→设备)', '温湿度/人体感应触发', '~15'),
('W16', '定时触发 + 多设备联动', '场景组合执行', '~15'),
('W16', '异常场景', '离线/超时/冲突', '~10'),
]
add_table_with_header(doc, ['周次', '测试内容', '说明', '用例数'], rows)
doc.add_page_break()
# ======================== 8. 资源需求 ========================
doc.add_heading('8. 资源需求汇总', level=1)
doc.add_heading('9. 资源需求汇总', level=1)
doc.add_heading('8.1 人力', level=2)
doc.add_heading('9.1 人力与分工', level=2)
rows = [
('自动化测试工程师', '1-2人', '全职,全程'),
('嵌入式工程师(配合)', '0.5人', '前2周提供串口协议后续按需'),
('AI辅助 (Claude Code)', '', '脚本生成+调试,贯穿全程'),
('自动化测试工程师', '1人', '全职、全程,承担全部脚本编写与调试'),
('嵌入式工程师(配合)', '按需', '提供串口协议与配对框架支持P0 添加阻塞项),最优先'),
('AI辅助 (Claude Code)', '', '边跑边写生成+调试脚本,贯穿全程提效'),
]
add_table_with_header(doc, ['角色', '人数', '说明'], rows)
doc.add_heading('8.2 硬件设备', level=2)
doc.add_paragraph()
doc.add_paragraph(
'人力安排:仅 1 名自动化工程师四层按优先级串行推进AI 辅助提效。'
'P0 内部拆两条轨——「控制轨」不依赖串口可先行,「添加轨」待嵌入式串口框架就绪后插入,两轨由同一人分时推进。'
)
rows = [
('P0 · 控制轨', '自动化(1人)', '', '先行:双协议控制 105 step不待串口'),
('P0 · 添加轨', '自动化(1人)', '嵌入式(串口协议+框架)', '串口就绪后插入73 添加 + 9 功能'),
('P1 单品探索', '自动化(1人)', '', 'P0 达标后82 款冒烟'),
('P2 全功能', '自动化(1人)', '', '按品类批量,复用 helper'),
('P3 平台', '自动化(1人)', '', '最后:平台功能 + 场景联动'),
]
add_table_with_header(doc,
['优先级层', '主负责', '配合', '安排说明'],
rows,
col_widths=[2.5, 2.5, 3.5, 6]
)
doc.add_heading('9.2 硬件设备', level=2)
doc.add_paragraph('每品类至少需要1台实体设备用于调试和验证')
rows = [
('Phase 1', '窗帘×1, 锁×2, 插座×1, 开关×1, 灯×3', 'W1前到位'),
('Phase 2', '扫地机×2, 传感器×3, 风扇×1, 空净×1, 加湿器×1, 门铃×1', 'W5前到位'),
('Phase 3', 'Hub 3, AI Hub Show, Art Frame, AI Pet等', 'W9前到位'),
('Phase 4', 'USB Hub, USB转TTL×5-10, 开发版设备', 'W13前到位'),
('P0 串口硬件', 'USB Hub + USB转TTL×5-10、开发版设备', '最先到位(添加为关键路径)'),
('P0/P1 必测+冒烟', '必测涉及的各品类代表设备各1台', '随 P0 启动'),
('P2 高复用', '窗帘×1, 锁×2, 插座×1, 开关×1, 灯×3', '全功能批1前到位'),
('P2 中复杂', '扫地机×2, 传感器×3, 风扇×1, 空净×1, 加湿器×1, 门铃×1', '全功能批2前到位'),
('P2 新品特殊', 'Hub 3, AI Hub Show, Art Frame, AI Pet等', '全功能批3前到位'),
]
add_table_with_header(doc, ['阶段', '设备需求', '到位时间'], rows)
add_table_with_header(doc, ['用途', '设备需求', '到位时间'], rows)
doc.add_heading('8.3 环境', level=2)
doc.add_heading('9.3 环境', level=2)
rows = [
('测试手机', 'Samsung (Android) + iPhone (iOS)', '已有'),
('Appium Server', 'v2.x + UIAutomator2', '已有'),
@ -482,84 +484,86 @@ add_table_with_header(doc, ['项目', '说明', '状态'], rows)
doc.add_page_break()
# ======================== 9. 总体排期表 ========================
doc.add_heading('9. 总体排期一览', level=1)
# ======================== 10. 优先级 backlog 一览 ========================
doc.add_heading('10. 优先级 backlog 一览', level=1)
rows = [
('W1', 'Phase 1', '窗帘系列', '9', '~225', '脚本×9 + curtain_helper'),
('W2', 'Phase 1', '锁系列', '12', '~360', '脚本×12 + lock_helper'),
('W3', 'Phase 1', '插座+开关', '6', '~150', '脚本×6 + relay_helper'),
('W4', 'Phase 1', '灯光系列', '10', '~250', '脚本×10 + light_helper'),
('W5', 'Phase 2', '扫地机', '9', '~270', '脚本×9 + robot_helper增强'),
('W6', 'Phase 2', '传感器+温控', '7', '~175', '脚本×7 + sensor_helper'),
('W7', 'Phase 2', '风扇+空净+加湿', '6', '~150', '脚本×6 + climate_helper'),
('W8', 'Phase 2', '摄像头+门铃', '3', '~90', '脚本×3'),
('W9', 'Phase 3', 'Hub+门控安防', '5', '~125', '脚本×5'),
('W10', 'Phase 3', 'AI产品', '5', '~150', '脚本×5 (全新)'),
('W11', 'Phase 3', '机器人+联名', '5', '~125', '脚本×5'),
('W12', 'Phase 3', '收尾+回归', '3+', '', '全量回归报告'),
('W13', 'Phase 4', '添加框架+首批验证', '3', '~15', 'serial_controller + demo'),
('W14', 'Phase 4', '批量添加(窗帘/锁/灯)', '31', '~93', 'connect脚本×31'),
('W15', 'Phase 4', '续批添加+自动化场景', '22', '~101', 'connect×22 + scene×35'),
('W16', 'Phase 4', '收尾+全量回归', '29+', '~87', 'connect×29 + 最终报告'),
('P0 必测项', '添加73 + 功能9 + 控制105step(双协议)', '187条', '~11-15', 'serial框架 + connect + 控制断言 + step回写', '通过率≥95%'),
('P1 单品探索', '82款单品主流程冒烟(card+核心control)', '82款×1', '~12-16', '每单品冒烟用例', '全单品冒烟通过'),
('P2 全功能', '全维度回归,按品类批量(高复用→新品)', '~2366条', '~75-90', '85+脚本 + 8个通用helper', '通过率≥85%、覆盖100%'),
('P3 平台', '账号/房间/消息/家庭分享/场景等', '平台模块', '~12-15', '平台用例 + 场景联动', '平台用例通过'),
]
add_table_with_header(doc,
['周次', '阶段', '品类/任务', '设备数', '用例数', '交付物'],
['优先级', '范围', '用例量', 'AI预估(人日)', '交付物', '退出标准'],
rows,
col_widths=[1.5, 2, 4, 1.5, 1.5, 5]
col_widths=[2, 4.3, 1.5, 2, 4.2, 2.5]
)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('总计:').bold = True
p.add_run('16周 | 82款设备 | ~2366条用例 | 85+脚本文件 + 8个通用helper')
p.add_run('人力总计AI 辅助口径):').bold = True
p.add_run('约 105-135 人日 ≈ 5-7 人月1 人,按 20 人日/月。P0 大幅复用既有 control、串口硬件联调由嵌入式主导不计入P2 “需新写”新品 UI 占比最高、最不可压缩。')
doc.add_paragraph(
'人力构成说明:以上为 AI 辅助口径(较手工已下调约 2-3 倍)。其中“脚本编写”仅占约 1/3——AI 提效主要在此;'
'其余约 2/3 是真机调试元素核对、加载等待、flaky 复跑)、设备/硬件配置与新品 UI 分析,受真机往返与 UI 稳定性约束AI 难以进一步压缩。'
'项目使用 MidsceneAI 元素定位)已减少传统选择器维护成本,故未再按“零调试”乐观值估算。'
'若需再压缩周期,杠杆在于:多台真机并行、收窄 P2 范围(只保高频设备)、放宽 flaky 容忍度,而非提高编写速度。'
)
doc.add_paragraph()
p = doc.add_paragraph()
p.add_run('说明:').bold = True
p.add_run('按优先级依次交付高层达标后投入下一层不绑定固定周次。P0 控制部分可不待串口先行,添加随串口框架就绪推进。')
doc.add_page_break()
# ======================== 10. 质量标准 ========================
doc.add_heading('10. 质量标准与验收', level=1)
doc.add_heading('11. 质量标准与验收', level=1)
doc.add_heading('10.1 单设备验收标准', level=2)
doc.add_heading('11.1 单设备验收标准', level=2)
doc.add_paragraph('• 核心用例通过率 ≥ 85%(首轮调试)')
doc.add_paragraph('• 单次全量执行时间 < 10分钟/设备')
doc.add_paragraph('• 用例覆盖card + control + setting 三个维度必须覆盖')
doc.add_paragraph('• 脚本可在 Android/iOS 双平台运行(通过平台适配层)')
doc.add_heading('10.2 阶段验收标准', level=2)
doc.add_heading('11.2 优先级层验收标准', level=2)
rows = [
('Phase 1 (W4末)', '37款设备调通通过率≥85%', '覆盖率45%'),
('Phase 2 (W8末)', '累计62款设备通过率≥80%', '覆盖率76%'),
('Phase 3 (W12末)', '全部82款单品覆盖', '覆盖率100%'),
('Phase 4 (W16末)', '添加流程+自动化场景', '全流程覆盖'),
('P0 必测项', '187条全部实现并跑通添加+控制双协议)', '通过率≥95%,作为提测门禁'),
('P1 单品探索', '82款单品冒烟全部通过', '广度100%覆盖'),
('P2 全功能', '全维度回归通过率≥85%', '单品功能覆盖率100%'),
('P3 平台', '平台功能 + 场景联动通过', '全流程覆盖'),
]
add_table_with_header(doc, ['阶段', '验收标准', '覆盖目标'], rows)
add_table_with_header(doc, ['优先级', '验收标准', '覆盖目标'], rows)
doc.add_heading('10.3 回归策略', level=2)
doc.add_paragraph('• 每周五执行当周完成设备的全量回归')
doc.add_paragraph('• 每Phase末执行累计设备的全量回归')
doc.add_paragraph('• App版本更新后执行 smoke test所有设备card验证')
doc.add_heading('11.3 回归策略', level=2)
doc.add_paragraph('• P0 必测项:每次提测/版本更新必跑(双协议),作为准入门禁')
doc.add_paragraph('• P1 单品探索:每迭代执行一遍全单品冒烟')
doc.add_paragraph('• P2 全功能:版本回归执行累计设备全量')
doc.add_paragraph('• P3 平台:版本回归执行平台功能与场景联动')
doc.add_page_break()
# ======================== 11. 风险与依赖 ========================
doc.add_heading('11. 风险与依赖', level=1)
doc.add_heading('12. 风险与依赖', level=1)
doc.add_heading('11.1 关键依赖', level=2)
doc.add_heading('12.1 关键依赖', level=2)
rows = [
('实体设备到位', '', '无设备无法调试', '提前一个Phase准备'),
('串口/添加为关键路径(前移)', '', '硬件或协议不就绪将阻塞 P0 整体', '控制部分(无需串口)先行,串口框架并行启动'),
('实体设备到位', '', '无设备无法调试', 'P0 涉及的代表设备最先准备'),
('嵌入式串口协议', '', '直接影响 P0 添加', '最优先启动协议定义'),
('同品类UI一致性', '', 'UI差异大则无法复用', '差异设备单独排期'),
('新品UI稳定', '', 'UI仍在迭代会导致返工', '等UI冻结后再开始'),
('嵌入式串口协议', '', '影响添加设备Phase', '提前2周启动协议定义'),
('新品UI稳定', '', 'UI仍在迭代会导致返工', '等UI冻结后再开始(主要影响P2新品)'),
('App版本稳定', '', '频繁改版影响脚本维护', '锁定测试版本'),
]
add_table_with_header(doc, ['依赖项', '风险等级', '影响', '缓解措施'], rows)
doc.add_heading('11.2 待讨论问题', level=2)
doc.add_paragraph('1. 已下市产品Hub Plus、老灯带、加湿器1等是否需要覆盖')
doc.add_paragraph('2. 同一设备的不同区域版本JP/US/EUUI差异程度如何是否需要逐个调试')
doc.add_paragraph('3. AI Hub Show 的UI是否已稳定是否可以W9开始')
doc.add_paragraph('4. 设备添加流程的串口开发版是否可用?时间线')
doc.add_paragraph('5. CI/CD 持续集成环境是否需要在Phase 1之前搭建?')
doc.add_heading('12.2 待讨论问题', level=2)
doc.add_paragraph('1. 设备添加的串口开发版/协议时间线?(决定 P0 添加何时能启动)')
doc.add_paragraph('2. 必测项控制双协议环境切换开关WiFi/蓝牙)能否用 adb/串口自动化,还是需人工配合')
doc.add_paragraph('3. 已下市产品Hub Plus、老灯带、加湿器1等是否纳入 P2 全功能')
doc.add_paragraph('4. 同一设备的不同区域版本JP/US/EUUI差异程度是否需逐个调试')
doc.add_paragraph('5. CI/CD 持续集成环境是否需要在 P0 之前搭建?')
# ======================== 保存 ========================
output_path = '/Users/woan/Desktop/AI_UIAutomation/docs/UI自动化测试计划.docx'

View File

@ -10,7 +10,8 @@
"test:setting": "vitest run tests/bot/bot_setting.test.ts",
"test:card": "vitest run tests/bot/bot_card.test.ts",
"test:logs": "vitest run tests/bot/bot_logs.test.ts",
"test:scene": "vitest run tests/bot/bot_scene.test.ts"
"test:scene": "vitest run tests/bot/bot_scene.test.ts",
"gen:must-test": "ts-node scripts/gen-must-test-manifest.ts"
},
"keywords": [
"ui-automation",

View File

@ -16,6 +16,10 @@
触发条件:任务涉及 ONES 测试计划 `必测项-AI自动化`(plan `CQz9YCNX`) / 用例库 `App 必测项`(lib `EPfZfC9Y`),或用户提到「必测项 / 添加+控制必测 / 双协议控制」。
该子提示词覆盖:必测项的两种结构(添加按单品、控制为 2 条协议超级用例的 step 级)、品类→目录映射、`must-test.manifest.ts`、`[P0][ONES:号#step]` 标记、双协议运行模式、step 级回写。
- **按测试计划转换(优先级驱动)** → 同时加载 `prompts/test_plan_conversion.md`
触发条件:任务涉及整体测试计划推进、按优先级(必测项→单品探索→全功能→平台)排期转换,或用户提到「测试计划 / 按计划转换 / P0-P3 优先级」。
该总纲规定四层优先级的顺序、各层来源/落点/退出标准/AI人力预估,并在 P0 处委托给 `must_test_conversion.md`。计划全文见 `docs/UI自动化测试计划.docx`
---
## 项目技术栈

View File

@ -0,0 +1,72 @@
# 测试计划 → 自动化 转换提示词(执行总纲)
> **配合主提示词使用**。本文件是「按测试计划驱动转换」的执行总纲:规定**做什么、按什么优先级做、每层做到什么程度**。
> 通用机制(技术栈/DeviceDriver/脚本模板/元素发现/边跑边写/截图/报告)遵循 `prompts/ones_to_automation.md`;
> 必测项(P0)的专项细节遵循 `prompts/must_test_conversion.md`。三者叠加使用。
> 计划全文见 `docs/UI自动化测试计划.docx`(由 `docs/generate_test_plan.py` 生成)。
---
## 0. 核心原则
- **优先级驱动,不绑定周次**:严格按 P0 → P1 → P2 → P3 顺序推进,**高优先级层达到退出标准后再投入下一层**。
- **必测是闸门**:P0 是提测/版本准入门禁,任何版本变更优先保 P0 绿。
- **AI 边跑边写**:首台建模、同品类复用台仅改配置;人力预估按 AI 辅助口径(单维度首台 0.2-1 人日、复用台 0.1-0.3 人日)。
- **实际人力 1 人**:四层串行;P0 内「控制轨(不依赖串口)」可先行,「添加轨」待嵌入式串口框架就绪后插入。
---
## 1. 四层优先级总览
| 层 | 范围 | 来源 | 落点(目录/维度) | 退出标准 | AI预估 |
|---|---|---|---|---|---|
| **P0 必测项** | 各单品添加 + 核心控制(双协议) | ONES plan `CQz9YCNX` / `must-test.manifest.ts` | `{device}_connect` / `{device}_control` | 通过率≥95%(门禁) | ~40-48 人日 |
| **P1 单品探索** | 82 款主流程冒烟(card+核心control) | 单品模板 | `{device}_card` + 核心 control | 全单品冒烟通过 | ~25 人日 |
| **P2 全功能** | 全维度回归(card/control/setting/scene/logs) | 各品类 ONES 用例库 | 全维度文件,按品类批量 | 通过率≥85%、覆盖100% | ~100 人日 |
| **P3 平台** | 账号/房间/消息/家庭分享/场景等 | App 平台用例库 | `tests/automation/` 等平台 | 平台用例通过 | ~12 人日 |
---
## 2. 逐层执行指引
### P0 必测项(最高优先,先做)
- **完全遵循 `prompts/must_test_conversion.md`**:用 `test-plan/must-test.manifest.ts` 作为清单(187 条 = 添加73 + 功能9 + 控制105step)。
- **先控制轨**(不依赖串口):双协议 105 step,落到各 `{device}_control.test.ts`,打 `[P0][ONES:号#step][协议]` 标记。
- **后添加轨**(待串口框架):serial_controller / connect_base_helper / wifi_connect_helper 就绪后,73 条添加落到 `{device}_connect.test.ts`
- 结果按锚点 step 级回写 ONES plan `CQz9YCNX`。**P0 不达 95% 不进入 P1。**
### P1 单品探索
- 为全部 82 款单品各写一套**主流程冒烟**:`card`(首页卡片可见)+ 核心 `control`(开关/主模式响应)。
- **复用 P0 已建的 control helper**,单品只补 card 与主流程断言。广度优先、深度浅。
- 退出:每款单品冒烟通过。
### P2 全功能
- 全维度回归。**按品类批量**(高复用→中复杂→新品):同品类调通首台后改设备名配置扩展,沉淀 `*_helper`
- 来源 = 对应品类 ONES 用例库(非必测项库);按主提示词「读取用例来源」流程拉取转换。
- 维度:card/control/setting/scene/logs(logs 可选)。新品 UI 需从 Figma/UX 重新分析(见 [[reference-figma-designs]]、[[feedback-ux-coordinate-workflow]])。
### P3 平台
- 跨单品平台功能:账号(注册/登录/登出/忘记密码/第三方)、房间/家庭分享3.0/分组、消息中心3.0、商城、我的、小组件、场景3.0联动。
- 含必测项里 ~12 条平台项 + App 平台用例库。落到 `tests/automation/` 等平台测试。
---
## 3. 每层通用工作流
1. **选层**:确认当前应做的最高未完成层(P0→P3)。
2. **拉用例**:P0 用 manifest;P2/P3 用 ONES CLI 从对应品类/平台用例库读取(主提示词「读取用例来源」)。
3. **边跑边写**:首轮生成→运行→按真实页面源码修元素/坐标,直到通过(主提示词「迭代调试流程」)。
4. **回写 ONES**:P0 按 step 锚点(must_test_conversion §9);其余按用例名匹配(主提示词「ONES 测试计划集成」/ `utils/ones-sync.ts`)。
5. **核对退出标准**:达标才进入下一层;记录 AI 实际工时,校准预估。
---
## 4. 调整计划
计划是生成产物。如需改优先级/范围/人力预估,改 `docs/generate_test_plan.py``python3 docs/generate_test_plan.py` 重新生成 docx,不手改 docx。
---
## 相关
主提示词 `prompts/ones_to_automation.md` · 必测项 `prompts/must_test_conversion.md` ·
[[project-must-test-ones-source]] · [[project-maestro-conversion]] · [[feedback-test-case-reuse]] · [[feedback-manual-navigation]]

View File

@ -0,0 +1,269 @@
/**
* manifest
*
* ONES -AI自动化(plan CQz9YCNX / lib EPfZfC9Y)
* test-plan/must-test.manifest.ts ONES step
*
* :
* - add : 每单品一条X验证case ( ones )
* - feature : 品类模块内 (//keypad密码等)
* - ctrl : 两条协议超级用例的每个 step ( ones#step_uuid proto)
*
* :
* npx ts-node scripts/gen-must-test-manifest.ts [--plan CQz9YCNX] [--out test-plan/must-test.manifest.ts] [--dry-run]
*
* prompts/must_test_conversion.md
*/
import { execSync } from 'child_process';
import * as fs from 'fs';
import * as path from 'path';
import { DEVICE_CONFIG } from '../config/device.config';
import { fetchPlanCases } from '../utils/ones-sync';
const ONES_CLI = '/Users/woan/local/bin/ones';
const LIB_UUID = 'EPfZfC9Y'; // App 必测项
const DEFAULT_PLAN = 'CQz9YCNX'; // 必测项-AI自动化
// 控制超级用例: 用例号 -> 协议
const CTRL_CASES: { number: number; proto: 'ble' | 'wifi' }[] = [
{ number: 15975, proto: 'ble' }, // 蓝牙控制设备 (关WiFi/热点、开蓝牙)
{ number: 15974, proto: 'wifi' }, // WiFi控制设备 (开WiFi/热点、关蓝牙)
];
// 单品 add/feature 所在的品类模块 (module_uuid)
const CATEGORY_MODULES = new Set([
'Q77TzNjH', // 摄像头类
'JdPYj5r7', // 灯类&WiFi
'HqxErR84', // 蓝牙类
'TPe3ZhZG', // 开关类
'BDBbZz8f', // URC HUB
'Qmd8bwnW', // 温湿度&hub类
'BpA3ATUg', // Lock类
'Yb6hgZ9T', // 扫地机类
]);
// 关键字 -> 品类(= 测试目录名, snake_case)。按最长命中优先匹配。
const KEYWORD_TO_CATEGORY: [string, string][] = [
['relay switch', 'plug'], ['garage', 'plug'], ['plug mini', 'plug'], ['plugmini', 'plug'], ['eu plug', 'plug'], ['plug', 'plug'],
['smart radiator', 'meter'], ['暖气阀', 'meter'], ['climate panel', 'meter'], ['温湿度', 'meter'], ['meter', 'meter'],
['iosensor', 'sensor'], ['io sensor', 'sensor'], ['motion sensor', 'sensor'], ['contact sensor', 'sensor'], ['人体存在', 'sensor'], ['presence', 'sensor'],
['lock pro', 'lock'], ['lock lite', 'lock'], ['lock ultra', 'lock'], ['lock', 'lock'], ['keypad', 'keypad'],
['blindtil', 'curtain'], ['blind tilt', 'curtain'], ['roller shade', 'curtain'], ['curtain', 'curtain'],
['humidifier', 'humidifier'], ['加湿', 'humidifier'], ['空气净化', 'air_condition'],
['吸顶灯', 'ceiling_light'], ['ceiling', 'ceiling_light'], ['floor lamp', 'ceiling_light'], ['落地灯', 'ceiling_light'], ['candle', 'ceiling_light'], ['融蜡', 'ceiling_light'],
['strip light', 'strip_light'], ['灯带', 'strip_light'], ['霓虹', 'strip_light'], ['neon', 'strip_light'], ['color bulb', 'color_bulb'], ['bulb', 'color_bulb'],
['circulator fan', 'fan'], ['standing circulator', 'fan'], ['落地扇', 'fan'], ['循环扇', 'fan'], ['fan', 'fan'],
['indoor cam', 'camera'], ['pan/tilt', 'camera'], ['ptc', 'camera'], ['doorbell', 'camera'], ['osc', 'osc'], ['cam', 'camera'],
['robot vacuum', 'robot'], ['k10', 'robot'], ['k11', 'robot'], ['s10', 'robot'], ['s20', 'robot'], ['s1', 'robot'], ['扫地机', 'robot'],
['hub mini matter', 'hub'], ['hub mini', 'hub'], ['hub2', 'hub'], ['hub plus', 'hub'], ['hub', 'hub'],
['urc', 'urc'], ['遥控器', 'remote'], ['remote', 'remote'], ['bot', 'bot'],
['safety alarm', 'safety_alarm'],
];
// 品类目录(snake) -> device.config 的 key(camelCase)。未列出者两者相同。
const CAT_TO_CONFIG_KEY: Record<string, string> = {
ceiling_light: 'ceilingLight',
strip_light: 'stripLight',
color_bulb: 'colorBulb',
air_condition: 'airCondition',
};
function classify(text: string): string | null {
const t = text.toLowerCase();
let best: string | null = null;
let bestLen = -1;
for (const [kw, cat] of KEYWORD_TO_CATEGORY) {
if (t.includes(kw) && kw.length > bestLen) {
best = cat;
bestLen = kw.length;
}
}
return best;
}
function deviceFor(cat: string): string {
const key = CAT_TO_CONFIG_KEY[cat] || cat;
return DEVICE_CONFIG[key]?.defaultDevice || '';
}
function folderExists(cat: string): boolean {
return fs.existsSync(path.resolve(__dirname, '..', 'tests', cat));
}
function runOnes(args: string): any {
const output = execSync(`${ONES_CLI} ${args}`, { encoding: 'utf-8', timeout: 30000 });
return JSON.parse(output);
}
// 短描述: 去前缀符号、压空白、截断,用于 testName
function shortDesc(s: string): string {
return s.replace(/\s+/g, ' ').replace(/^[-—\s]+/, '').trim().slice(0, 24);
}
interface AddRow {
kind: 'add' | 'feature';
ones: number;
name: string;
cat: string;
device: string;
file: string;
testName: string;
status: 'todo' | 'na';
}
interface CtrlRow {
kind: 'ctrl';
ones: number;
step: string;
proto: 'ble' | 'wifi';
name: string;
result: string;
cat: string;
device: string;
action: string;
file: string;
testName: string;
status: 'todo' | 'na';
}
type Row = AddRow | CtrlRow;
function main() {
const argv = process.argv.slice(2);
const plan = argVal(argv, '--plan') || DEFAULT_PLAN;
const out = argVal(argv, '--out') || 'test-plan/must-test.manifest.ts';
const dryRun = argv.includes('--dry-run');
console.log(`[gen] 计划成员校验 plan=${plan} ...`);
const planNums = new Set(fetchPlanCases(plan).map((c) => c.caseNumber));
console.log(`[gen] 读取用例库 ${LIB_UUID} ...`);
const libCases: any[] = runOnes(`testcase case list ${LIB_UUID}`).cases || [];
const rows: Row[] = [];
const na: string[] = [];
// 1) add / feature: 品类模块内、在计划内的 case
for (const c of libCases) {
if (!CATEGORY_MODULES.has(c.module_uuid)) continue;
if (!planNums.has(c.number)) continue;
const kind: 'add' | 'feature' = c.name.startsWith('添加') ? 'add' : 'feature';
const cat = classify(c.name);
if (!cat || !folderExists(cat)) {
na.push(`${kind} ONES:${c.number} ${c.name} [${cat || '未识别品类'}${cat && !folderExists(cat) ? '无测试目录' : ''}]`);
rows.push({ kind, ones: c.number, name: c.name, cat: cat || '', device: cat ? deviceFor(cat) : '', file: '', testName: '', status: 'na' });
continue;
}
const suffix = kind === 'add' ? 'connect' : 'control';
const device = deviceFor(cat);
rows.push({
kind,
ones: c.number,
name: c.name,
cat,
device,
file: `tests/${cat}/${cat}_${suffix}.test.ts`,
testName: `[P0][ONES:${c.number}] ${c.name}`,
status: 'todo',
});
}
// 2) ctrl: 两条协议超级用例的每个 step
for (const { number, proto } of CTRL_CASES) {
const found = runOnes(`testcase case search --key ${number}`).cases || [];
const steps: any[] = found[0]?.steps || [];
for (const s of steps) {
const cat = classify(s.desc || '');
if (!cat || !folderExists(cat)) {
na.push(`ctrl[${proto}] ONES:${number}#${s.uuid} ${shortDesc(s.desc || '')} [${cat || '未识别品类'}${cat && !folderExists(cat) ? '无测试目录' : ''}]`);
rows.push({ kind: 'ctrl', ones: number, step: s.uuid, proto, name: s.desc || '', result: s.result || '', cat: cat || '', device: cat ? deviceFor(cat) : '', action: '', file: '', testName: '', status: 'na' });
continue;
}
const device = deviceFor(cat);
rows.push({
kind: 'ctrl',
ones: number,
step: s.uuid,
proto,
name: s.desc || '',
result: s.result || '',
cat,
device,
action: shortDesc(s.desc || ''),
file: `tests/${cat}/${cat}_control.test.ts`,
testName: `[P0][ONES:${number}#${s.uuid}][${proto}] ${shortDesc(s.desc || '')} ${device}`.trim(),
status: 'todo',
});
}
}
printSummary(rows, na, plan);
if (dryRun) {
console.log('\n[gen] --dry-run: 未写文件');
return;
}
const outPath = path.resolve(__dirname, '..', out);
fs.mkdirSync(path.dirname(outPath), { recursive: true });
fs.writeFileSync(outPath, renderManifest(rows, plan), 'utf-8');
console.log(`\n[gen] 已生成 ${out} (${rows.length} 条)`);
}
function argVal(argv: string[], flag: string): string | undefined {
const i = argv.indexOf(flag);
return i >= 0 ? argv[i + 1] : undefined;
}
function printSummary(rows: Row[], na: string[], plan: string) {
const by = (k: string) => rows.filter((r) => r.kind === k);
const add = by('add'), feat = by('feature'), ctrl = by('ctrl') as CtrlRow[];
console.log(`\n=== 必测项覆盖摘要 (plan ${plan}) ===`);
console.log(`add(添加) : ${add.length}`);
console.log(`feature(功能): ${feat.length}`);
console.log(`ctrl(控制step): ${ctrl.length} (ble ${ctrl.filter((r) => r.proto === 'ble').length} / wifi ${ctrl.filter((r) => r.proto === 'wifi').length})`);
const catCount: Record<string, number> = {};
for (const r of rows) catCount[r.cat || '∅'] = (catCount[r.cat || '∅'] || 0) + 1;
console.log('按品类:', JSON.stringify(catCount));
console.log(`\n=== 未落地 (na, ${na.length}) —— 需人工补关键字/目录或归平台 ===`);
na.forEach((n) => console.log(' ! ' + n));
}
function renderManifest(rows: Row[], plan: string): string {
const header = `// AUTO-GENERATED by scripts/gen-must-test-manifest.ts — do not edit by hand.
// 源: ONES plan ${plan} / lib ${LIB_UUID} (必测项-AI自动化)。重新生成: npm run gen:must-test
// 详见 prompts/must_test_conversion.md
export type MustTestItem =
| {
kind: 'add' | 'feature';
ones: number;
name: string;
cat: string;
device: string;
file: string;
testName: string;
status: 'todo' | 'na' | 'done';
}
| {
kind: 'ctrl';
ones: number;
step: string;
proto: 'ble' | 'wifi';
name: string;
result: string;
cat: string;
device: string;
action: string;
file: string;
testName: string;
status: 'todo' | 'na' | 'done';
};
export const MUST_TEST: MustTestItem[] = [
`;
const body = rows
.map((r) => ' ' + JSON.stringify(r) + ',')
.join('\n');
return header + body + '\n];\n';
}
main();

View File

@ -0,0 +1,219 @@
// AUTO-GENERATED by scripts/gen-must-test-manifest.ts — do not edit by hand.
// 源: ONES plan CQz9YCNX / lib EPfZfC9Y (必测项-AI自动化)。重新生成: npm run gen:must-test
// 详见 prompts/must_test_conversion.md
export type MustTestItem =
| {
kind: 'add' | 'feature';
ones: number;
name: string;
cat: string;
device: string;
file: string;
testName: string;
status: 'todo' | 'na' | 'done';
}
| {
kind: 'ctrl';
ones: number;
step: string;
proto: 'ble' | 'wifi';
name: string;
result: string;
cat: string;
device: string;
action: string;
file: string;
testName: string;
status: 'todo' | 'na' | 'done';
};
export const MUST_TEST: MustTestItem[] = [
{"kind":"add","ones":393236,"name":"添加Candle lamp融蜡灯验证融蜡灯需要插110V电压","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:393236] 添加Candle lamp融蜡灯验证融蜡灯需要插110V电压","status":"todo"},
{"kind":"add","ones":393235,"name":"添加RGBIC Neon Rope Light炫彩霓虹灯验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:393235] 添加RGBIC Neon Rope Light炫彩霓虹灯验证","status":"todo"},
{"kind":"add","ones":393234,"name":"添加Standing Circulator fan验证","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:393234] 添加Standing Circulator fan验证","status":"todo"},
{"kind":"add","ones":332919,"name":"添加safety alarm","cat":"safety_alarm","device":"","file":"","testName":"","status":"na"},
{"kind":"add","ones":332918,"name":"添加eu plug","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:332918] 添加eu plug","status":"todo"},
{"kind":"add","ones":332917,"name":"添加人体存在传感器","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:332917] 添加人体存在传感器","status":"todo"},
{"kind":"add","ones":319305,"name":"添加Hub Mini S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319305] 添加Hub Mini S3验证","status":"todo"},
{"kind":"add","ones":319304,"name":"添加Hub2 S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319304] 添加Hub2 S3验证","status":"todo"},
{"kind":"add","ones":319303,"name":"添加Hub Mini Matter S3验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:319303] 添加Hub Mini Matter S3验证","status":"todo"},
{"kind":"add","ones":311020,"name":"添加RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:311020] 添加RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯验证","status":"todo"},
{"kind":"add","ones":311019,"name":"添加RGBICWW Floor Lamp炫彩落地灯验证","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:311019] 添加RGBICWW Floor Lamp炫彩落地灯验证","status":"todo"},
{"kind":"add","ones":311018,"name":"添加RGBICWW Strip Light炫彩灯带 验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:311018] 添加RGBICWW Strip Light炫彩灯带 验证","status":"todo"},
{"kind":"add","ones":310704,"name":"添加暖气阀Smart Radiator Thermostat验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:310704] 添加暖气阀Smart Radiator Thermostat验证","status":"todo"},
{"kind":"add","ones":310703,"name":"添加Climate Panel验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:310703] 添加Climate Panel验证","status":"todo"},
{"kind":"add","ones":304133,"name":"添加Lock Pro WiFi验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304133] 添加Lock Pro WiFi验证","status":"todo"},
{"kind":"add","ones":304132,"name":"添加Lock Lite验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304132] 添加Lock Lite验证","status":"todo"},
{"kind":"add","ones":304131,"name":"添加Keypad Vision验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:304131] 添加Keypad Vision验证","status":"todo"},
{"kind":"add","ones":304130,"name":"添加Lock Ultra验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:304130] 添加Lock Ultra验证","status":"todo"},
{"kind":"add","ones":302289,"name":"添加Garage Door Opener验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:302289] 添加Garage Door Opener验证","status":"todo"},
{"kind":"add","ones":302288,"name":"添加Relay Switch验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:302288] 添加Relay Switch验证","status":"todo"},
{"kind":"add","ones":301586,"name":"添加RGBWW Floor Lamp (落地灯)验证","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:301586] 添加RGBWW Floor Lamp (落地灯)验证","status":"todo"},
{"kind":"add","ones":301585,"name":"添加RGBWW Strip light3(彩色灯带3 验证 ","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:301585] 添加RGBWW Strip light3(彩色灯带3 验证 ","status":"todo"},
{"kind":"add","ones":273787,"name":"添加K11+扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:273787] 添加K11+扫地机","status":"todo"},
{"kind":"add","ones":267367,"name":"添加Meter pro验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:267367] 添加Meter pro验证","status":"todo"},
{"kind":"add","ones":267366,"name":"添加Meter pro co2验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:267366] 添加Meter pro co2验证","status":"todo"},
{"kind":"add","ones":265933,"name":"添加curtain 3 2025验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:265933] 添加curtain 3 2025验证","status":"todo"},
{"kind":"add","ones":205248,"name":"添加S20扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:205248] 添加S20扫地机","status":"todo"},
{"kind":"add","ones":197389,"name":"添加Doorbell","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:197389] 添加Doorbell","status":"todo"},
{"kind":"add","ones":196802,"name":"添加空气净化器验证基础款和table款","cat":"air_condition","device":"AirCondition IR","file":"tests/air_condition/air_condition_connect.test.ts","testName":"[P0][ONES:196802] 添加空气净化器验证基础款和table款","status":"todo"},
{"kind":"add","ones":191100,"name":"添加Roller Shade验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:191100] 添加Roller Shade验证","status":"todo"},
{"kind":"feature","ones":190802,"name":"同步URC设备、控制","cat":"urc","device":"URC 5Y","file":"tests/urc/urc_control.test.ts","testName":"[P0][ONES:190802] 同步URC设备、控制","status":"todo"},
{"kind":"add","ones":190801,"name":"添加URC验证","cat":"urc","device":"URC 5Y","file":"tests/urc/urc_connect.test.ts","testName":"[P0][ONES:190801] 添加URC验证","status":"todo"},
{"kind":"feature","ones":162264,"name":"K10+ Pro Combo解除绑定手持","cat":"robot","device":"Robot S1","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:162264] K10+ Pro Combo解除绑定手持","status":"todo"},
{"kind":"feature","ones":162263,"name":"K10+ Pro Combo绑定手持吸尘器","cat":"robot","device":"Robot S1","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:162263] K10+ Pro Combo绑定手持吸尘器","status":"todo"},
{"kind":"add","ones":162261,"name":"添加K10+ Pro Combo","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:162261] 添加K10+ Pro Combo","status":"todo"},
{"kind":"add","ones":122775,"name":"添加 Circulator Fan验证无电池款","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:122775] 添加 Circulator Fan验证无电池款","status":"todo"},
{"kind":"add","ones":122737,"name":"添加K10+Pro扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:122737] 添加K10+Pro扫地机","status":"todo"},
{"kind":"add","ones":113943,"name":"添加PTC Plus 5MP","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:113943] 添加PTC Plus 5MP","status":"todo"},
{"kind":"add","ones":113942,"name":"添加OSC 2K验证","cat":"osc","device":"OSC 2K","file":"tests/osc/osc_connect.test.ts","testName":"[P0][ONES:113942] 添加OSC 2K验证","status":"todo"},
{"kind":"add","ones":113941,"name":"添加OSC验证","cat":"osc","device":"OSC 2K","file":"tests/osc/osc_connect.test.ts","testName":"[P0][ONES:113941] 添加OSC验证","status":"todo"},
{"kind":"add","ones":105436,"name":"添加lock Pro&kit验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:105436] 添加lock Pro&kit验证","status":"todo"},
{"kind":"add","ones":78369,"name":"添加S10扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:78369] 添加S10扫地机","status":"todo"},
{"kind":"feature","ones":74105,"name":"强绑定设备的自动解绑申请","cat":"","device":"","file":"","testName":"","status":"na"},
{"kind":"add","ones":74104,"name":"添加Humidifier2验证","cat":"humidifier","device":"Humidifier 1K","file":"tests/humidifier/humidifier_connect.test.ts","testName":"[P0][ONES:74104] 添加Humidifier2验证","status":"todo"},
{"kind":"feature","ones":74078,"name":"APP切换温湿度单位显示","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:74078] APP切换温湿度单位显示","status":"todo"},
{"kind":"add","ones":66694,"name":"添加Lock Pro验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:66694] 添加Lock Pro验证","status":"todo"},
{"kind":"add","ones":65336,"name":"添加Hub Mini Matter验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:65336] 添加Hub Mini Matter验证","status":"todo"},
{"kind":"add","ones":51440,"name":"添加lock&kit验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:51440] 添加lock&kit验证","status":"todo"},
{"kind":"add","ones":48159,"name":"添加Battery Circulator Fan验证","cat":"fan","device":"Fan 0T","file":"tests/fan/fan_connect.test.ts","testName":"[P0][ONES:48159] 添加Battery Circulator Fan验证","status":"todo"},
{"kind":"add","ones":47214,"name":"添加PTC Plus 3MP","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:47214] 添加PTC Plus 3MP","status":"todo"},
{"kind":"add","ones":40955,"name":"添加curtain 3验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:40955] 添加curtain 3验证","status":"todo"},
{"kind":"add","ones":40954,"name":"添加K10+扫地机","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:40954] 添加K10+扫地机","status":"todo"},
{"kind":"add","ones":35871,"name":"添加IOSensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:35871] 添加IOSensor验证","status":"todo"},
{"kind":"add","ones":21787,"name":"添加Hub2 验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:21787] 添加Hub2 验证","status":"todo"},
{"kind":"feature","ones":15973,"name":"keypad、keypad touch添加密码、指纹、卡片验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_control.test.ts","testName":"[P0][ONES:15973] keypad、keypad touch添加密码、指纹、卡片验证","status":"todo"},
{"kind":"add","ones":15972,"name":"添加Hub Mini验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:15972] 添加Hub Mini验证","status":"todo"},
{"kind":"add","ones":15971,"name":"添加Hub Plus验证","cat":"hub","device":"Hub2 8H","file":"tests/hub/hub_connect.test.ts","testName":"[P0][ONES:15971] 添加Hub Plus验证","status":"todo"},
{"kind":"add","ones":15970,"name":"添加Lock验证","cat":"lock","device":"Lock 6F","file":"tests/lock/lock_connect.test.ts","testName":"[P0][ONES:15970] 添加Lock验证","status":"todo"},
{"kind":"add","ones":15969,"name":"添加Curtain验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:15969] 添加Curtain验证","status":"todo"},
{"kind":"add","ones":15968,"name":"添加Bot验证","cat":"bot","device":"Bot 0F","file":"tests/bot/bot_connect.test.ts","testName":"[P0][ONES:15968] 添加Bot验证","status":"todo"},
{"kind":"add","ones":15967,"name":"添加Remote验证","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_connect.test.ts","testName":"[P0][ONES:15967] 添加Remote验证","status":"todo"},
{"kind":"add","ones":15966,"name":"添加Plug验证","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:15966] 添加Plug验证","status":"todo"},
{"kind":"add","ones":15965,"name":"添加Meter验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:15965] 添加Meter验证","status":"todo"},
{"kind":"add","ones":15964,"name":"添加Humidifier验证","cat":"humidifier","device":"Humidifier 1K","file":"tests/humidifier/humidifier_connect.test.ts","testName":"[P0][ONES:15964] 添加Humidifier验证","status":"todo"},
{"kind":"add","ones":15963,"name":"添加Motion Sensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:15963] 添加Motion Sensor验证","status":"todo"},
{"kind":"add","ones":15962,"name":"添加Contact Sensor验证","cat":"sensor","device":"Contact Sensor 5O","file":"tests/sensor/sensor_connect.test.ts","testName":"[P0][ONES:15962] 添加Contact Sensor验证","status":"todo"},
{"kind":"add","ones":15961,"name":"添加Indoor Cam验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15961] 添加Indoor Cam验证","status":"todo"},
{"kind":"add","ones":15960,"name":"添加Color Bulb验证","cat":"color_bulb","device":"ColorBulb 8R","file":"tests/color_bulb/color_bulb_connect.test.ts","testName":"[P0][ONES:15960] 添加Color Bulb验证","status":"todo"},
{"kind":"add","ones":15959,"name":"添加Strip Light验证","cat":"strip_light","device":"StripLight 9S","file":"tests/strip_light/strip_light_connect.test.ts","testName":"[P0][ONES:15959] 添加Strip Light验证","status":"todo"},
{"kind":"add","ones":15958,"name":"添加Plug Mini验证JP和US","cat":"plug","device":"Plug 4D","file":"tests/plug/plug_connect.test.ts","testName":"[P0][ONES:15958] 添加Plug Mini验证JP和US","status":"todo"},
{"kind":"add","ones":15957,"name":"添加Pan/Tilt Cam验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15957] 添加Pan/Tilt Cam验证","status":"todo"},
{"kind":"add","ones":15956,"name":"添加Meter Plus验证","cat":"meter","device":"Meter 3M","file":"tests/meter/meter_connect.test.ts","testName":"[P0][ONES:15956] 添加Meter Plus验证","status":"todo"},
{"kind":"feature","ones":15955,"name":"智能匹配遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15955] 智能匹配遥控器","status":"todo"},
{"kind":"feature","ones":15954,"name":"学习自定义遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15954] 学习自定义遥控器","status":"todo"},
{"kind":"feature","ones":15953,"name":"学习others遥控器","cat":"remote","device":"Remote 3W","file":"tests/remote/remote_control.test.ts","testName":"[P0][ONES:15953] 学习others遥控器","status":"todo"},
{"kind":"add","ones":15952,"name":"添加Robot Vacuum S1验证","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:15952] 添加Robot Vacuum S1验证","status":"todo"},
{"kind":"add","ones":15951,"name":"添加Robot Vacuum S1 Plus验证","cat":"robot","device":"Robot S1","file":"tests/robot/robot_connect.test.ts","testName":"[P0][ONES:15951] 添加Robot Vacuum S1 Plus验证","status":"todo"},
{"kind":"add","ones":15950,"name":"添加吸顶灯验证Pro和lte","cat":"ceiling_light","device":"CeilingLight 7Q","file":"tests/ceiling_light/ceiling_light_connect.test.ts","testName":"[P0][ONES:15950] 添加吸顶灯验证Pro和lte","status":"todo"},
{"kind":"add","ones":15949,"name":"添加keypad验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:15949] 添加keypad验证","status":"todo"},
{"kind":"add","ones":15948,"name":"添加keypad touch验证","cat":"keypad","device":"Keypad 2V","file":"tests/keypad/keypad_connect.test.ts","testName":"[P0][ONES:15948] 添加keypad touch验证","status":"todo"},
{"kind":"add","ones":15947,"name":"添加Pan/Tilt Cam 2K验证","cat":"camera","device":"摄像机Plus 3K","file":"tests/camera/camera_connect.test.ts","testName":"[P0][ONES:15947] 添加Pan/Tilt Cam 2K验证","status":"todo"},
{"kind":"add","ones":15946,"name":"添加Blind Tilt验证","cat":"curtain","device":"Curtain 1A","file":"tests/curtain/curtain_connect.test.ts","testName":"[P0][ONES:15946] 添加Blind Tilt验证","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"6e4uZSVe","proto":"ble","name":"点击控制Bot 不加密开&不加密关&加密按压","result":"对应Bot固件响应动作","cat":"bot","device":"Bot 0F","action":"点击控制Bot 不加密开&不加密关&加密按压","file":"tests/bot/bot_control.test.ts","testName":"[P0][ONES:15975#6e4uZSVe][ble] 点击控制Bot 不加密开&不加密关&加密按压 Bot 0F","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"5YEfmpJz","proto":"ble","name":"点击控制Lock 开锁/解锁","result":"对应Lock固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock 开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15975#5YEfmpJz][ble] 点击控制Lock 开锁/解锁 Lock 6F","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"774V8bND","proto":"ble","name":"Curtain---快捷弹窗---开/关","result":"对应Curtain固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#774V8bND][ble] Curtain---快捷弹窗---开/关 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"NvpUv9Tt","proto":"ble","name":"Meter---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应Meter温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---报","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#NvpUv9Tt][ble] Meter---历史数据---右上角设置---报 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3Jm5FAdW","proto":"ble","name":"Meter---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---校","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#3Jm5FAdW][ble] Meter---历史数据---右上角设置---校 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"QfYLdj8s","proto":"ble","name":"执行步骤5至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤5至校正---校正湿度---下一步,调整","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#QfYLdj8s][ble] 执行步骤5至校正---校正湿度---下一步,调整 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"GkkrZpaC","proto":"ble","name":"Humidifier---快捷弹窗---开启加湿器自动/低/中/高档/关闭","result":"对应Humidifier固件响应动作开启加湿器自动/低/中/高档/关闭","cat":"humidifier","device":"Humidifier 1K","action":"Humidifier---快捷弹窗---开启加湿","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#GkkrZpaC][ble] Humidifier---快捷弹窗---开启加湿 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"TNhSAuUC","proto":"ble","name":"点击控制Bulb 开/关","result":"对应Bulb固件响应动作开/关","cat":"color_bulb","device":"ColorBulb 8R","action":"点击控制Bulb 开/关","file":"tests/color_bulb/color_bulb_control.test.ts","testName":"[P0][ONES:15975#TNhSAuUC][ble] 点击控制Bulb 开/关 ColorBulb 8R","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"4poyiVwD","proto":"ble","name":"点击控制Strip Light开/关","result":"对应Strip Light固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制Strip Light开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#4poyiVwD][ble] 点击控制Strip Light开/关 StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"2528azD6","proto":"ble","name":"点击控制吸顶灯pro开/关灯","result":"对应吸顶灯pro固件响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯pro开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#2528azD6][ble] 点击控制吸顶灯pro开/关灯 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"V15M64cP","proto":"ble","name":"点击控制吸顶灯lte开/关灯","result":"对应吸顶灯lte固件响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯lte开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#V15M64cP][ble] 点击控制吸顶灯lte开/关灯 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"2jSFfY4k","proto":"ble","name":"点击控制Plug Mini开/关","result":"对应Plug Mini固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug Mini开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#2jSFfY4k][ble] 点击控制Plug Mini开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"UZCtZRPy","proto":"ble","name":"Meter Plus---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应Meter Plus温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#UZCtZRPy][ble] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"9mheLMDJ","proto":"ble","name":"Meter Plus---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Plus固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#9mheLMDJ][ble] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"GSZv8BYm","proto":"ble","name":"执行步骤14至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Plus固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤14至校正---校正湿度---下一步,调","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#GSZv8BYm][ble] 执行步骤14至校正---校正湿度---下一步,调 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"HrigrD2X","proto":"ble","name":"Motion Sensor---功能页面在Motion Sensor固件前移动","result":"功能页面正常显示有人移动","cat":"sensor","device":"Contact Sensor 5O","action":"Motion Sensor---功能页面在Mo","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#HrigrD2X][ble] Motion Sensor---功能页面在Mo Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"A8C4BsCm","proto":"ble","name":"Contact Sensor---功能页面开关Contact Sensor固件","result":"功能页面正常显示Contact Sensor的开关状态","cat":"sensor","device":"Contact Sensor 5O","action":"Contact Sensor---功能页面,开关","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#A8C4BsCm][ble] Contact Sensor---功能页面,开关 Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3frMRDZj","proto":"ble","name":"点击控制固件V20版本BlindTilt首页按钮","result":"响应到正确开合状态","cat":"curtain","device":"Curtain 1A","action":"点击控制固件V20版本BlindTilt首页按钮","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#3frMRDZj][ble] 点击控制固件V20版本BlindTilt首页按钮 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"Qbm9VB72","proto":"ble","name":"点击控制固件V12版本BlindTil功能页按钮验证兼容旧版本","result":"响应到正确开合状态","cat":"curtain","device":"Curtain 1A","action":"点击控制固件V12版本BlindTil功能页按钮","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#Qbm9VB72][ble] 点击控制固件V12版本BlindTil功能页按钮 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"QwnZJARA","proto":"ble","name":"IOSensor---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应IOSensor温湿度字体变红色","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#QwnZJARA][ble] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"Ncg7BDeR","proto":"ble","name":"IOSensor---历史数据---右上角设置---校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应IOSensor固件的温度值也相应变化","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15975#Ncg7BDeR][ble] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"k6cqKqtZ","proto":"ble","name":"执行步骤21至校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应IOSensor固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"执行步骤21至校正---校正湿度---下一步,调","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#k6cqKqtZ][ble] 执行步骤21至校正---校正湿度---下一步,调 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"QqsnPMc3","proto":"ble","name":"Curtain 3---快捷弹窗---开/关","result":"对应Curtain 3固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#QqsnPMc3][ble] Curtain 3---快捷弹窗---开/关 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"CiFPEbNS","proto":"ble","name":"带电池款Battery Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"带电池款Battery Circulator F","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#CiFPEbNS][ble] 带电池款Battery Circulator F Fan 0T","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"LnPNEJmS","proto":"ble","name":"点击控制Lock Pro开锁/解锁","result":"对应Lock Pro固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock Pro开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15975#LnPNEJmS][ble] 点击控制Lock Pro开锁/解锁 Lock 6F","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3PmZMk1s","proto":"ble","name":"进入Humidifier2设置页绑定温湿度计点击切换档位、模式","result":"绑定成功,功能页显示对应湿度值;切换档位、模式、目标湿度正常。","cat":"humidifier","device":"Humidifier 1K","action":"进入Humidifier2设置页绑定温湿度计","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#3PmZMk1s][ble] 进入Humidifier2设置页绑定温湿度计 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"JBszgxRS","proto":"ble","name":"无电池款Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"无电池款Circulator Fan---首页控","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#JBszgxRS][ble] 无电池款Circulator Fan---首页控 Fan 0T","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"SmzuHtWi","proto":"ble","name":"Roller Shade功能页控制设备全开、暂停、全关、任意百分比控制","result":"Roller Shade正常响应所有控制指令","cat":"curtain","device":"Curtain 1A","action":"Roller Shade功能页控制设备全开、暂停","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#SmzuHtWi][ble] Roller Shade功能页控制设备全开、暂停 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"7qxA1ajE","proto":"ble","name":"点击控制美规基础款空气净化器--开/关","result":"对应美规基础款空气净化器开关","cat":"air_condition","device":"AirCondition IR","action":"点击控制美规基础款空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15975#7qxA1ajE][ble] 点击控制美规基础款空气净化器--开/关 AirCondition IR","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"R5PDp8BR","proto":"ble","name":"点击控制日规Table空气净化器--开/关","result":"对应日规Table空气净化器开/关","cat":"air_condition","device":"AirCondition IR","action":"点击控制日规Table空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15975#R5PDp8BR][ble] 点击控制日规Table空气净化器--开/关 AirCondition IR","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3wM6fW8W","proto":"ble","name":"Curtain 3 2025---快捷弹窗---开/关","result":"对应Curtain 3 2025固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3 2025---快捷弹窗---","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15975#3wM6fW8W][ble] Curtain 3 2025---快捷弹窗--- Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"JggzNXDo","proto":"ble","name":"Meter pro---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载不会有特别异常的数据图表主页对应Meter Pro温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter pro---图表数据---右上角设置","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#JggzNXDo][ble] Meter pro---图表数据---右上角设置 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"L967RGHa","proto":"ble","name":"Meter pro---设置页--校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Pro固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter pro---设置页--校正---校准","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#L967RGHa][ble] Meter pro---设置页--校正---校准 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"8Wzaj5pB","proto":"ble","name":"校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Pro固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"校正---校正湿度---下一步,调整湿度范围增加","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#8Wzaj5pB][ble] 校正---校正湿度---下一步,调整湿度范围增加 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3bYsmiZG","proto":"ble","name":"Meter pro co2---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载不会有特别异常的数据图表主页对应Meter Pro co2温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter pro co2---图表数据---右","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#3bYsmiZG][ble] Meter pro co2---图表数据---右 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"NDqRQxVx","proto":"ble","name":"Meter pro co2---设置页--校正---校准温度---下一步,调整温度范围增加温度","result":"温度校正过程中对应Meter Pro co2固件的温度值也相应变化","cat":"meter","device":"Meter 3M","action":"Meter pro co2---设置页--校正-","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15975#NDqRQxVx][ble] Meter pro co2---设置页--校正- Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"DxKG9Acs","proto":"ble","name":"校正---校正湿度---下一步,调整湿度范围增加湿度","result":"湿度校正过程中对应Meter Pro co2固件的湿度值也相应变化","cat":"humidifier","device":"Humidifier 1K","action":"校正---校正湿度---下一步,调整湿度范围增加","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15975#DxKG9Acs][ble] 校正---校正湿度---下一步,调整湿度范围增加 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"3ob75cjf","proto":"ble","name":"点击控制RGBWW 彩色灯带3 --开/关","result":"对应RGBWW 彩色灯带3 --固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBWW 彩色灯带3 --开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#3ob75cjf][ble] 点击控制RGBWW 彩色灯带3 --开/关 StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"JVnRz7xY","proto":"ble","name":"点击控制RGBWW 落地灯 --开/关","result":"对应RGBWW 落地灯 --固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBWW 落地灯 --开/关","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#JVnRz7xY][ble] 点击控制RGBWW 落地灯 --开/关 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"MKgLq1oy","proto":"ble","name":"点击控制Relay switch 1pm","result":"对应Relay Switch 1pm -固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 1pm","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#MKgLq1oy][ble] 点击控制Relay switch 1pm Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"A1TLxsFw","proto":"ble","name":"点击控制Relay switch 1","result":"对应Relay Switch 1-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 1","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#A1TLxsFw][ble] 点击控制Relay switch 1 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"PG62s725","proto":"ble","name":"点击控制Relay switch 2pm-开关控制器","result":"对应Relay Switch 2pm开关控制器-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 2pm-开关控","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#PG62s725][ble] 点击控制Relay switch 2pm-开关控 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"AafJ5tj5","proto":"ble","name":"点击控制Relay switch 2pm-覆盖控制器","result":"对应Relay Switch 2pm覆盖控制器-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay switch 2pm-覆盖控","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#AafJ5tj5][ble] 点击控制Relay switch 2pm-覆盖控 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"E5YRm4Pg","proto":"ble","name":"点击控制Garage Door Opener","result":"对应Garage Door Opener-固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Garage Door Opener","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#E5YRm4Pg][ble] 点击控制Garage Door Opener Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"QAHNrXrm","proto":"ble","name":"点击控制RGBICWW Strip Light (炫彩灯带)--开/关","result":"对应RGBICWW Strip Light (炫彩灯带)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBICWW Strip Light ","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#QAHNrXrm][ble] 点击控制RGBICWW Strip Light StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"AfxmoAEq","proto":"ble","name":"点击控制RGBICWW Floor Lamp炫彩落地灯--开/关","result":"对应RGBICWW Floor Lamp炫彩落地灯--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBICWW Floor Lamp炫","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15975#AfxmoAEq][ble] 点击控制RGBICWW Floor Lamp炫 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"E2QCS8xy","proto":"ble","name":"点击控制RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯--开/关","result":"对应RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Wire Rope","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15975#E2QCS8xy][ble] 点击控制RGBIC Neon Wire Rope StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"TSVKWcJ3","proto":"ble","name":"点击控制eu plug--开/关","result":"对应设备响应开/关","cat":"plug","device":"Plug 4D","action":"点击控制eu plug--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15975#TSVKWcJ3][ble] 点击控制eu plug--开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15975,"step":"XWmNA9UL","proto":"ble","name":"Standing Circulator fan--首页控制开关","result":"对应落地扇响应开/关","cat":"fan","device":"Fan 0T","action":"Standing Circulator fan-","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15975#XWmNA9UL][ble] Standing Circulator fan- Fan 0T","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Qt4hcgB4","proto":"wifi","name":"点击控制Bot 不加密开&不加密关&加密按压","result":"对应Bot固件响应动作","cat":"bot","device":"Bot 0F","action":"点击控制Bot 不加密开&不加密关&加密按压","file":"tests/bot/bot_control.test.ts","testName":"[P0][ONES:15974#Qt4hcgB4][wifi] 点击控制Bot 不加密开&不加密关&加密按压 Bot 0F","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"7cEkbh4Y","proto":"wifi","name":"点击控制Lock 开锁/解锁","result":"对应Lock固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock 开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15974#7cEkbh4Y][wifi] 点击控制Lock 开锁/解锁 Lock 6F","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"GPT3wJd9","proto":"wifi","name":"Curtain---快捷弹窗---开/关","result":"对应Curtain固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#GPT3wJd9][wifi] Curtain---快捷弹窗---开/关 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"63kDVNx1","proto":"wifi","name":"Meter---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应Meter温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter---历史数据---右上角设置---报","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#63kDVNx1][wifi] Meter---历史数据---右上角设置---报 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"8yGTCPwY","proto":"wifi","name":"Meter Plus---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应Meter Plus温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Plus---历史数据---右上角设","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#8yGTCPwY][wifi] Meter Plus---历史数据---右上角设 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Ay79Pj23","proto":"wifi","name":"点击控制Plug 开/关","result":"对应Plug固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug 开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Ay79Pj23][wifi] 点击控制Plug 开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"8tx3Rg76","proto":"wifi","name":"Humidifier---快捷弹窗---开启加湿器自动/低/中/高档/关闭","result":"对应Humidifier固件响应动作开启加湿器自动/低/中/高档/关闭","cat":"humidifier","device":"Humidifier 1K","action":"Humidifier---快捷弹窗---开启加湿","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15974#8tx3Rg76][wifi] Humidifier---快捷弹窗---开启加湿 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Kaj2UdKf","proto":"wifi","name":"点击控制Bulb 开/关","result":"对应Bulb固件响应动作开/关","cat":"color_bulb","device":"ColorBulb 8R","action":"点击控制Bulb 开/关","file":"tests/color_bulb/color_bulb_control.test.ts","testName":"[P0][ONES:15974#Kaj2UdKf][wifi] 点击控制Bulb 开/关 ColorBulb 8R","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"QgX4dX7X","proto":"wifi","name":"点击控制Strip Light开/关","result":"对应Strip Light固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制Strip Light开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#QgX4dX7X][wifi] 点击控制Strip Light开/关 StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"3nXsFW9n","proto":"wifi","name":"点击控制Plug Mini开/关","result":"对应Plug Mini固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Plug Mini开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#3nXsFW9n][wifi] 点击控制Plug Mini开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"N7fSHmH3","proto":"wifi","name":"Motion Sensor---功能页面在Motion Sensor固件前移动","result":"功能页面正常显示有人移动","cat":"sensor","device":"Contact Sensor 5O","action":"Motion Sensor---功能页面在Mo","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#N7fSHmH3][wifi] Motion Sensor---功能页面在Mo Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"JKSgHHbC","proto":"wifi","name":"Contact Sensor---功能页面开关Contact Sensor固件","result":"功能页面正常显示Contact Sensor的开关状态","cat":"sensor","device":"Contact Sensor 5O","action":"Contact Sensor---功能页面,开关","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#JKSgHHbC][wifi] Contact Sensor---功能页面,开关 Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"4oeeJEV8","proto":"wifi","name":"点击Indoor Cam出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流","cat":"camera","device":"摄像机Plus 3K","action":"点击Indoor Cam出流成功后在页面停留3","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#4oeeJEV8][wifi] 点击Indoor Cam出流成功后在页面停留3 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"16szaUdD","proto":"wifi","name":"点击Pan/Tilt Cam出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam出流成功后在页面停","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#16szaUdD][wifi] 点击Pan/Tilt Cam出流成功后在页面停 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Hj5Z9jSf","proto":"wifi","name":"点击Pan/Tilt Cam 2K出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam 2K出流成功后在","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#Hj5Z9jSf][wifi] 点击Pan/Tilt Cam 2K出流成功后在 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"SaKmFWLw","proto":"wifi","name":"点击Pan/Tilt Cam Plus 3MP出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam Plus 3MP","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#SaKmFWLw][wifi] 点击Pan/Tilt Cam Plus 3MP 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"LDqSDPPT","proto":"wifi","name":"点击Pan/Tilt Cam Plus 5MP出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Pan/Tilt Cam Plus 5MP","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#LDqSDPPT][wifi] 点击Pan/Tilt Cam Plus 5MP 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"HoDdVUm1","proto":"wifi","name":"点击OSC出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"osc","device":"OSC 2K","action":"点击OSC出流成功后在页面停留3min","file":"tests/osc/osc_control.test.ts","testName":"[P0][ONES:15974#HoDdVUm1][wifi] 点击OSC出流成功后在页面停留3min OSC 2K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"WH7kyypF","proto":"wifi","name":"点击OSC 2K出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"osc","device":"OSC 2K","action":"点击OSC 2K出流成功后在页面停留3min","file":"tests/osc/osc_control.test.ts","testName":"[P0][ONES:15974#WH7kyypF][wifi] 点击OSC 2K出流成功后在页面停留3min OSC 2K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"J8BQ1p9G","proto":"wifi","name":"点击Doorbell出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Doorbell出流成功后在页面停留3mi","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#J8BQ1p9G][wifi] 点击Doorbell出流成功后在页面停留3mi 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"KNk1HaB2","proto":"wifi","name":"点击Outdoor PTC出流成功后在页面停留3min","result":"跳转功能页面,能够正常加载视频流,画面显示正常,时间水印正常跳动","cat":"camera","device":"摄像机Plus 3K","action":"点击Outdoor PTC出流成功后在页面停留","file":"tests/camera/camera_control.test.ts","testName":"[P0][ONES:15974#KNk1HaB2][wifi] 点击Outdoor PTC出流成功后在页面停留 摄像机Plus 3K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"67oRHoYJ","proto":"wifi","name":"点击Robot Vacuum S1控制清扫、暂停、回充","result":"对应Robot Vacuum S1固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击Robot Vacuum S1控制清扫、暂停","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#67oRHoYJ][wifi] 点击Robot Vacuum S1控制清扫、暂停 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"YAeiQE6n","proto":"wifi","name":"点击Robot Vacuum S1 Plus控制清扫、暂停、回充","result":"对应Robot Vacuum S1 Plus固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击Robot Vacuum S1 Plus控制","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#YAeiQE6n][wifi] 点击Robot Vacuum S1 Plus控制 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"TcnL3gFM","proto":"wifi","name":"点击控制吸顶灯pro开/关灯","result":"对应吸顶灯pro响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯pro开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#TcnL3gFM][wifi] 点击控制吸顶灯pro开/关灯 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"WL8KSQLb","proto":"wifi","name":"点击控制吸顶灯lte开/关灯","result":"对应吸顶灯lte响应动作开/关灯","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制吸顶灯lte开/关灯","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#WL8KSQLb][wifi] 点击控制吸顶灯lte开/关灯 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"6gv1WLKE","proto":"wifi","name":"首页点击控制固件V20版本BlindTilt","result":"对应BlindTilt固件响应","cat":"curtain","device":"Curtain 1A","action":"首页点击控制固件V20版本BlindTilt","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#6gv1WLKE][wifi] 首页点击控制固件V20版本BlindTilt Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"B5N4u7Fj","proto":"wifi","name":"首页点击控制固件V12版本BlindTil功能页按钮验证兼容旧版本","result":"对应BlindTilt固件响应","cat":"curtain","device":"Curtain 1A","action":"首页点击控制固件V12版本BlindTil功能页","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#B5N4u7Fj][wifi] 首页点击控制固件V12版本BlindTil功能页 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"5yYJmwLL","proto":"wifi","name":"IOSensor---历史数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"历史数据能够加载不会有特别异常的数据图表主页对应IOSensor温湿度字体变红色","cat":"sensor","device":"Contact Sensor 5O","action":"IOSensor---历史数据---右上角设置-","file":"tests/sensor/sensor_control.test.ts","testName":"[P0][ONES:15974#5yYJmwLL][wifi] IOSensor---历史数据---右上角设置- Contact Sensor 5O","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"GYtvdMTW","proto":"wifi","name":"Curtain 3---快捷弹窗---开/关","result":"对应Curtain 3固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3---快捷弹窗---开/关","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#GYtvdMTW][wifi] Curtain 3---快捷弹窗---开/关 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"44FEY1z2","proto":"wifi","name":"点击K10+ 扫地机控制清扫、暂停、回充","result":"对应扫地机执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+ 扫地机控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#44FEY1z2][wifi] 点击K10+ 扫地机控制清扫、暂停、回充 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"6RC22BGo","proto":"wifi","name":"带电池款Battery Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"带电池款Battery Circulator F","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15974#6RC22BGo][wifi] 带电池款Battery Circulator F Fan 0T","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Virku9zd","proto":"wifi","name":"点击控制Lock Pro开锁/解锁","result":"对应Lock Pro固件响应动作开锁/解锁","cat":"lock","device":"Lock 6F","action":"点击控制Lock Pro开锁/解锁","file":"tests/lock/lock_control.test.ts","testName":"[P0][ONES:15974#Virku9zd][wifi] 点击控制Lock Pro开锁/解锁 Lock 6F","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"BhNuXgg7","proto":"wifi","name":"进入Humidifier2设置页远程绑定温湿度计点击切换档位、模式","result":"绑定成功,功能页显示对应湿度值;切换档位、模式、目标湿度正常。","cat":"humidifier","device":"Humidifier 1K","action":"进入Humidifier2设置页远程绑定温湿度","file":"tests/humidifier/humidifier_control.test.ts","testName":"[P0][ONES:15974#BhNuXgg7][wifi] 进入Humidifier2设置页远程绑定温湿度 Humidifier 1K","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"9bcyjgJD","proto":"wifi","name":"点击S10控制清扫、暂停、回充","result":"对应S10固件执行清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击S10控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#9bcyjgJD][wifi] 点击S10控制清扫、暂停、回充 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"KNyzKhn6","proto":"wifi","name":"无电池款 Circulator Fan---首页控制开关","result":"对应循环扇开关","cat":"fan","device":"Fan 0T","action":"无电池款 Circulator Fan---首页","file":"tests/fan/fan_control.test.ts","testName":"[P0][ONES:15974#KNyzKhn6][wifi] 无电池款 Circulator Fan---首页 Fan 0T","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"W7nK4VEB","proto":"wifi","name":"点击K10+Pro控制清扫、暂停、回充","result":"K10+ Pro正常响应清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+Pro控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#W7nK4VEB][wifi] 点击K10+Pro控制清扫、暂停、回充 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"GWAbic5S","proto":"wifi","name":"点击K10+ProCombo控制清扫、暂停、回充","result":"K10+ ProCombo正常响应清扫、暂停、回充","cat":"robot","device":"Robot S1","action":"点击K10+ProCombo控制清扫、暂停、回充","file":"tests/robot/robot_control.test.ts","testName":"[P0][ONES:15974#GWAbic5S][wifi] 点击K10+ProCombo控制清扫、暂停、回充 Robot S1","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"ScBpcSfJ","proto":"wifi","name":"Roller Shade功能页控制设备全开、暂停、全关、任意百分比控制","result":"Roller Shade正常响应所有控制指令","cat":"curtain","device":"Curtain 1A","action":"Roller Shade功能页控制设备全开、暂停","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#ScBpcSfJ][wifi] Roller Shade功能页控制设备全开、暂停 Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"AWVhA6za","proto":"wifi","name":"点击控制美规基础款空气净化器--开/关","result":"对应美规基础款空气净化器--开关","cat":"air_condition","device":"AirCondition IR","action":"点击控制美规基础款空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15974#AWVhA6za][wifi] 点击控制美规基础款空气净化器--开/关 AirCondition IR","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"MmodMTvh","proto":"wifi","name":"点击控制日规Table空气净化器--开/关","result":"对应日规Table空气净化器--开/关","cat":"air_condition","device":"AirCondition IR","action":"点击控制日规Table空气净化器--开/关","file":"tests/air_condition/air_condition_control.test.ts","testName":"[P0][ONES:15974#MmodMTvh][wifi] 点击控制日规Table空气净化器--开/关 AirCondition IR","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"VbqWg59G","proto":"wifi","name":"Curtain 3 2025---快捷弹窗---开/关","result":"对应Curtain 3 2025固件响应动作开/关","cat":"curtain","device":"Curtain 1A","action":"Curtain 3 2025---快捷弹窗---","file":"tests/curtain/curtain_control.test.ts","testName":"[P0][ONES:15974#VbqWg59G][wifi] Curtain 3 2025---快捷弹窗--- Curtain 1A","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"N5i3oQP2","proto":"wifi","name":"Meter Pro---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载不会有特别异常的数据图表主页对应Meter Pro温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Pro---图表数据---右上角设置","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#N5i3oQP2][wifi] Meter Pro---图表数据---右上角设置 Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"LAtdvNBV","proto":"wifi","name":"Meter Pro co2\n---图表数据---右上角设置---报警条件,开启温度和湿度报警,拉动滑条使当前温湿度在报警范围内","result":"图表数据能够加载不会有特别异常的数据图表主页对应Meter Pro co2温湿度字体变红色","cat":"meter","device":"Meter 3M","action":"Meter Pro co2 ---图表数据---","file":"tests/meter/meter_control.test.ts","testName":"[P0][ONES:15974#LAtdvNBV][wifi] Meter Pro co2 ---图表数据--- Meter 3M","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"N1kzcb7S","proto":"wifi","name":"点击控制RGBWW 彩色灯带3 --开/关","result":"对应RGBWW 彩色灯带3 --固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBWW 彩色灯带3 --开/关","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#N1kzcb7S][wifi] 点击控制RGBWW 彩色灯带3 --开/关 StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"2hm6sXrk","proto":"wifi","name":"点击控制RGBWW 落地灯 --开/关","result":"对应RGBWW 落地灯 --固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBWW 落地灯 --开/关","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#2hm6sXrk][wifi] 点击控制RGBWW 落地灯 --开/关 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"XvFF8AK7","proto":"wifi","name":"点击控制Relay Switch 1pm--开/关","result":"对应Relay Switch 1pm --固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 1pm--开/","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#XvFF8AK7][wifi] 点击控制Relay Switch 1pm--开/ Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Y9gosqbQ","proto":"wifi","name":"点击控制Relay Switch 1--开/关","result":"对应Relay Switch 1 --固件响应动作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 1--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Y9gosqbQ][wifi] 点击控制Relay Switch 1--开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"Vro1QBrg","proto":"wifi","name":"点击控制Relay Switch 2pm开关控制器--开/关","result":"对应 --固件响应Relay Switch 2pm开关控制器响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 2pm开关控制","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#Vro1QBrg][wifi] 点击控制Relay Switch 2pm开关控制 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"c34Tk92u","proto":"wifi","name":"点击控制Relay Switch 2pm覆盖控制器--开/关","result":"对应 --固件响应动Relay Switch 2pm覆盖控制器响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Relay Switch 2pm覆盖控制","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#c34Tk92u][wifi] 点击控制Relay Switch 2pm覆盖控制 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"2nRaC87F","proto":"wifi","name":"点击控制Garage Door Opener--开/关","result":"对应 --固件响应Garage Door Opener动响作开/关","cat":"plug","device":"Plug 4D","action":"点击控制Garage Door Opener--","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#2nRaC87F][wifi] 点击控制Garage Door Opener-- Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"MAwYyCaC","proto":"wifi","name":"点击控制RGBICWW Strip Light (炫彩灯带)--开/关","result":"对应RGBICWW Strip Light (炫彩灯带)--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBICWW Strip Light ","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#MAwYyCaC][wifi] 点击控制RGBICWW Strip Light StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"ML8CSkWX","proto":"wifi","name":"点击控制RGBICWW Floor Lamp炫彩落地灯--开/关","result":"对应RGBICWW Floor Lamp炫彩落地灯--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制RGBICWW Floor Lamp炫","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#ML8CSkWX][wifi] 点击控制RGBICWW Floor Lamp炫 CeilingLight 7Q","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"5sJcsTgi","proto":"wifi","name":"点击控制RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯--开/关","result":"对应RGBIC Neon Wire Rope Light炫彩钢丝霓虹灯--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Wire Rope","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#5sJcsTgi][wifi] 点击控制RGBIC Neon Wire Rope StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"U5z9wocr","proto":"wifi","name":"点击控制eu plug--开/关","result":"对应设备响应开/关","cat":"plug","device":"Plug 4D","action":"点击控制eu plug--开/关","file":"tests/plug/plug_control.test.ts","testName":"[P0][ONES:15974#U5z9wocr][wifi] 点击控制eu plug--开/关 Plug 4D","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"BiEXxZDr","proto":"wifi","name":"点击控制RGBIC Neon Rope Light炫彩霓虹灯--开/关","result":"对应RGBIC Neon Rope Light炫彩霓虹灯--固件响应动作开/关","cat":"strip_light","device":"StripLight 9S","action":"点击控制RGBIC Neon Rope Ligh","file":"tests/strip_light/strip_light_control.test.ts","testName":"[P0][ONES:15974#BiEXxZDr][wifi] 点击控制RGBIC Neon Rope Ligh StripLight 9S","status":"todo"},
{"kind":"ctrl","ones":15974,"step":"RXm3iNLR","proto":"wifi","name":"点击控制Candle lamp融蜡灯--开/关融蜡灯需要插110V电压","result":"对应Candle lamp融蜡灯--固件响应动作开/关","cat":"ceiling_light","device":"CeilingLight 7Q","action":"点击控制Candle lamp融蜡灯--开/","file":"tests/ceiling_light/ceiling_light_control.test.ts","testName":"[P0][ONES:15974#RXm3iNLR][wifi] 点击控制Candle lamp融蜡灯--开/ CeilingLight 7Q","status":"todo"},
];