服务员 = ESP32(服务员小李) · 后厨 = 手机(后厨老王) · 大屏 = theater
场景一「加急下单」 · 场景二「老板的当日计划」
| 站位 | 设备 | 地址 |
|---|---|---|
| 服务员 小李 | ESP32 wm8960-e072a1f1c6a4 | 充电器供电(不要插 Mac USB) |
| 后厨 老王 | 手机 | https://192.168.1.75:8443/station?client_id=phone-01 |
| 大屏 | Mac | http://localhost:8765/theater |
手机全屏:Safari → 分享 → 添加到主屏幕 → 打开「Open as Web App」→ 从「后厨工位」图标启动。
curl -s http://192.168.1.75:8765/api/status curl -s http://192.168.1.75:8765/api/manager/staff curl -s http://192.168.1.75:8765/api/manager/commitments
要看到:两台设备都在 devices 里、recording_error 为 null、名单是 服务员小李(waiter/floor) + 后厨老王(cook/kitchen)、待办为空(上一条倒计时不能留在笔记本上)。
grep "demo microphone capture armed" ~/Library/Logs/wm8960-server.log | tail -1
必须打印出 armed for device_id=wm8960-e072a1f1c6a4。ESP32 的麦克风是坏的,靠 Mac 的麦克风代录;这行没有就等于白拍。
按住 ESP32 的 PTT 讲完再松手。Mac 的麦克风会在这段时间内代录 —— 请对着 Mac 讲。
ESP32 显示 PTT 发送中;大屏「工作群聊」最新一条在最上面,显示 服务员小李 · 前厅 和这句话的转写。
转写不准就重拍这一拍;实在不行用预置台词(见下方兜底)。
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"route","device_id":"phone-01",
"text":"老王,10号桌加急一份水煮雪花牛肉,请十分钟内出品。",
"speak":true,
"image":"/static/dishes/shuizhu-xuehua-niurou.jpg"}'
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"commitment","device_id":"phone-01",
"text":"10号桌 水煮雪花牛肉 出品","due_minutes":10}'
手机弹出 AI店长 卡片:出品标准照片 + 这句话,并且念出来;店长笔记本出现十分钟倒计时。第一条返回里 delivery_state 若是 failed,说明手机掉线了 —— 停,别拍。
按住手机上那块大面板讲话,松手。大屏出现 后厨老王 · 后厨 的这一条。
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"note",
"text":"水煮雪花牛肉是本店特色菜,提醒小李上菜时做菜品介绍。"}'
大屏右侧「店长笔记本」出现这条店长观察。
curl -s -X POST http://192.168.1.75:8765/api/manager/say \
-H 'content-type: application/json' \
-d '{"device_id":"wm8960-e072a1f1c6a4","voice":false,
"text":"小李,10号桌上菜时请介绍:主料选用安格斯牛肉,油脂分布均匀,口感细嫩。根据5种(四川二荆条提香,河南新一代,贵州子弹头取辣,贵州灯笼椒取香,贵州皱皮椒提色)不同辣椒的辣度和香味精心配比,用刀背剁至而成!辣而不燥,香味浓郁。著名电视主持人每次来都会点两份。"}'
ESP32 屏幕弹出 AI店长 浮层,整段可滚动,停留 20 秒。标点必须是真的 ,。()! 而不是方块。
老板把当天的计划交给 AI店长;店长把它变成自己的当日计划挂在笔记本上,然后分别提醒老王和小李各自今天要做的事。三条命令,中间留出镜头时间。
for t in \
"今日重点:本月新菜品研发,5道菜——3道利润款、2道品牌款,三天后交老板过目。" \
"今日重点:新员工培训材料,明天交老板审核。" ; do
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d "{\"kind\":\"note\",\"text\":\"$t\"}"
done
大屏右侧「店长笔记本」出现这两条店长观察。笔记本最多显示 6 条,别一次发太多。
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"remind","device_id":"phone-01","speak":true,
"text":"老王,本月新菜品研发三天后交老板过目:5道菜,3道利润款、2道品牌款。今天原计划做的是姜辣花胶。"}'
手机弹卡片并念出来。停一拍,再发出品细节:
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"remind","device_id":"phone-01","speak":true,
"text":"姜辣花胶\n主料:花胶\n辅料:绣球菌\n味型:麻辣\n菜品介绍:据《本草纲目》记载,花胶富含丰富的胶原蛋白、蛋白质等。能美容养颜、增强免疫力、补充营养,兼具补肾益精等传统滋补功效。味道鲜美,香气十足。上此道菜品配备剪刀,在桌上用卡池炉烧开,出香味后揭开盖子,用配备的剪刀分段,根据客人人数来分食。"}'
整段 145 字 / 427 字节,在 400 字与 480 字节的上限之内,不会被截断(已实测)。手机卡片可滚动。
curl -s -X POST http://192.168.1.75:8765/api/manager/demo/action \
-H 'content-type: application/json' \
-d '{"kind":"remind","device_id":"wm8960-e072a1f1c6a4","speak":false,
"text":"小李,新员工培训材料明天要交给老板审核。这已经是第三次返工了,这次特别注意:用AI来设计考核题目和评估练习案例。"}'
ESP32 浮层显示这段,停留 20 秒。ESP32 没有声音(硬件坏的),所以 speak 用 false —— 要有声音就把这拍也发到手机上。
场景二还差两个决定(等 Heng):
due_at 设三天后),但笔记本上会显示成几十小时,镜头上不如一句话干净。默认只用文字。ESP32 掉线(大屏显示离线)。这块板子的 Wi-Fi 信号本来就在噪声底附近,会自己断、也会自己回来,通常一分钟内。等它回来再拍,不要重启服务器 —— 重启会把它一起踢掉。
POST /api/manager/demo/transcript {"device_id":"wm8960-e072a1f1c6a4","text":"后厨后厨,10号桌加一份水煮雪花牛肉,加急。"}
预置后下一次按 PTT(超过 0.2 秒)就会用这句。https://192.168.1.75:8443/?client_id=phone-01,功能一样,只是长得不像设备。命令均已在 2026-08-24 实机验证:手机离线时 ④ 会明确返回
delivery_state: failed · manager target device is offline,不会假装成功。