vigil

Security camera system built on motion and yolov7.
Log | Files | Refs

commit 9576203ff9134167d2aed3b0cfb0a54e316966c7
parent 62ed50730a83ea79c2c1315b467b15e4c999e903
Author: dwrz <dwrz@dwrz.net>
Date:   Fri, 28 Oct 2022 17:15:16 +0000

Add notify script

Diffstat:
Ascripts/notify | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 118 insertions(+), 0 deletions(-)

diff --git a/scripts/notify b/scripts/notify @@ -0,0 +1,118 @@ +#!/usr/bin/env bash + +# Backblaze B2 Bucket +readonly BUCKET="${B2_BUCKET}" + +# Devices to check -- if populated and up, no notifications are sent. +readonly DEVICES=() + +# COCO Labels +readonly LABEL_PERSON=0 +readonly LABEL_CAT=15 + +# Lockfile to ensure that only one instance of the script is running. +readonly LOCKFILE="/tmp/motion-notify.lock.d" + +# yolov7 working directory. +readonly PROJECT="/tmp/yolov7" + +# Notification recipient. +readonly RECIPIENT="${NOTIFICATION_RECIPIENT}" + +acquire_lock () { + while true; do + if mkdir "${LOCKFILE}"; then + break; + fi + sleep 1 + done +} + +check_devices() { + for device in "${DEVICES[@]}"; do + if ping -c 1 -w 1 "${device}" &> "/dev/null"; then + return 0 + fi + done + + return 255 +} + +detect_objects() { + local filepath="$1" + + python "${HOME}/yolov7/detect.py" \ + --exist-ok \ + --no-trace \ + --save-txt \ + --project "${PROJECT}" \ + --name "motion" \ + --weights "${HOME}/yolov7/yolov7-tiny.pt" \ + --source "${filepath}" +} + +notify() { + local name="$1" + + echo "${HOSTNAME} at $(date '+%Y-%m-%dT%H:%M:%S%:z')" | \ + mutt -a "${PROJECT}/motion/${name}.jpg" \ + -s "${HOSTNAME}: Motion Detected" \ + -- "${RECIPIENT}" +} + +upload() { + local name="$1" + + backblaze-b2 upload-file \ + --threads 2 \ + "${BUCKET}" \ + "${PROJECT}/motion/${name}.jpg" \ + "${HOSTNAME}/${name}.jpg" +} + +delete_outdated() { + local filepath="$1" + + acquire_lock + + rm -f "$1" + rm -f "${PROJECT}/motion/${name}.jpg" + find "${HOME}/photo/" -mmin +5 -delete + find "${HOME}/timelapse/" -mmin +60 -delete + find "${PROJECT}/motion/" -iname "*.jpg" -mmin +5 -delete + find "${PROJECT}/motion/labels/" -mmin +5 -delete + + release_lock +} + +release_lock () { + rmdir "${LOCKFILE}" +} + +main() { + local filepath="$1" + local name + name="$(basename "${filepath}" .jpg)" + + # If devices are present, don't notify. + if (( "${#DEVICES[@]}" )); then + if check_devices; then + delete_outdated "${filepath}" "${name}" + exit 0 + fi + fi + + detect_objects "${filepath}" + + # Send a notification if we match any labels. + labels="$(awk '{print $1}' "${PROJECT}/motion/labels/${name}.txt")" + if echo "${labels}" | grep -qw "${LABEL_PERSON}\|${LABEL_CAT}"; then + notify "${name}" + fi + + upload "${name}" + + delete_outdated "${filepath}" "${name}" +} + +main "$@"