Install
openclaw skills install @13681882136/kami-video-searchRTSP/RTMP multi-camera stream recording with AI-powered video search. Start/stop recording, check status, search clips by natural language, list recent events, view logs. Supports multiple cameras simultaneously.
openclaw skills install @13681882136/kami-video-searchRecord camera streams 24/7 and search footage by natural language description. Supports multiple cameras simultaneously. Setup takes 2 minutes. Sign up at https://kamiclaw-skill.kamihome.com for 200 free credits.
| Intent | Trigger Words |
|---|---|
| Start recording | start record, start recording, start camera, start monitor, launch stream |
| Stop recording | stop record, stop recording, stop camera, stop monitor, kill recording |
| Check status | recording status, camera status, is recording, check status |
| Search video | search video, find video, find clip, look for, search footage |
| List recent | recent events, recent clips, list events, what happened, show recent |
| View logs | show logs, view logs, recording logs, check logs |
If no trigger word matches, use semantic understanding to route to the closest intent.
Run the setup script to create the virtual environment (Python 3.10+) and install dependencies:
bash {baseDir}/setup.sh
Before EVERY recording start, follow this flow to confirm camera configuration with the user.
{baseDir}/stream_config.jsonDEVICE_ID: Camera location identifier (e.g., front-door, living-room, garage)STREAM_URL: Camera RTSP stream URL (e.g., rtsp://admin:pass@192.168.1.100:554/stream1){baseDir}/stream_config.jsonX-API-Key header). Required for video description and search.sk_live_KAMI_API_RETRY times. All fail → recording stops.Each camera in the cameras array requires:
front-door, living-room, garage, backyardcv2.VideoCapture()rtsp://username:password@IP:port/pathrtsp://user:pass@ip:554/Streaming/Channels/1, Dahua: rtsp://user:pass@ip:554/cam/realmonitor?channel=1&subtype=0)MAX_RECONNECT times). All retries fail → that camera's recording stops.Scenario A: First-time setup (no cameras configured)
cameras arrayScenario B: Partial config (some cameras missing info)
Scenario C: All cameras already configured
{
"KAMI_API_KEY": "sk_live_xxx",
"KAMI_API_URL": "https://kamiclaw-skill-api.kamihome.com/v1/detect",
"RETENTION_DAYS": 3,
"cameras": [
{
"DEVICE_ID": "front-door",
"STREAM_URL": "rtsp://admin:pass@192.168.1.100:554/stream1"
},
{
"DEVICE_ID": "living-room",
"STREAM_URL": "rtsp://admin:pass@192.168.1.101:554/stream1"
}
]
}
Per-camera entries can also override any top-level parameter (e.g. different resolution for a specific camera):
{
"DEVICE_ID": "garage",
"STREAM_URL": "rtsp://admin:pass@192.168.1.102:554/stream1",
"OUTPUT_WIDTH": 1280,
"OUTPUT_HEIGHT": 720
}
After user confirms: read config → update changed fields → write back → start recording.
If the config has no cameras array but has top-level STREAM_URL and DEVICE_ID, treat it as a single-camera setup (legacy mode).
MUST show this table to the user when configuring cameras, so they can pick a URL pattern based on their brand:
| Brand key | Brand | URL pattern |
|---|---|---|
hikvision | Hikvision | rtsp://{user}:{pwd}@{ip}:554/Streaming/Channels/101 (101=ch1 main, 102=ch1 sub) |
dahua | Dahua | rtsp://{user}:{pwd}@{ip}:554/cam/realmonitor?channel=1&subtype=0 (subtype=0 main, 1 sub) |
tplink | TP-Link | rtsp://{user}:{pwd}@{ip}:554/stream1 (stream1 main, stream2 sub) |
ezviz | EZVIZ | rtsp://admin:{verify_code}@{ip}:554/H264/ch1/main/av_stream |
uniview | Uniview | rtsp://{user}:{pwd}@{ip}:554/media/video1 |
reolink | Reolink | rtsp://{user}:{pwd}@{ip}:554/h264Preview_01_main |
For 24/7 recording prefer the main stream (better quality for later playback).
All commands use .venv/bin/python and stream_recoder2.py with --config {baseDir}/stream_config.json.
The --device parameter is optional and accepts comma-separated DEVICE_IDs. If omitted, the command operates on ALL configured cameras.
Start all cameras:
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --start-daemon --log-file {baseDir}/stream_recorder.log
Start specific camera(s):
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --start-daemon --log-file {baseDir}/stream_recorder.log --device front-door
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --start-daemon --log-file {baseDir}/stream_recorder.log --device front-door,living-room
Parse JSON output: status: "started" → show PID; status: "already_running" → show PID; error → show message. For multiple cameras, output contains a cameras array with per-camera results.
Stop all cameras:
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --stop-daemon
Stop specific camera(s):
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --stop-daemon --device front-door
All cameras:
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --status
Specific camera(s):
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --status --device front-door,living-room
Search across all cameras:
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --search "QUERY" --json
Search specific camera(s):
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --search "QUERY" --json --device front-door
With time range (format YYYY-MM-DD_HH:MM:SS):
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --search "QUERY" --time-start "START" --time-end "END" --json
Natural language time ("today morning", "yesterday afternoon") → convert to YYYY-MM-DD_HH:MM:SS.
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --list HOURS --json
With device filter:
{baseDir}/.venv/bin/python {baseDir}/stream_recoder2.py --config {baseDir}/stream_config.json --list HOURS --json --device front-door
Default HOURS to 24 if not specified.
tail -100 {baseDir}/stream_recorder.log
For privacy policy and data handling details, visit https://kamiclaw-skill.kamihome.com/privacy
Respond in the same language the user uses.