[{"data":1,"prerenderedAt":-1},["ShallowReactive",2],{"project-93194":3},{"id":4,"name":5,"fullName":6,"owner":7,"repo":5,"description":8,"homepage":9,"htmlUrl":9,"language":10,"languages":9,"totalLinesOfCode":9,"stars":11,"forks":12,"watchers":13,"openIssues":14,"contributorsCount":14,"subscribersCount":14,"size":14,"stars1d":14,"stars7d":14,"stars30d":14,"stars90d":14,"forks30d":14,"starsTrendScore":14,"compositeScore":15,"rankGlobal":9,"rankLanguage":9,"license":16,"archived":17,"fork":17,"defaultBranch":18,"hasWiki":19,"hasPages":17,"topics":20,"createdAt":9,"pushedAt":9,"updatedAt":21,"readmeContent":22,"aiSummary":23,"trendingCount":14,"starSnapshotCount":14,"syncStatus":24,"lastSyncTime":25,"discoverSource":26},93194,"signal_light_demo","robeortZ\u002Fsignal_light_demo","robeortZ","A project for managing TuyaOpen",null,"C",51,6,5,0,42.54,"Apache License 2.0",false,"main",true,[],"2026-07-22 04:02:08","# signal_light_demo\n\n在 **TUYA T5AI CORE** 开发板上实现的桌面「AI 编程助手」硬件伴侣：抬头看灯\u002F屏即知 Cursor Agent 在干什么，长按说话即可把听写文字注入 Mac 当前输入框。\n\n## 实物展示\n\n![实物展示](source\u002Fembedded\u002Fdoc\u002Fshiwu.jpg)\n\n> **3D 模型文件**：核心板红绿灯外壳的 3D 模型位于 [`source\u002Fembedded\u002Fdoc\u002F`](source\u002Fembedded\u002Fdoc\u002F)：\n> - 渲染预览：[`source\u002Fembedded\u002Fdoc\u002F3D模型.png`](source\u002Fembedded\u002Fdoc\u002F3D模型.png)\n> - STEP 源文件：[`source\u002Fembedded\u002Fdoc\u002F核心板红绿灯.step`](source\u002Fembedded\u002Fdoc\u002F核心板红绿灯.step)\n\n---\n\n| 能力 | 说明 |\n|------|------|\n| **状态灯** | 绿 \u002F 黄 \u002F 红 LED，与 Cursor \u002F Claude Code 生命周期联动 |\n| **状态屏** | 128×64 SSD1306 OLED：Agent 状态 + 活跃链路标签 |\n| **云端听写** | P29 长按 → 涂鸦云端 Agent → **AI 回复文字**发到 PC 输入框 |\n| **P17 外接键** | **单击** → Mac 热键；**双击** → 回车；**长按** → 云端按住说话 |\n| **语音热键** | P17 单击 → Mac 注入 `Ctrl+Fn`（可配置） |\n| **PC 桥接** | 默认 **局域网 WebSocket**；可切回 UART 串口 |\n\n固件基于 `TuyaOpenSDK\u002Ftools\u002Fapp_template\u002Fbase` 脚手架，源码在 `source\u002Fembedded\u002F`。\n\n---\n\n## 硬件接线（T5AI CORE）\n\n| 引脚 \u002F 接口 | 功能 | 备注 |\n|-------------|------|------|\n| GPIO 5 \u002F 6 \u002F 7 | 绿 \u002F 黄 \u002F 红 LED | 低电平亮 |\n| GPIO 14 \u002F 15 (I2C) | SSD1306 OLED | 地址 `0x3C` |\n| **P29** (`ai_chat_button`) | 云端 Agent 语音 | 长按说话（板载键，封装后可能被遮挡） |\n| **P17** | 外接按键（TDL 驱动） | **单击** = Mac 热键；**双击** = 回车；**长按 ≥400ms** = 云端按住说话 |\n| USB 口 **8421** @ 115200 | UART0 桥接（回退通道） | 与 `tal_cli` 共用 |\n| USB 口 **8423** @ 460800 | 调试日志 | `tos.py monitor`，勿占作桥接 |\n\n设备与 Mac\u002FPC 需在同一 Wi-Fi 下使用默认 **WS 模式**。\n\n---\n\n## Agent 状态\n\n| 状态 | LED | OLED 主行 |\n|------|-----|-----------|\n| `idle` | 绿灯常亮 | `IDLE`；空闲 **1 分钟** 后显示本地 `HH:MM`（需时间已同步） |\n| `working` | 绿→黄→红 慢循环 | `WORKING` |\n| `attention` | 黄灯闪烁 | `ATTENTION` |\n| `urgent` | 红灯快闪 + 屏边框 | `URGENT` |\n\nOLED 左上角为助手图标，右上角显示当前活跃链路：`LAN`（WebSocket）或 `UART`。断连 **1 分钟后** 右上角显示 `DISCONN`，主行仍显示 Agent 状态或时钟。\n\n---\n\n## 快速开始\n\n### 1. 编译与烧录固件\n\n```bash\ncd source\u002Fembedded\ntos.py check\ntos.py build\ntos.py flash\n```\n\n### 2. 启动 PC 桥接（设备自动发现 PC IP）\n\n在项目根目录：\n\n```bash\n.\u002Ftools\u002Frun_bridge.sh\n```\n\n脚本会：\n- 启动 WebSocket 服务（`8765`）\n- **每 2 秒 UDP 广播**桥接地址（`8766`），设备收到后自动连接，**无需再改固件 IP**\n\n`CONFIG_SIGNAL_BRIDGE_HOST` 仅作回退：发现超时未收到广播时才使用。\n\n同步可选修改 `tools\u002Fsignal_bridge_config.json`：\n\n```json\n\"discovery_enabled\": true,\n\"discovery_port\": 8766,\n\"discovery_interval_ms\": 2000\n```\n\n### 3. 设备配网\n\n首次使用通过涂鸦 Smart Life App 为设备配网；联网后云端同步时间，OLED 空闲时钟才可用。\n\n### 4. Cursor Hooks（状态灯联动）\n\n项目已包含 `.cursor\u002Fhooks.json`。在 **本仓库根目录** 用 Cursor 打开项目后，Agent 生命周期事件会自动推送到设备。\n\n> 桥接进程由 `run_bridge.sh` 独占；Hook 脚本只推送状态，不会重复占用串口。\n\n---\n\n## 传输通道\n\n| 模式 | 方向 | 适用场景 |\n|------|------|----------|\n| **ws**（默认） | 设备 → Mac `ws:\u002F\u002FIP:8765\u002Fdevice` | 同 WiFi，不占 USB 串口 |\n| **uart** | USB 8421 @ 115200 | 无局域网或调试 |\n| **ble** | 实验性 | 默认关闭（与涂鸦配网 BLE 冲突） |\n\n切换方式：\n\n```bash\npython3 tools\u002Fsignal_transport_switch.py ws    # 或 uart\npython3 tools\u002Fsignal_transport_switch.py status\n```\n\n也可环境变量覆盖：`export SIGNAL_BRIDGE_TRANSPORT=uart`，然后重启 `run_bridge.sh`。\n\n优先级（固件）：**WS > UART**（WS 连接且活跃时优先）。\n\n---\n\n## PC 桥接配置\n\n`tools\u002Fsignal_bridge_config.json` 主要字段：\n\n| 字段 | 说明 |\n|------|------|\n| `transport` | `ws` \u002F `uart` \u002F `ble` \u002F `auto` |\n| `ws_listen_host` \u002F `ws_listen_port` | WS 服务监听（默认 `0.0.0.0:8765`） |\n| `discovery_enabled` | 是否 UDP 广播 PC IP（默认 `true`） |\n| `discovery_port` \u002F `discovery_interval_ms` | 发现端口与广播间隔（默认 `8766` \u002F `2000ms`） |\n| `device_bridge_host` | 文档用回退 IP，与固件 `CONFIG_SIGNAL_BRIDGE_HOST` 一致即可 |\n| `uart_port` | macOS 如 `\u002Fdev\u002Fcu.wchusbserial…8421` |\n| `voice_input_mode` | `asr` \u002F `hotkey` \u002F `both`（推荐 `both`） |\n| `voice_hotkey` | Mac 热键，默认 `ctrl+fn` |\n| `enter_hotkey` | P17 双击注入的回车，默认 `enter`；Cursor 审批可试 `cmd+enter` |\n| `keepalive_interval_ms` | 空闲时周期性 `idle` 保活 |\n\n---\n\n## 设备 ↔ PC 协议（文本行）\n\n每行以 `\\n` 结束，经 WS 或 UART 传输。\n\n| 方向 | 示例 | 含义 |\n|------|------|------|\n| PC → 局域网 UDP | `SIGNAL_BRIDGE ip=172.16.28.66 port=8765` | 桥接发现广播（`:8766`） |\n| PC → 设备 | `SIGNAL working\\n` | 设置 Agent 状态 |\n| PC → 设备 | `idle` \u002F `working` \u002F … | 简写（keepalive） |\n| 设备 → PC | `ASR \u003CAI回复文本>\\n` | P29 云端对话完成后注入 NLG 全文 |\n| 设备 → PC | `VOICE down\\n` \u002F `VOICE up\\n` | P17 **单击**热键脉冲 |\n| 设备 → PC | `KEY enter\\n` | P17 **双击**回车 |\n\n设备 CLI（经调试口或 UART0 `tal_cli`）：\n\n```text\nSIGNAL working\nsignal set attention\n```\n\n---\n\n## 项目结构\n\n```\nsignal_light_demo\u002F\n├── .cursor\u002Fhooks.json          # Cursor Agent → 状态灯 Hook\n├── .tuyaopen\u002F                  # IDE 元数据、板级 spec、产品快照\n├── source\u002F\n│   ├── embedded\u002F               # 固件（在此 build \u002F flash）\n│   │   ├── src\u002F\n│   │   │   ├── tuya_main.c           # 入口、IoT、模块初始化\n│   │   │   ├── agent_status.c        # 状态模型\n│   │   │   ├── signal_led.c          # LED 图案\n│   │   │   ├── signal_oled.c         # OLED UI + 空闲时钟\n│   │   │   ├── signal_transport.c    # UART \u002F WS 统一收发\n│   │   │   ├── signal_ws.c           # LAN WebSocket 客户端\n│   │   │   ├── signal_discovery.c    # UDP 发现 PC 桥接\n│   │   │   ├── signal_voice_key.c    # P17 热键\n│   │   │   └── app_chat_bot.c        # P29 云端 ASR\n│   │   ├── include\u002Fsignal_config.h   # 引脚、超时、桥接地址\n│   │   └── app_default.config        # Kconfig 默认值\n│   └── miniapp\u002F                # 面板占位\n├── tools\u002F\n│   ├── run_bridge.sh \u002F run_bridge.bat   # 入口：安装依赖 + 启动桥接\n│   ├── signal_bridge_config.json        # 传输\u002F串口\u002F热键\u002F发现 配置\n│   ├── requirements-bridge.txt\n│   │\n│   ├── signal_bridge_run.py             # 桥接启动器（run_bridge 调用）\n│   ├── cursor_signal_keepalive.py       # 核心守护：WS\u002FUART + ASR\u002F热键注入\n│   ├── cursor_signal_hook.py            # Cursor Hook → 推状态\n│   ├── cursor_signal_bridge.py          # CLI 手动推状态 \u002F BLE 扫描\n│   │\n│   ├── signal_ws_server.py              # WebSocket 服务端\n│   ├── signal_discovery.py              # UDP 发现广播\n│   ├── bridge_transport.py              # ws\u002Fuart\u002Fble 模式解析\n│   ├── uart_ipc.py                      # Hook → 守护进程 Unix socket\n│   ├── signal_transport_switch.py       # 切换 transport 配置\n│   ├── signal_bridge_log.py             # 统一日志\n│   │\n│   ├── mac_text_inject.py               # Mac 文本注入（剪贴板+Cmd+V）\n│   ├── mac_hotkey_inject.py             # Mac 热键注入（P17）\n│   └── signal_mock_client.py            # UART 调试：模拟 PC 发 SIGNAL\n├── tuyaopen.project.ini\n└── README.md\n```\n\n---\n\n## 常用命令\n\n```bash\n# 固件\ncd source\u002Fembedded && tos.py build && tos.py flash\n\n# 串口日志（调试口 460800，勿与桥接串口混淆）\ncd source\u002Fembedded && tos.py monitor\n\n# PC 桥接\n.\u002Ftools\u002Frun_bridge.sh\n\n# 模拟 PC 发状态（UART 调试）\npython3 tools\u002Fsignal_mock_client.py working\n```\n\n---\n\n## 故障排查\n\n| 现象 | 检查 |\n|------|------|\n| OLED 右上角无 `LAN` | 是否同 WiFi、`run_bridge.sh` 是否在跑、发现是否开启 |\n| 一直显示 `IDLE` 不显示时间 | 是否联网且 NTP\u002F云端时间已同步；是否空闲满 1 分钟 |\n| ASR 不进输入框 | `voice_input_mode` 是否为 `both` 或 `asr`；桥接日志是否有 `ASR` |\n| P17 热键无效 | `voice_input_mode` 含 `hotkey`；Mac 辅助功能是否允许输入模拟 |\n| UART 占用 | 关闭其他占用 8421 的进程；或改用 `transport: ws` |\n| Hook 无反应 | 是否从本仓库根目录打开 Cursor；`run_bridge.sh` 是否已启动 |\n\n---\n\n## 参考\n\n- AI Agent 开发说明：[`AGENTS.md`](AGENTS.md)\n- 板级引脚与保留 GPIO：`.tuyaopen\u002Fide\u002Fplatform.json`、`.tuyaopen\u002Fide\u002Fboard.json`\n- Mini App：`source\u002Fminiapp\u002FREADME.md`\n\n","这是一个基于Tuya T5AI CORE开发板的AI编程助手硬件状态伴侣，通过LED灯、OLED屏实时同步Cursor\u002FClaude Code等AI代理的运行状态，并支持长按语音输入、按键快捷注入文字到Mac当前输入框。核心功能包括多状态LED指示（idle\u002Fworking\u002Fattention\u002Furgent）、128×64 OLED状态显示、局域网WebSocket桥接、云端语音听写与PC输入框文本注入，固件采用C语言开发，兼容TuyaOpenSDK。适用于开发者在本地AI编程工作流中需要物理态反馈与免手操作的场景，如长时间运行Agent时快速感知状态、语音触发代码补全或指令输入。",2,"2026-07-12 02:30:09","CREATED_QUERY"]