Motion Detector
On-device motion detection using the onboard camera, with optional SD snapshots and Discord alerts.
GhostESP can use an onboard camera as a lightweight motion detector. The current implementation is tuned for small ESP32 devices and runs entirely on-device using grayscale frame comparison.
Supported Boards
- Seeed Studio XIAO ESP32-S3 Sense (
xiao_esp32s3_sense) is the primary supported camera build at the moment. - Other boards need an enabled
CONFIG_HAS_CAMERAbuild plus compatible camera pin mapping.
How It Works
- Camera input uses QQVGA resolution (
160x120). - Frames are captured in grayscale.
- GhostESP keeps the previous frame in memory and compares sampled pixels against the new frame.
- If the changed-pixel percentage crosses the configured trigger threshold for consecutive frames, a motion event is raised.
- A small warmup window and hysteresis reduce repeated triggers from one burst of motion.
This design keeps RAM use low while still being fast enough for continuous monitoring on the ESP32-S3.
Quick Start
Basic detection
motion start
Wave a hand or move an object in front of the camera. You should see output like:
[MOTION] #1 44.5% changed
Stop detection with:
motion stop
Test without SD
The detector does not require an SD card for motion detection itself. SD is only used when snapshot saving is enabled or when Discord image alerts are being auto-saved.
Enable Discord alerts
motion discord https://discord.com/api/webhooks/...
motion cooldown 5000
motion start
If image uploads are not needed, disable them to reduce bandwidth and processing time:
motion image off
CLI Commands
motion start— Start motion detection.motion stop— Stop motion detection.motion status— Show current detector state.motion threshold <1-255>— Set per-pixel difference threshold.motion interval <100-10000>— Set frame interval in milliseconds.motion percent <1-100>— Set trigger percentage.motion sample <1-32>— Compare every Nth pixel.motion snap <on|off>— Save motion snapshots to SD card.motion image <on|off>— Attach images to Discord alerts.motion discord <url|off>— Configure or disable the Discord webhook.motion webhook <url|off>— Alias formotion discord.motion cooldown <ms>— Minimum time between webhook alerts.
Recommended Settings
Fast local testing
motion threshold 30
motion percent 10
motion interval 500
motion sample 4
More sensitive detection
motion threshold 20
motion percent 5
motion sample 2
Lower values detect smaller changes, but also increase false positives from lighting flicker, auto exposure shifts, and sensor noise.
SD and Snapshot Notes
- Motion detection itself works without SD.
motion snap onwrites JPEG snapshots to/mnt/ghostesp/captures.- If Discord webhook alerts are enabled and
motion image onis active, images sent to Discord are also saved automatically when SD storage is available. - Discord alerts can still work without SD because images are uploaded directly from the frame buffer.
Troubleshooting
Camera init failed: ESP_ERR_NOT_FOUND— Camera ribbon cable or pin mapping issue.- Detector starts but does not trigger — Lower
motion thresholdormotion percent. - Too many triggers — Raise
motion percent, raisemotion threshold, or increasemotion cooldownfor webhooks. - Discord TLS/certificate errors — Ensure the device has Wi-Fi access and a valid time sync before the webhook attempt.
- Frame buffer overflow logs (
FB-OVF) — Usually indicates the camera or processing path is under pressure; reduce extra work such as image uploads while testing.
