感知范围控制 — 管理 miloco 感知哪些家庭、哪些摄像头,每台摄像头的声音(是否参与感知),每台摄像头的「感知须知」(专属 prompt,补机位环境 / 关注 / 忽略以提升感知准确性),以及每台摄像头的「智能裁切增强」(Smart Crop,送模型的画面构图:裁主体 vs 送整幅)。用户说「只用/不用某家庭」「让 miloco 感知/别感知 某家庭或摄像头」「屏蔽某摄像头/把某摄像头从感知里去掉」「把某摄像头声音关了/打开」「XX 老误报(声音类)」「哪些家庭在用」时激活;也在用户吐槽**画面/视觉类固定误识**时激活——「门口摄像头老把电梯门当成我家门」「XX 老把 Y 认成 Z」「这台摄像头总把走廊的人当成家里人」「能不能告诉它忽略窗外的马路」等,用「感知须知」给该机位补指导;还在用户提**画面构图**类诉求时激活——「这台别裁了 / 只看整个画面 / 别老对着一块地方」「这台小目标看不清 / 远处的东西看不清」「智能裁切给这台关了 / 打开」等,用「智能裁切增强」(Smart Crop:裁主体 vs 送整幅)逐机位调。注意区分:开关摄像头设备本身(开机/关机/电源/录制)走 miloco-devices;感知引擎自身的开关/参数(分辨率档 / 全局裁切闸 / 感知窗口大小等)**没有 skill 覆盖**,miloco-perception 只有 perceive devices / logs / query / clear 四条命令(前三条是查询,clear 是清空感知流缓冲,都不是配置/开关),别往那儿转——正确入口(网页「设置」或 miloco-cli config set)与全局闸和逐机位闸的关系,见本 skill 正文。
73
92%
Does it follow best practices?
Run evals on this skill
Adds up to 20 points to the overall score
Passed
No findings from the security scan
控制 miloco 接入哪些家庭和哪些摄像头。
家庭:登录后自动启用首个家庭(按 home_id 字典序兜底),多家庭账号可通过 scope home switch <id> 切换。同时只能启用一个家庭,切换时其余自动停用。
摄像头(视频感知):默认全部启用。scope camera disable <did> 停用感知、scope camera enable <did> 恢复。新增摄像头默认接入。
摄像头声音(是否参与感知):默认关闭(opt-in,用户按场景显式开启)。scope camera mic-on <did> 开启——该相机声音开始参与感知(识别语音指令、理解环境声);mic-off 关闭后声音完全不被处理(不识别、不理解、不上云、听不到语音指令),视频照常感知。从属于视频感知:感知已 disable 的相机不能设声音。默认关的原因是当前远场拾音质量不稳、嘈杂环境易误报。
声音开关的定位是「每摄像头的信噪比开关」——安静房间(书房 / 卧室)开、嘈杂位(对着电视 / 街边窗口)保持关;用户抱怨某摄像头声音类误报是典型触发词(多半是嘈杂位被开了声音,建议关)。
摄像头感知须知(每台专属 prompt):给某台摄像头补一段自定义指导——机位环境描述、要关注的东西、要忽略的东西。逐感知窗注入该相机的视觉感知,指导模型消解固定误识。scope camera prompt-set <did> "<文本>" 设置、prompt-clear <did> 清除。默认无。与视频 / 声音开关正交:不从属感知开关,相机关着也能预配,只在被感知时生效;改动下一窗即生效、不重启。上限 500 字。典型用途:门口机位能看到公共走廊的电梯门,模型误把电梯门开合当自家入户门 → 用须知说明「画面右侧是公共走廊电梯门,与本户无关,只有正中木色入户门才是本户」。
摄像头智能裁切增强(Smart Crop,逐机位):默认开启。开启时 miloco 会在该机位画面里裁出主体区域再送模型,等效提高主体分辨率、小目标看得更清;关掉即该路改送整幅画面(分辨率档不变)。scope camera crop-off <did> 关、crop-on <did> 开回默认。逐路可配(did:chN,同 prompt-set),因为裁不裁取决于该路镜头的视野。与视频 / 声音 / 须知开关正交,不从属感知开关(相机关着也能预配),改动下一窗即生效、不重启。另有一对全局开关(crop_enhance.enabled / user_enabled)与之相与:全局关时逐机位设了也不生效。这对开关不在本 skill、也不在 miloco-miot-admin(后者只覆盖 status / home-info / cost)——user_enabled 在网页「设置」里的「智能裁切增强」开关(拨 UI 走 admin API、热更、下一窗生效)。enabled 是发版级开关,admin API 不写它,随包 settings.yaml 发布。
用 CLI 改这两个都要注意两件事:① config set 写的是本机 config.json,enabled 也在 CLI 白名单里——哪台机器执行过 config set perception.engine.crop_enhance.enabled,之后就固定读 config.json,后续发版改 yaml 对这台机器不再生效;② config set 默认会顺手重启后端(因为后端 get_settings() 有进程级缓存,CLI 只落盘清不掉),显式传 --no-restart 时改动对运行中的后端等于没生效——正是「以为已经关掉了、实际还在裁」那种失效态。用户反馈「逐机位关了没效果 / 开了没效果」时,先用 scope camera list 定位配置层。crop_effective=false 时按这三种情形反查:in_use=false = 这一路没进感知采集,先别急着 scope camera enable——in_use 是一串条件的合取(不在黑名单 且 家庭已启用 且 online and lan_online 且 该路镜头未关 且 没被 MAX_ENABLED_CAMERAS=4 按合成 did 升序截掉),enable 只动"不在黑名单"这一项。先看同一行的 is_online(云端在线 且 局域网可达)/ connected(流已订阅)/ awake(该路镜头开关:true 开 / false 关(隐私遮挡)/ null 该机型无此属性或读取失败):离线、不在同一局域网、镜头被物理关闭、或已超出 4 台名额时,这台本来就不在黑名单里,enable 会因"集合无变化"直接短路、连 KV 都不写,接口照样返回成功但 in_use 不会变——此时该报的是真实原因,不是重试 enable;in_use=true 且 crop_in_use=false = 这一路自己关了裁切;in_use=true 且 crop_in_use=true = 被全局闸挡住(逐机位怎么设都是白设),引导用户去网页「设置」开全局开关,不要转给 miloco-miot-admin。
若 crop_effective=true 而用户仍反馈「小目标看不清 / 开了没效果」,先看同一行的 connected。 crop_effective 只合了「被选中 + 全局双闸 + 本路偏好」,不含「流是否真订阅上」:connected=false 时这一路根本没进感知窗、裁切判定一次都没被调用,grep adaptive_crop_fallback 会是 0 命中——该报的是拉流未建立,别当成内容层回退。connected=true 才轮到下面这一层。
connected 也正常、仍反馈没效果,那就不是配置问题,别停在这里。 该字段只表示三道闸全开,不表示每一窗真的裁了:闸开之后还有逐窗的内容层判定会回退全景——裁切区域(窗口内主体检测框与帧差分运动块两者的并集,再做扩展与最小面积放大)本窗无检测框且无显著运动块(reason=no_activity,空房间 / 静止画面下最常见的一条,属正常回退、无需处置)、区域面积超上限 crop_max_area_ratio=0.49 或不足下限 crop_min_area_ratio=0.10、区域退化、本窗无帧、编码或 JPEG 产物过短等。这里只是举例,完整清单(11 项及各自的 reason= 取值)在 omni/prompt_builder._maybe_encode_adaptive 的 docstring,以那份为准,别把本段当全集。广角机位尤其容易撞上上限:一个人在 4 秒窗里横穿客厅,并集就可能越过半个画面;即使画面里只有一个人不动,电视亮着 / 窗帘飘动 / 摄像头轻微位移产生的运动块也会把并集撑开——所以别用"画面里就一个人、并集不可能超过 0.49"来排除这条。这一层 scope camera list 完全看不出来,只能看后端日志:miloco-cli service logs -n 200 | grep adaptive_crop_fallback(全仓只有 service logs 能读后端应用日志——不是 perceive logs,那个查的是结构化感知事件流;也不在 miloco-miot-admin 名下)。原因看 reason=;reason=area_too_large 那行还会带出 union= 框,是唯一能看出"谁把并集撑开了"的线索。
所有子命令未知 did/id 均被拒绝(防 typo)。先 list 确认合法再操作。
scope camera disable/enable;想停掉整个后端 → miloco-cli service stop/start。miloco-perception 不能做这两件事,它只有 perceive devices / logs / query / clear 四条命令(均不能开关感知引擎),别往那儿转perceive devices / perceive logs / perceive query / perceive clear 四条命令(前三条查询,clear 清空感知流缓冲),没有任何配置/参数命令。直接引导用户去网页「设置」,或给出 miloco-cli config set perception.<配置路径> <值>(注意它默认会重启后端,见本文档裁切段落的说明)miloco-cli device refresh)。miloco-miot-admin 的 home-info 只是读一遍打计数,不刷新miloco-cli perceive clear(POST,清空所有感知设备的流缓冲区)。不是配置项,别引到网页「设置」或 config setevent=adaptive_crop_fallback 这类感知内部事件)= 没有 skill 覆盖:直接给 miloco-cli service logs -n 200(持续跟踪加 -f),全仓只有这一条能读后端应用日志。miloco-miot-admin 不能做这件事(只有 status / home-info / cost);perceive logs 查的是结构化感知事件流、grep 不到 adaptive_crop_fallback,也别往那儿转这是最易混的一组,务必按用户原话区分:
scope camera disable。scope camera mic-off / mic-on。scope camera prompt-set(写「感知须知」,见下文流程)。判据(四路分流):
scope camera enable/disable。scope camera mic-on/mic-off。scope camera prompt-set。scope camera crop-off/crop-on。注意这不是改分辨率档(video_short_edge,管多清晰;裁不裁与多清晰正交)——分辨率档和上面那对全局裁切闸在同一处:网页「设置」或 miloco-cli config set perception.engine.input.video_short_edge <值>。它不在 miloco-miot-admin(只有 status / home-info / cost);上面那条「调感知参数」的路由也覆盖不到它(miloco-perception 只有 perceive devices / logs / query / clear 四条命令,没有任何配置命令——不是缺分辨率档这一条,是整个配置面都不在那儿),所以别转给任何 skill,直接按上面这一处引导用户。也不是改看不看它。用户说「误报 / 误识」时先分清是哪一类:
mic-off 关这台声音。prompt-set 写须知补指导,不要关摄像头/关声音(那样会丢掉这台的正常感知)。miloco-cli scope home list | switch <id>
miloco-cli scope camera list | enable <did>... | disable <did>...
miloco-cli scope camera mic-on <did>... | mic-off <did>...
miloco-cli scope camera prompt-set <did> "<文本>" | prompt-clear <did>...
miloco-cli scope camera crop-on <did>... | crop-off <did>...switch <id>:切换到该家庭(唯一启用),其余自动停用。只接受 1 个 id。enable/disable <did>...:视频感知批量启用/停用,可同时操作多个 did。mic-on/mic-off <did>...:声音批量开/关,同款批量 did 语义。mic-off = 该相机声音完全不被处理;仅感知已启用(in_use=true)的相机可设,感知已关闭时整批被拒。改动即时生效、无需重启。prompt-set <did> "<文本>":给该机位设自定义「感知须知」(文本务必加引号)。prompt-clear <did>... 清除(可批量)。上限 500 字,超限被后端拒。与启用/声音开关正交,不从属感知,改动下一窗即生效、不重启。crop-on/crop-off <did>...:智能裁切增强批量开/关,同款批量 did 语义,精确到路(did:chN;裸多通道 did = 该台全部通道)。crop-off = 该路改送整幅画面。不校验 in_use(关着的相机也可预配)。与全局双闸相与,全局关时不生效但不报错。改动下一窗即生效、不重启。list 输出每项含 in_use(是否启用);camera 额外带 room_name(房间名——相机 name 常是「小米智能摄像机 2 代」这类泛称,按房间定位机位靠它)、is_online(设备在线,= cloud_online AND lan_reachable,这两个分量也一并透出)、connected(流已订阅)、awake(该路镜头开关,null=机型无此属性或读取失败)、voice_in_use(声音开关)、crop_in_use(该路智能裁切存储偏好,默认 true)、crop_effective(智能裁切生效态 = in_use AND 全局双闸 AND crop_in_use)和 perception_prompt(该机位自定义感知须知)。in_use/is_online/connected 三者都 true = 正常采集,任一 false 即某层未就位。voice_in_use=false = 该相机声音完全不被处理(不转写、不上云、听不到指令),视频照常感知。scope home switch <id> 直接切换,其余自动停用。scope camera disable <其它所有 did> 停用不需要的。scope home switch <id> / scope camera enable <did>。| 操作 | 校验规则 |
|---|---|
| 家庭 switch | 拒绝未知 home_id(切到不存在的家庭无意义) |
| 摄像头 enable | 拒绝未知 did |
| 摄像头 disable | 拒绝未知 did |
| 摄像头 mic-on/mic-off | 拒绝未知 did;拒绝感知已关闭(in_use=false)的相机(声音从属于视频感知,先 enable 再设声音) |
| 摄像头 prompt-set/prompt-clear | 拒绝未知 did;拒绝超 500 字。不校验 in_use(关着的相机也可预配须知) |
| 摄像头 crop-on/crop-off | 拒绝未知 did;拒绝越界通道号(:chN 超出该台通道数)。不校验 in_use,也不校验全局双闸(全局关时可设但不生效) |
未知 id / 从属违规由 backend 拒绝并返回错误,CLI 透传错误信息。若不确定 id 合法性,先 scope home list / scope camera list 看一眼。
用户吐槽某摄像头有固定的画面误识(老把 X 当 Y、被某类东西干扰)时,别急着写,按这个闭环走:
scope camera list,按 name/room_name 找到那台的 did。若用户描述模糊,读该 did 的当日感知日志(memory/YYYY-MM-DD-miloco-perception.md,或用 memory_search)确认误识的具体表现:把什么当成了什么、什么时候、画面里的位置。scope camera prompt-set <did> "<确认后的文本>",然后告诉用户:下一个感知窗即生效、无需重启;若之后仍有误识,可以继续追加/调整须知,或让你 prompt-clear 重来。prompt-set 是整段覆盖。若这台已配过(perception_prompt 非空),先读出旧文本,在其上增补后整段写回,别把用户之前的指导冲掉。不要用须知去表达"关掉这台/关声音"——那是 disable/mic-off 的活;须知只用来让保留的感知看得更准。
is_online=false = 设备 / 网络层问题,不在本 skill 范围;让用户检查设备本身。connected=false 且 in_use=true && is_online=true = 接入配置已就绪但流还没拉起来。等一个 sync_devices() 周期;若过了周期仍不连,问题不在接入配置,走 miloco-perception。sync_devices() 热同步,无需重启服务。响应形状(下面各例共用):所有返回相机列表的命令(
list/enable/disable/mic-*/crop-*/prompt-*)返回的行是同一个形状,即下面scope camera list那一份。 差别只有一处:只有list会过 CLI 展示层变换(多通道相机的did拼成did:chN,并去掉channel/channel_count);其余命令直接打印后端响应,did是裸物理 did 且带channel/channel_count。为省篇幅,list以外的示例只列出与该次操作相关的键, 其余用…略过——不是这些命令的响应真的更短。
# 查看接入状态(list 返回 {code, message, data} 信封)
$ miloco-cli scope home list
→ {"code":0,"message":"ok","data":[
{"home_id":"611001054724","home_name":"HCl的家","in_use":false},
{"home_id":"611001866489","home_name":"xiaomi","in_use":true}]}
$ miloco-cli scope camera list
→ {"code":0,"message":"ok","data":[
{"did":"1154253569","name":"小米智能摄像机C700","room_name":"客厅",
"cloud_online":true,"lan_reachable":true,"is_online":true,"voice_in_use":true,
"awake":true,"in_use":true,"connected":true,"perception_prompt":"",
"crop_in_use":true,"crop_effective":true},
{"did":"1154253570:ch0","name":"小米智能摄像机C700","room_name":"次卧",
"cloud_online":true,"lan_reachable":true,"is_online":true,"voice_in_use":false,
"awake":true,"in_use":true,"connected":true,"perception_prompt":"",
"crop_in_use":true,"crop_effective":true},
{"did":"1154253570:ch1","name":"小米智能摄像机C700","room_name":"次卧",
"cloud_online":true,"lan_reachable":true,"is_online":true,"voice_in_use":false,
"awake":true,"in_use":true,"connected":true,"perception_prompt":"",
"crop_in_use":true,"crop_effective":true},
{"did":"1154253571","name":"小米智能摄像机C700","room_name":"门口",
"cloud_online":true,"lan_reachable":true,"is_online":true,"voice_in_use":false,
"awake":true,"in_use":true,"connected":true,"perception_prompt":"",
"crop_in_use":true,"crop_effective":true}]}
# ↑ 双摄(1154253570)在 list 里是**两行**、did 已拼成 `did:chN`(`channel` /
# `channel_count` 已并入 did,list 输出里没有这两个键);单摄保持裸 did。
# 这里的 did 可**直接复制**给 crop-off / prompt-set 精确到某一路。
# 切换到 xiaomi 家庭(其余自动停用,返回全量家庭列表)
$ miloco-cli scope home switch 611001866489
→ {"code":0,"message":"ok","data":[
{"home_id":"611001054724","home_name":"HCl的家","in_use":false},
{"home_id":"611001866489","home_name":"xiaomi","in_use":true}]}
# 切换到另一个家庭
$ miloco-cli scope home switch 611001054724
→ {"code":0,"message":"ok","data":[
{"home_id":"611001054724","home_name":"HCl的家","in_use":true},
{"home_id":"611001866489","home_name":"xiaomi","in_use":false}]}
# 停用一台摄像头(返回操作后的摄像头列表)
$ miloco-cli scope camera list # 看 did
$ miloco-cli scope camera disable 1154253569
→ {"code":0,"message":"ok","data":[
{"did":"1154253569","name":"小米智能摄像机C700","channel":0,"in_use":false,"connected":false,…}]}
# 恢复被停用的摄像头
$ miloco-cli scope camera enable 1154253569
→ {"code":0,"message":"ok","data":[
{"did":"1154253569","name":"小米智能摄像机C700","channel":0,"in_use":true,"connected":true,…}]}
# 「客厅电视老误报,把客厅摄像头声音关了」——关声音(视频照常感知)
$ miloco-cli scope camera list # 按 room/name 找到客厅摄像头 did
$ miloco-cli scope camera mic-off 1154253569
→ {"code":0,"message":"ok","data":[
{"did":"1154253569","name":"小米智能摄像机C700","channel":0,"voice_in_use":false,…}]}
# 「次卧很安静,把声音打开」——开声音
$ miloco-cli scope camera mic-on 1154253570
→ {"code":0,"message":"ok","data":[
{"did":"1154253570","name":"小米智能摄像机C700","channel":0,"voice_in_use":true,…},
{"did":"1154253570","name":"小米智能摄像机C700","channel":1,"voice_in_use":true,…}]}
# 拾音按**整台**存,双摄两路的 voice_in_use 一起变(与逐路的 crop / prompt 刻意不同)。
# 「次卧这台别裁了 / 只看整个画面」——画面**构图**类诉求,逐机位关裁切
# 注意与下面的「误识」场景分界:认错东西(把 A 当 B)→ 写感知须知;
# 构图粗细(裁主体 vs 送整幅)→ crop-off/crop-on。别互相套用。
$ miloco-cli scope camera crop-off 1154253570:ch0 # 双摄,只关 ch0 这一路(精确到 :chN)
→ {"code":0,"message":"ok","data":[
{"did":"1154253570","name":"小米智能摄像机C700","channel":0,"crop_in_use":false,"crop_effective":false,…},
{"did":"1154253570","name":"小米智能摄像机C700","channel":1,"crop_in_use":true,"crop_effective":true,…}]}
# 返回按**物理 did** 过滤:双摄两路都会回来(不只被点名的 ch0),只有 ch0 那行的值变了——
# 看到另一行仍是 true 是**正常的**,别当成没生效去重试。
# 关掉后:crop_in_use=false(存储偏好),crop_effective 随之 false
$ miloco-cli scope camera crop-on 1154253570 # 裸 did = 该台全部通道,开回默认
→ {"code":0,"message":"ok","data":[
{"did":"1154253570","name":"小米智能摄像机C700","channel":0,"crop_in_use":true,"crop_effective":true,…},
{"did":"1154253570","name":"小米智能摄像机C700","channel":1,"crop_in_use":true,"crop_effective":true,…}]}
# 开回来后:crop_in_use=true;crop_effective 还要全局双闸也开才会是 true
# 「这台裁切开了、小目标还是看不清」——按 list 的四个字段反查
$ miloco-cli scope camera list
# crop_effective=false 时:in_use=false → 不在感知范围(先看 is_online/connected/awake,
# 别急着 enable);crop_in_use=false → 这一路自己关的;两者都 true → 被全局闸挡住。
# crop_effective=true 仍反馈没效果 → 先看 connected(false = 流没订阅上,裁切判定一次都没跑),
# 再看后端日志:miloco-cli service logs -n 200 | grep adaptive_crop_fallback
# 「门口摄像头老把电梯门开了当成我家门开了」——画面类误识,写感知须知(不是关摄像头)
$ miloco-cli scope camera list # 按 room/name 找到门口那台 did
# (先复述须知给用户确认:"画面右侧公共走廊里的电梯门,与本户无关……",确认后再写)
$ miloco-cli scope camera prompt-set 1154253571 "本摄像头装在入户门内,画面右侧公共走廊里可见电梯门。电梯门开合与本户无关,不要据此判断有人回家/开门;只有画面正中的木色入户门开合才是本户事件。"
→ {"code":0,"message":"ok","data":[
{"did":"1154253571","name":"小米智能摄像机C700","channel":0,"perception_prompt":"本摄像头装在入户门内……",…}]}
# 清除某台的感知须知(回到无自定义)
$ miloco-cli scope camera prompt-clear 1154253571
→ {"code":0,"message":"ok","data":[
{"did":"1154253571","name":"小米智能摄像机C700","channel":0,"perception_prompt":"",…}]}cad239d
If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.