Skip to main content

Troubleshooting

Common issues and how to resolve them. Most problems can be diagnosed by checking service status and logs.

Checking logs​

All logs are stored in the logs/ directory at the project root:

logs/
├── api/ # Flask backend (rotating, 8 MB max, 3 backups)
│ └── security-cam.log
├── update/ # Auto-update on boot
├── install/ # install_requirements.sh
├── mediamtx-install/ # setup/install_mediamtx.sh
├── ap-setup/ # setup/setup_ap.sh
└── bluetooth-pairing/ # setup/pair_bluetooth.sh
└── 2026-04-01_09-27-32.log (example)

Except for api/, each folder stores timestamped logs (one per run, last 20 kept).

API logs​

The backend writes to a rotating log file at logs/api/security-cam.log (8 MB max, 3 backups kept). Each line includes a timestamp, level, and logger name that tells you which subsystem produced it:

2026-03-31 23:44:30 [INFO] bt.pair: Pairing device AA:BB:CC:DD:EE:FF ...
2026-03-31 23:45:19 [INFO] bt.pair: Device AA:BB:CC:DD:EE:FF paired and trusted
2026-03-31 23:45:19 [INFO] bt.api: Device added: My Phone (AA:BB:CC:DD:EE:FF)

Logger names use dot-separated namespaces, so you can filter by subsystem with grep:

# All Bluetooth activity
grep "bt\." /opt/security-cam/logs/api/security-cam.log

# Just pairing issues
grep "bt.pair" /opt/security-cam/logs/api/security-cam.log

# Only errors and warnings
grep -E "WARNING|ERROR" /opt/security-cam/logs/api/security-cam.log

# Follow live (useful while reproducing an issue)
tail -f /opt/security-cam/logs/api/security-cam.log | grep "bt\."
Grep patternWhat you get
grep "bt\."All Bluetooth activity (scanning, pairing, discoverable)
grep "sensor\."All sensor activity (triggers, manager, individual drivers)
grep "stream"Camera capture + MediaMTX
grep "system\."System health + storage monitoring
grep "api:"HTTP requests and responses
grep "archive:"Video archive operations
grep "presence:"Presence detection gating

Full logger list:

LoggerWhat it logs
apiHTTP requests/responses
archiveVideo file listing and deletion
bt.apiBluetooth endpoint layer
bt.pairPairing, unpairing, discoverable mode
bt.scanBluetooth scanning and presence checks
eventsSecurity and activity events
presencePresence-based recording gating
sensor.mgrSensor lifecycle management
sensor.<type>Individual sensor drivers (e.g. sensor.pir, sensor.reed)
settingsJSON settings reads/writes
sseServer-sent events
streamCamera capture, MJPEG, recording
stream.mtxMediaMTX configuration
system.healthCPU temp, RAM, CPU load
system.storageDisk space, auto-delete
wifiWiFi/AP device scanning

You can also check system service logs via journalctl:

journalctl -u security-cam --no-pager -n 50

Dashboard loads but no video feed​

  • Check MediaMTX is running: sudo systemctl status mediamtx
  • Verify the stream directly: open http://<pi-ip>:8889/cam in a browser
  • Check camera is detected: rpicam-vid --list-cameras

Cannot reach the dashboard​

  • Check the service is running: sudo systemctl status security-cam
  • Make sure you're using port 3000
  • Check firewall: sudo nft list ruleset

API errors in the dashboard​

  • Check Flask is running: curl http://localhost:5005/system_info
  • Check the application log: tail -50 /opt/security-cam/logs/api/security-cam.log
  • Or filter to just API errors: grep "api:" /opt/security-cam/logs/api/security-cam.log | grep -i "error\|warning"

Service fails on boot​

Check the logs:

# systemd service output
journalctl -u security-cam --no-pager -n 50

# API log
tail -50 /opt/security-cam/logs/api/security-cam.log

# Auto-update log (shows git pull, dependency install, and frontend build)
ls -1t /opt/security-cam/logs/update/ | head -1 | xargs -I{} cat /opt/security-cam/logs/update/{}

Common causes:

  • No internet - git pull fails. The service continues with the current code, but if this is the first run and deps aren't installed, it will fail. Run install_requirements.sh manually once.
  • Build fails - check the update log for errors. The frontend build runs in a temp directory (dist_new/) and only replaces dist/ on success, so a failed build won't break a working dashboard.
  • OOM during build - the Pi Zero 2 W has limited RAM. If the build is killed, check dmesg | grep -i killed. The previous dist/ is preserved.

Sensor not triggering​

  • Verify wiring with the Test Wiring panel in Settings > Sensors - activate the sensor and check if the GPIO value changes
  • Check the correct GPIO pin is configured (BCM numbering, not board pin)
  • Try toggling Invert trigger - some sensors fire on LOW instead of HIGH
  • Check the sensor is enabled (auto-recording toggle is on)
  • If using presence detection, make sure no tracked device is nearby (the trigger may be suppressed)

Recording starts but no file appears​

  • Check the save location exists and is writable: ls -la /path/to/recordings/
  • Check disk space: df -h
  • Check ffmpeg is installed: ffmpeg -version
  • Check RTSP stream is accessible: ffmpeg -i rtsp://localhost:8554/cam -t 5 -c copy /tmp/test.mp4