movement_detection · git:20261014.4631425 · 2026-10-14 · sha256 964161a45577cb17

movement_detection git:20261014.4631425C

Immutable. This exact content never changes and is served at /api/v1/blob/964161a45577cb17.

---
{
  "name": "movement_detection",
  "description": "Detect moving objects with the board camera and send a captured photo to the current WeChat chat or online dialog.",
  "author": "ESP-Claw contributor",
  "metadata": {
    "cap_groups": ["cap_lua", "cap_im_wechat", "cap_im_local", "cap_im_feishu", "cap_im_qq", "cap_im_tg"],
    "category": ["media"],
    "peripherals": ["camera"],
    "tags": ["motion", "intrusion", "monitoring"]
  }
}
---

# Movement Detection

Use this skill when the user asks to monitor the camera for movement, motion, moving objects, intrusion, or activity, and notify them with a photo when motion is detected.

The Lua script opens the board camera, detects motion from consecutive frames, saves the trigger frame as a JPEG, and sends it through IM capabilities.

## Requirements

- A camera device declared in board hardware info.
- IM capability for the target channel.

If the camera or send capability is missing, the script prints an error and exits.

## Tool Call Inputs

使用 `lua_run_script_async` 启动监控,通过 `lua_get_async_job` / `lua_tail_async_job` 查看状态,通过 `lua_stop_async_job` 停止。只有用户明确要求替换占用摄像头的任务时才设置 `replace: true`。

```json
{
  "path": "{CUR_SKILL_DIR}/scripts/movement_detection.lua",
  "args": {
    "channel": "wechat",
    "chat_id": "<current_chat_id>"
  },
  "name": "movement_detection",
  "exclusive": "camera",
  "replace": false,
  "timeout_ms": 360000
}
```

Common optional args: `duration_ms` defaults to `300000`, `max_notifications` defaults to `1`, and `caption` defaults to `Moving object detected`.

## Behavior

For `wechat`, the script sends the saved JPEG through `wechat_send_image`. For `web` or `local`, it sends a local message with the saved image path. If startup or sending fails, report the `[movement_detection] ERROR: ...` line directly to the user.

## 当前检测接口

脚本通过 `camera.list_devices()` 选择摄像头,可用 `device_path` 显式指定;使用 `motion_detect.new(...)` 创建独立检测器,并调用 `detector:detect(frame)`。首次结果 `ready=false`,之后按 `motion` 和 `score` 判断运动,不再使用全局 `detect/reset`。

`pixel_threshold` 范围 0–1,默认 0.2,转换为 0–255 像素差;`moving_threshold` 范围 0.01–1,默认 0.02,向上取整为 1–100 的面积百分比。`confirm_frames` 默认 2,`hold_frames` 默认 3。旧参数 `stride` 已移除,检测器按完整图像处理。

明确传入当前会话的 `channel` 和 `chat_id`,不要猜测发送目标。照片存储在 DATA 根目录的 `movement_detection/` 下,不写入 Skill 包。