玩具搭档:遥控玩具自扩展前端
这是一个与现有 apps/web-console 相互独立的自扩展前端。所有页面、样式、交互和本地 GSCU1B 桥接均位于当前目录,不需要改动主控制台。页面采用不需要纵向滚动的单屏工作台:左侧固定展示六类玩具区域,每类区域可添加并切换多台具体硬件;右侧预留车端设备动作。
能力范围
- 建立多个外设硬件档案,预定义为灯光类、声音类、动作类、玩偶类、机械类和其他玩具。
- 每个玩具类型区域均可添加多台同类硬件,并通过区域内的硬件选择框切换;新增硬件不会替换或占用其他类型区域。
- 添加硬件时从对应类型区域进入,再填写具体硬件名称;系统自动创建该类型的 12 个常见待学习动作。
- 每个类型区域一次展示 6 个动作,可在卡片内翻页;点击预设动作即可开始学习,不需要重复输入动作名称。
- 将实体遥控器的任意按键学习到 GSCU1B 的 1–248 号槽位。
- 为按键配置能力名称、自然语言别名、类型、说明和风险等级。
- 完成测试发射并由用户确认物理反应后,将按键注册为可执行能力。
- 由服务端 GPT 根据当前已学能力理解省略硬件名称的表达,例如只有一台灯光类外设时可直接说“打开灯光”。
- 将外设红外动作与 CAN_DEV 的座椅、空调、出风口、遮阳帘、车内灯光、车窗和门锁能力编排成同一份有序计划。
- 导出和导入玩具档案及能力注册;设备凭据不会进入导出文件或浏览器存储。
- 区分“学习器已发射”与“玩具物理执行成功”,后者始终需要独立确认。
- 在动作卡片上删除单项前端登记;使用“开始新一轮测试”调用 GSCU1B 全量
erase,同步清空全部已学动作和测试记录。
首次启动会创建一个“灯光测试玩具”,并在固定的灯光类区域显示开启、关闭、红/绿/蓝/白/暖色灯光、快速/慢速闪烁、亮度增减和呼吸灯效 12 个待学习动作。声音类、动作类、玩偶类、机械类和其他玩具区域也会直接展示各自的预设动作;添加具体硬件后即可学习。
运行
在当前目录运行:
python .\server.py
浏览器访问:
http://127.0.0.1:8010
默认监听 GSCU1B TCP 4444 并尝试连接真机。如需纯界面演示,可在启动前设置 $env:GSCU_TRANSPORT='simulation'。
GPT 智能编排
GPT 只在 server.py 中调用,API Key 不会进入 HTML、JavaScript、浏览器存储或接口响应。当前兼容服务使用 Responses API 流式结构化输出:
$env:OPENAI_BASE_URL='https://api.kendeji.fun/v1'
$env:OPENAI_API_KEY='请在本机安全设置,不要写入仓库'
$env:IR_OPENAI_MODEL='gpt-5.6-sol'
前端会把当前已学习的外设能力目录和 CAN_DEV 车端能力目录交给 GPT。GPT 只生成能力级计划:外设步骤只能引用已学习的能力 ID,车端步骤只能生成自然语言请求;原始 CAN 帧仍由 CAN_DEV 的确定性编译与安全校验链路生成。
CAN_DEV 车端能力
独立终端运行以下脚本,启动 127.0.0.1:8000 的车端编排服务:
.\run-vehicle-orchestrator.ps1
脚本优先使用 .codex_tmp/can-dev-runtime/Cognitive_Agent 中的 project-code/CAN_DEV 工作树;不存在时使用当前仓库的 Cognitive Agent。当前工作树可这样建立:
git remote add project-code https://git.kendeji.fun/dev-team/project-code.git
git fetch project-code CAN_DEV
git worktree add --detach .codex_tmp/can-dev-runtime project-code/CAN_DEV
前端桥接地址默认为 http://127.0.0.1:8000,可通过 COGNITIVE_AGENT_API_URL 修改。默认 COGNITIVE_AGENT_EXECUTION_MODE=dry_run,因此会完成 GPT 解析、配置校验、CAN 编译和虚拟执行,但不会发送真实 CAN。真实台架必须沿用 CAN_DEV 的硬件开关、授权令牌、固件身份和回读门禁,不应只修改前端。
GSCU1B TCP 接入
推荐首次联调使用局域网 TCP。GSCU1B 作为 TCP Client 连接到电脑:
- 使用 5V/1A Type-C 电源给学习器上电,并将其配置到与电脑相同的 2.4GHz Wi-Fi。
- 查询电脑的局域网 IPv4 地址。
- 将设备的自定义 TCP 服务器地址设置为该 IPv4 地址,端口设为
4444。 - 在本目录打开 PowerShell 并运行:
$env:GSCU_TRANSPORT='tcp'
$env:GSCU_TCP_LISTEN_HOST='0.0.0.0'
$env:GSCU_TCP_PORT='4444'
python .\server.py --host 0.0.0.0 --port 8010
- 必要时允许 Windows 防火墙入站 TCP
4444;若 PAD 访问页面,还要允许8010。 - 重启学习器,打开页面右上角“连接真机”,保存后刷新,直到显示“学习器已连接”。
PAD 或其他电脑通过 http://<电脑局域网IP>:8010 访问。真实环境应只在可信局域网使用,或在外部增加认证与 HTTPS 反向代理。设备能力与供电参数以 GSCU1B 产品说明 为准,指令字段以 官方开发指令 和实际固件返回为准。
GSCU1B MQTT 接入
安装 MQTT 依赖:
python -m pip install -r .\requirements.txt
配置设备对应的 Broker 和主题后启动:
$env:GSCU_TRANSPORT='mqtt'
$env:GSCU_MQTT_HOST='mqtt.geek-smart.cn'
$env:GSCU_MQTT_PORT='1883'
$env:GSCU_MQTT_CLIENT_ID='ir-toy-console-unique-id'
$env:GSCU_MQTT_USERNAME='your-username'
$env:GSCU_MQTT_PASSWORD='your-password'
$env:GSCU_COMMAND_TOPIC='/device/subscribe-topic'
$env:GSCU_RESPONSE_TOPIC='/device/publish-topic'
python .\server.py
如果使用 TLS,再设置:
$env:GSCU_MQTT_TLS='true'
MQTT 密码和主题只存在于服务端环境变量中,不会发送给浏览器。
固件协议兼容
本地控制资料使用 data.no 传递 learn 和 emit 的槽位,而部分官方示例使用顶层 no。桥接默认采用本地资料的 data.no 形式:
$env:GSCU_SLOT_FIELD_MODE='data'
如果实际固件要求顶层字段:
$env:GSCU_SLOT_FIELD_MODE='top_level'
切换后重启 server.py。
文件说明
index.html 独立页面结构
styles.css 响应式视觉样式
app.js 玩具档案、学习状态机、能力库和一句话编排
server.py 静态服务及 GSCU1B HTTP/TCP/MQTT 桥接
run-vehicle-orchestrator.ps1 启动 CAN_DEV 车端编排服务
requirements.txt MQTT 模式可选依赖
README.md 运行与设备接入说明
当前边界
- 能力库默认存储在当前浏览器的
localStorage,适合自扩展原型和单机测试。 - 同一个 GSCU1B 的红外发射按顺序执行,不声明真正并行;GPT 计划会保留“5 秒后”等相对等待语义,在对应动作执行前倒计时。单步等待上限为 60 秒,整份计划累计等待上限为 5 分钟。
- 车端默认为 CAN_DEV
dry_run安全演练;只有 CAN_DEV 自身硬件门禁全部通过时才允许真实下发。 - GSCU1B 资料只提供全量
erase,没有单槽位擦除。删除单项能力只删除注册映射;需要硬件完全归零时使用页面顶部“开始新一轮测试”。 - 红外设备通常没有玩具状态回读;页面中的成功代表学习器命令已处理,不代表玩具动作已由传感器确认。