motionEye 監視器自動偵測+發送通知

前言

家中監視器裝設多年,每次出遊時擔心遭小偷,總得三不五時連回家中看一下監視器串流。

想到現在影像辨識技術那麼成熟,應該有好心人士釋出免費的監控系統吧?果然找到了 motionEye 這套開源工具,本還想說需要自己訓練 YOLO,看來省事多了 XD

motionEye 非常簡單好用,看網路上教學不多,值得寫一篇來推廣!

條件

  1. 監視器需要支援 RTSP、RTMP、MJPEG 串流,或是支援 V4L2、MMAL
    • RTSP 算是近十多年來的 DVR 主機標配,只是監視器主機支援網路孔,就幾乎肯定有這功能
    • 標榜雲端串流的 WiFi 監視器通常也會有這些功能,但需要另外開啟
  2. 有一台 Linux 主機
    1. 用來安裝 motionEye、發送通知
    2. 我自己用 Raspberry Pi 3 (ARM 架構),當然 x86 架構也行

安裝設定

基本設定

  1. motionEye 的 Dev repo,照著說明安裝即可
  2. 安裝指令最後一行是啟動 motionEye (sudo motioneye_init
  3. 執行後,瀏覽器打開 http://{your_IP_address}:8765 即可看到登入畫面
    1. 預設帳號 admin

Untitled

  1. 進入後,左上角新增監視器

    Untitled

  2. RTSP 訊源的話,可以把帳密寫在 URL 上

    Untitled

  3. 完成後,即可看到串流的影像在畫面上

    home.gif

設定偵測條件

  • Frame Change Threshold:建議調到 1% 以下,靈敏度比較高
  • Light Switch Detection:可以調高一點,避免些微燈光變化就認為有移動
  • Motion Gap:連續幾秒沒有移動,即判定為移動事件結束
  • Captured Before:避免漏拍前幾秒,這個可以設一些些

Untitled

  • Mask:設定哪些地方不需要偵測,比如說我家裡有旗子會擺動,不想造成誤判,可以將其塗紅。

Untitled

偵測到移動後拍照

Capture mode 選擇 Motion Triggered,並且設定一週後刪除照片以節省硬碟空間。

Untitled

在預覽畫面上,可以開啟圖庫瀏覽截圖:

Untitled

Untitled

設定通知

我自己習慣用 Telegram,跟 Bot Father 申請完聊天機器人,用 JSON Dump Bot 問出 Chat ID,填入即可。

Untitled

成果像這樣:

photo_2023-09-24_14-43-45.jpg

加上影片通知

首先,讓 motionEye 擷取 mp4 影片:

Untitled

因為 motionEye 沒有內建傳送影片的功能,因此我用 inotifywait 來監聽 mp4 檔案建立事件,並發送到 Telegram 頻道。

用之前需要安裝一下套件

sudo apt install inotify-tools

腳本如下:

#!/bin/bash
inotifywait -rm /var/lib/motioneye/Camera1 -e create -e moved_to |
    while read dir action file; do
        if [[ "$file" =~ .*mp4$ ]]; then
            sleep 60
            echo $dir$file
            ls -lh $dir$file
            curl -F video=@"$dir$file" https://api.telegram.org/{YOUR_BOT_TOKEN}/sendVideo?chat_id={YOUR_CHAT_ID}
            echo
            echo
        fi
    done

執行起來後,就會監控那個資料夾,一發現有新的 mp4 檔案,等 60 秒(等寫入完成,否則容易發送失敗),就發送到 Telegram。效果如下:

video_2023-09-24_14-51-34.gif

將發送影片腳本註冊成 daemon

為了保持影片擷取功能一直執行,可以註冊成 daemon,開機時自動執行、遇到問題時自動重啟。

  1. 建立文件 /etc/systemd/system/motioneye_telegram_video.service

    [Unit]
    Description=MotionEye video to Telegram
    
    [Service]
    Type=simple
    ExecStart=/bin/bash /home/jackkuo/motioneye_telegram_video.sh
    Restart=on-failure
    RestartSec=5s
    StandardOutput=file:/var/log/motioneye_telegram_video.log
    StandardOutput=append:/var/log/motioneye_telegram_video.log
    StandardError=append:/var/log/motioneye_telegram_video.log
    
    [Install]
    WantedBy=default.target
    
  2. 設定開機自動執行

    sudo systemctl enable motioneye_telegram_video
    
  3. 啟動該 daemon

    sudo service motioneye_telegram_video start
    

後記

motionEye 滿省資源的,在 Raspberry Pi 3 (2016 購入,瓦數 5W)這種開發版上也能夠順利運行!

Untitled


comments powered by Disqus