Skip to content

微信小程序 - SA 设备控制交互设计 PRD (v2.4 规范统一版)


1. 交互规范统一 (Interaction Standards)

1.1 选择器规范 (Selector Standard)

  • 统一组件:采用 Checkbox (多选框) 逻辑,方型圆角外观。
  • 数量判定 (Conditional UI)
    • 唯一设备 (Count = 1):隐藏选择列表。直接在信息区展示设备全名。
    • 多个设备 (Count > 1):展示 Checkbox 列表。
    • 多设备 - 全选联动 (Master-Slave)
      • 首项为“全场同步”,作为 Master Checkbox,始终显示,不随待操作设备数量动态隐藏
      • 勾选行为修正:勾选“全场同步”时,仅选中“待操作”设备(当前状态与目标状态不一致的设备),已到位的设备自动跳过、不受影响。
      • 取消勾选“全场同步”则全不选。
      • 手动勾选全部待操作设备时,“全场同步”自动点亮;手动取消任一待操作设备勾选时,“全场同步”同步取消点亮。
      • 当所有设备均已达到目标状态时,全选 Checkbox 置灰不可勾选。

1.2 颜色与视觉 (Visuals)

  • 主色调:深蓝 (#184073) 用于动作、滑块及主按钮。
  • 状态色:开关状态(开启-绿/关闭-灰)、温度数值。

1.3 空间分组展示规范 (Space Grouping)

当确认卡片中的设备涉及多个空间时,按空间名称分组展示。规则如下:

  • 单设备 (Count = 1):受控范围行展示空间名称,次行展示设备名称 (当前 状态),与多设备布局一致,隐藏 checkbox。示例:
    受控范围:305会议室
    主灯 (当前 关闭)
  • 多设备-单空间 (Multi, Single Space)
    • "受控范围"行展示空间名称。
    • 设备列表展示设备名称(不重复空间前缀)+ 当前状态。
    • 示例:
    受控范围:305会议室
    [x] 全场同步 (2台设备)
    ────────────────────
    [x] 主灯 (当前 关闭)
    [x] 筒灯 (当前 关闭)
  • 多设备-多空间 (Multi, Multiple Spaces)
    • "受控范围"行仅展示"受控范围"字样(不合并空间名)。
    • 设备列表按空间分组,每组首行为空间名称缩进,组内设备再缩进一级。
    • 全场同步 Master Checkbox 仍然作用于全部设备。
    • 示例:
    受控范围:
    [x] 全场同步 (3台设备)
    ────────────────────
    305会议室
      [x] 主灯 (当前 关闭)
      [x] 筒灯 (当前 关闭)
    306会议室
      [x] 主灯 (当前 关闭)

2. 核心场景交互设计 (Scenario Design)

场景 A:枚举型控制 (Enum - Multi-device)

触发条件:指令命中了多个具备模式/枚举属性的设备。对应原型快速问"空调调到制冷模式"、Mock B。 勾选规则:与布尔型完全一致(见 1.1 全选联动),全场同步仅勾选待操作设备,已到位设备置灰跳过。

A1. 标准场景 (全部待操作)

text
(User) "空调调到制冷模式" (空调(左) 当前-自动, 空调(右) 当前-制热)

(Agent) 
+-------------------------------------------+
| [❄️] **调节 运行模式**                      |
| ---------------------------------------   |
|  执行动作:设定为 **制冷模式**              |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [x] 空调(左) (当前 自动)   ← 待操作       |
|  [x] 空调(右) (当前 制热)   ← 待操作       |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

A2. 混合状态 (部分已到位)

text
(User) "空调调到制冷模式" (空调(左) 当前-制冷, 空调(右) 当前-制热)

(Agent) 
+-------------------------------------------+
| [❄️] **调节 运行模式**                      |
| ---------------------------------------   |
|  执行动作:设定为 **制冷模式**              |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [✓] 空调(左) (当前 制冷)   ← 置灰已到位   |
|  [x] 空调(右) (当前 制热)   ← 待操作       |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

"制冷模式" 取自设备管理-枚举语义化定义

A3. 全部已到位 (All at Target)

text
(User) "空调调到制冷模式" (空调(左) 当前-制冷, 空调(右) 当前-制冷)

(Agent) 
+-------------------------------------------+
| [❄️] **调节 运行模式**                      |
| ---------------------------------------   |
|  执行动作:设定为 **制冷模式**              |
|                                           |
|  受控范围:305会议室                       |
|  [ ] **全场同步** (已全部到位)  ← 置灰     |
|  ────────────────────                     |
|  [✓] 空调(左) (当前 制冷)   ← 置灰         |
|  [✓] 空调(右) (当前 制冷)   ← 置灰         |
| ---------------------------------------   |
|  [ 取消 ]       [ 确认执行 ]  ← 置灰       |
+-------------------------------------------+

场景 B:布尔型控制 (Bool - Single vs Multi)

对应原型快速问"打开305会议室的灯"、Mock A(关灯模糊多选)、Mock F(多空间分组)。

B1. 唯一匹配 (Single)

B1.1 待操作 (Need to Operate)
text
(User) "打开 305 主灯" (当前 关闭)

(Agent) 
+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **开启**                   |
|                                           |
|  受控范围:305会议室                       |
|  主灯 (当前 关闭)                           |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+
B1.2 已到位 (Already at Target)
text
(User) "打开 305 主灯" (当前 已开启)

(Agent) 
+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **开启**                   |
|                                           |
|  受控范围:305会议室                       |
|  主灯 (当前 已开启)                         |
| ---------------------------------------   |
|  [ 取消 ]       [ 确认执行 ]  ← 置灰       |
+-------------------------------------------+

"开启" 取自设备管理-BOOL语义化定义

B2. 多设备-全部待操作 (Multi - All Need to Operate)

text
(User) "打开305会议室的灯" (主灯已关、筒灯已关)

+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **开启**                  |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [x] 主灯 (当前 已关)   ← 待操作           |
|  [x] 筒灯 (当前 已关)   ← 待操作           |
+-------------------------------------------+

B3. 混合状态 (Multi - Partial at Target)

text
(User) "打开305会议室的灯" (主灯已开、筒灯已关)

+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **开启**                  |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [✓] 主灯 (当前 已开)   ← 置灰已到位       |
|  [x] 筒灯 (当前 已关)   ← 待操作            |
+-------------------------------------------+

说明:

  • 全场同步勾选时,仅选中筒灯(待操作设备),主灯已到目标态自动跳过。
  • 已到位的设备 checkbox 置灰 [✓] 不可操作,仅作状态展示。
  • 若用户手动取消筒灯勾选,全场同步同步取消点亮。

B4. 全部已到位 (Multi - All at Target)

text
(User) "打开305会议室的灯" (主灯已开、筒灯已开)

+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **开启**                  |
|                                           |
|  受控范围:305会议室                       |
|  [ ] **全场同步** (已全部到位)  ← 置灰     |
|  ────────────────────                     |
|  [✓] 主灯 (当前 已开)   ← 置灰            |
|  [✓] 筒灯 (当前 已开)   ← 置灰            |
+-------------------------------------------+

说明:

  • 所有设备当前状态已全部到达目标状态,无需执行任何操作。
  • 全场同步 checkbox 置灰不可勾选,确认执行按钮同步置灰不可点击。

B5. 多空间 (跨空间分组)

对应原型 Mock F。设备分布在多个空间时,按空间名称分组展示。

text
(User) "关闭多空间灯具"

+-------------------------------------------+
| [💡] **调节 灯具开关**                      |
| ---------------------------------------   |
|  执行动作:设定为 **关闭**                  |
|                                           |
|  受控范围:                                |
|  [x] **全场同步** (3台设备)                |
|  ────────────────────                     |
|  305会议室                                 |
|    [x] 主灯 (当前 开启)   ← 待操作         |
|    [x] 筒灯 (当前 开启)   ← 待操作         |
|  306会议室                                 |
|    [x] 壁灯 (当前 开启)   ← 待操作         |
+-------------------------------------------+

场景 C:数值型控制 (Float)

对应原型快速问"把305的空调调到24度""305空调再冷点""空调关小到10度"、Mock C/D/E。

C1. 单设备-待操作 (Single - Need to Operate)

text
(User) "把305的空调调到24度" (当前 22.0℃)

(Agent) 
+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **24.0℃**              |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  变频空调 (当前 22.0℃)                     |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

C2. 单设备-已到位 (Single - Already at Target)

text
(User) "把305的空调调到24度" (当前 24.0℃)

(Agent) 
+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **24.0℃**              |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  变频空调 (当前 24.0℃)                     |
| ---------------------------------------   |
|  [ 取消 ]       [ 确认执行 ]  ← 置灰       |
+-------------------------------------------+

C3. 多设备-全部待操作 (Multi - All Need to Operate)

对应原型 Mock D(步进)。

text
(User) "305空调再冷点" (空调(左) 当前 27.5℃, 空调(右) 当前 26.0℃)

(Agent) 
+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **24.0℃**              |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [x] 空调(左) (当前 27.5℃)  ← 待操作       |
|  [x] 空调(右) (当前 26.0℃)  ← 待操作       |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

C4. 多设备-混合状态 (Multi - Partial at Target)

text
(User) "305空调再冷点" (空调(左) 当前 24.0℃, 空调(右) 当前 26.0℃)

(Agent) 
+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **24.0℃**              |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [✓] 空调(左) (当前 24.0℃)  ← 置灰已到位  |
|  [x] 空调(右) (当前 26.0℃)  ← 待操作       |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

C5. 多设备-全部已到位 (Multi - All at Target)

text
(User) "305空调再冷点" (空调(左) 当前 24.0℃, 空调(右) 当前 24.0℃)

(Agent) 
+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **24.0℃**              |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  [ ] **全场同步** (已全部到位)  ← 置灰     |
|  ────────────────────                     |
|  [✓] 空调(左) (当前 24.0℃)  ← 置灰        |
|  [✓] 空调(右) (当前 24.0℃)  ← 置灰        |
| ---------------------------------------   |
|  [ 取消 ]       [ 确认执行 ]  ← 置灰       |
+-------------------------------------------+

C6. 边界拦截

对应原型 Mock E。

text
(User) "空调关小到10度" (空调(左) 当前 27.5℃, 空调(右) 当前 26.0℃)

(Agent)
[消息气泡] "已为您匹配,控制下限为16℃,目前不支持设定出此范围。"

+-------------------------------------------+
| [🌡️] **调节 设定温度**                    |
| ---------------------------------------   |
|  执行目标:设定温度 **10.0℃**              |
|  ⚠️ 已修正至可用下限 16.0℃                |
|  [ - ] —————⬤————— [ + ]                  |
|                                           |
|  受控范围:305会议室                       |
|  [x] **全场同步** (2台设备)                |
|  ────────────────────                     |
|  [x] 空调(左) (当前 27.5℃)  ← 待操作       |
|  [x] 空调(右) (当前 26.0℃)  ← 待操作       |
| ---------------------------------------   |
|  [ 取消 ]            [ 确认执行 ]          |
+-------------------------------------------+

3. 取数逻辑说明

3.1 确认卡片取数逻辑

当用户说"打开305会议室的灯"时,确认卡片所需数据按以下方式获取:

卡片 Header 标题:取当前操作对应的标准语义名称(来自"标准语义管理"库,如 light_power → "灯具开关"),前面统一拼接"调节"(不分类型),形成如"调节 灯具开关"的标题。

卡片 Header 图标:按以下优先级取数:

  1. 优先使用标准语义库中配置的 icon 字段(如 light_powerfa-lightbulbhvac_target_tempfa-temperature-high
  2. 若标准语义未配置 icon,兜底使用固定图标 fa-sliders
  3. icon 通过 semanticKey 参数传入 renderSAControl,由 SemanticUtils.findItem(semanticKey).icon 获取

受控设备列表:利用 Agent 解析得出的空间路径(305会议室)和标准语义 Key(light_power),从"设备语义管理"库中查出该空间下所有具备 light_power 语义映射的设备,同时取出每台设备的别名。

设备当前状态:每台设备的当前实时值通过已映射的逻辑信号查询 IoT 平台获取。显示格式根据语义数据类型决定:

  • 布尔型:将原始值(0/1)通过设备映射中定义的"值→意图"翻译表转为"开启/关闭"等中文
  • 枚举型:将原始枚举值通过映射表转为中文字段标签(如 auto→"自动"、cool→"制冷")
  • 数值型:原始数值直接加上单位后缀(如"27.5℃")

判定多设备还是单设备:若查询结果只有 1 台设备,隐藏选择列表直接展示设备名称;若多台,展示选择列表,首项为"全场同步" Master 复选框。 确认执行按钮状态:当没有任何待操作设备(所有设备当前状态已与目标状态一致)时,确认执行按钮置灰不可点击。全场同步 Checkbox 同步置灰不可勾选。

3.2 多设备"全场同步"匹配逻辑

当用户指令命中多个设备时,系统从以下三个维度确定受影响设备:

  1. 空间路径锁定的范围:从用户话语中提取空间归属(如"305会议室"),遍历该空间及下级所有子空间
  2. 语义能力匹配:在上述空间范围内,筛选出所有已在"设备语义管理"中配置了当前语义 Key(如 light_power)映射的设备
  3. 上下文消歧:若用户明确指定了设备别名(如"主灯"),在上述结果中进一步过滤别名匹配的设备;若未指定,则命中全部

3.3 数值边界与多设备交集算法

适用于温度、亮度等数值调节场景:

单设备场景:滑块的 min/max/step 直接取自该设备在"设备语义管理"中配置的物理量程(range)和步长(step)。量程不可由管理员在空间侧修改,统一以 IoT 设备上报的物理边界为准。

多设备场景:滑块的 min/max/step 取所有受控设备的共享交集区间——min 取各设备 range 最小值中的最大值,max 取各设备 range 最大值中的最小值,step 取各设备的最小步长。例如设备 A 的量程为 14~28℃、设备 B 为 16~30℃,则交集为 16~28℃。

边界拦截逻辑:当用户设定的目标值超出交集范围时,不强停拒绝,而是由系统自动修正为目标值最近的合法边界值(低于下限则取下限,高于上限则取上限),同时在确认卡片的执行动作行追加提示文案告知用户做了修正。

4. 异常与回执

4.1 CONTROL 异常

响应时机反馈逻辑
执行中按钮文字变为"执行中... (1/2)",显示设备颗粒度的反馈。
边界拦截不直接强停,而是基于 共享区间 (Shared Range) 自动修正指令,并推送带文案提示的调节卡片。卡片滑块的 min/max 物理边界 必须动态调整为所有受控设备的 交集区间 (Intersection)。例如:A 为 14-24,B 为 16-28,则滑块范围强制限定在 16-24。
设备重名若空间内有两个同名设备(Admin 配置错误),显示设备序列号后缀。
全量已到位所有设备当前状态已与目标状态一致,确认执行按钮置灰不可点击,全场同步 Checkbox 同步置灰不可勾选。无需弹 Toast 提示,用户可自然感知"无需操作"。

Released under the Private License.