Frigate - automatyzacja wykrywania ruchu z Node Red - nagrywanie video na RPi

Witam forumowiczów,
od niedawna zacząłem bawić się dodatkiem Frigate do HA.
Udało mi się połączyć wykrycie ruchu w kamerze z wysłaniem wiadomości na telefon.

motion

Obecnie walczę z powiadomieniem rpi po sieci LAN o wykryciu ruchu i uruchomieniu nagrywania.
Jakiś czas temu napisałem skrypt w shell, który rejestruje obraz z kamery.

Nagrywa on w “pętli” - tworzy segmenty 1 minutowe z godziną i datą w nazwie i kasuje pliki starsze niż 7 dni (na ile pozwoli dysk twardy).
Chciałbym, aby moja malina dalej pełniła rolę rejestratora video. Ale nie robiła tego non stop, ale tylko nagrywała np. 3-minutowe filmiki po wykryciu ruchu. Obecnie HA jest przeniesiony na miniPC Dell Wyse 5070, a na malinie zainstalowany jest raspbian. Nie chcę wykorzystywać dysku twardego w Dell Wyse. HA na Dell Wyse i raspbian na RPi są w tej samej sieci. Chciałem do tego celu wykorzystać komunikację UDP.
Znalazłem prosty bloczek:

[{"id":"4cb48215.27ddfc","type":"udp out","z":"8b03621e.c7b1a","name":"UDP Out","addr":"127.0.0.1","iface":"","port":"45678","ipv":"udp4","outport":"","base64":false,"multicast":"false","x":620,"y":240,"wires":[]},
{"id":"2e53d2e6.225fd6","type":"udp in","z":"8b03621e.c7b1a","name":"UDP In.","iface":"","port":"45678","ipv":"udp4","multicast":"false","group":"","datatype":"utf8","x":340,"y":120,"wires":[["3861f1c6.46a7a6"]]},
{"id":"f43bdb7.c2b9828","type":"inject","z":"8b03621e.c7b1a","name":"Trigger","topic":"Boo","payload":"","payloadType":"date","repeat":"","crontab":"","once":false,"onceDelay":0.1,"x":350,"y":240,"wires":[["4cb48215.27ddfc"]]},
{"id":"3861f1c6.46a7a6","type":"debug","z":"8b03621e.c7b1a","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":640,"y":120,"wires":[]}]

Jak ktoś będzie miał pomysły jak uruchomić skrypt za pomocą UDP na malinie to zapraszam do dyskusji. Na razie walczę samemu, w miarę postepów będę aktualizował post.

Nie rozumiem, chcesz zrobić funkcje nagrywana jak wykryje,
frigate ma taką funkcje, nagrywanie po wykryciu ruchu.
Ustawiam sobie ile dni ma być przechowywane i cześć…
Wymyślasz koło na nowo? :slight_smile:

1 Like

Edytowałem post i wywaliłem info, dlaczego to robię:) Chodzi o to, że mam rpi, które robi za rejestrator i tak ma zostać:) A HA chcę, żeby było odciążone trochę.

Co ma HA do frigate?
frigate jest w osobnym dockerze.
Nadal nie rozumiem.

Poczyniłem pewne postępy:
Na HA wysyłam na porcie 45678 za pomocą UDP “wiadomość” o wykryciu ruchu.
W RPi jest odpalony w tle skrypt pythona, który nasłuchuje na tym porcie:

import socket
import time
import datetime
import subprocess

sock = socket.socket( socket.AF_INET, socket.SOCK_DGRAM )
sock.bind( ('',45678) )


while True:
    data, addr = sock.recvfrom( 1024 )

    if data:
	subprocess.call("find /home/pi/camera/ -name '*.mp4' -mtime +60 -delete", shell=True)
	subprocess.call("sudo bash /home/pi/udp/cam.sh", shell=True)

Za pomocą polecenia subprocess wywołuje skrypt shell z nagrywaniem. Mogłem od razu zamiast wywoływania skryptu sh dać polecenie ffmpeg do nagrywania, ale nie mogłem sobie poradzić z problemami składniowymi polecenia.

Skrypt sh:

#!/bin/sh
### BEGIN INIT INFO
# Provides: kamera wjazd
# Required-Start: $remote_fs $syslog $all
# Required-Stop: $remote_fs $syslog
# Default-Start: 2 3 4 5
# Default-Stop: 0 1 6
# Short-Description: Kamera
# Description: Wykonywanie segmentów do plików mp4
### END INIT INFO

today=`/bin/date '+%d-%m-%Y__%H:%M:%S'`;

#Usuń poprzednie zrobione pliki starsze niż x dni
#find /home/pi/camera/ -name '*.mp4' -mtime +60 -delete

#Pobierz migawkę ze strumienia RTSP
sudo ffmpeg -i "rtsp://admin:admin123456@192.168.18.87:554/cam/realmonitor?channel=1&subtype=0" -vcodec copy -framerate 10 -map 0 -t 00:03:00 /home/pi/camera/$today.mp4

Po wykryciu ruchu nodered wysyła na adres ip rpi “wiadomość”, python na tym porcie “odbiera ją” i załącza nagrywanie.

Pliki video wysyłam na gdrive.
Do tego celu wykorzystałem gotowe rozwiązanie: Jeremy's Blog: google drive

Aby znależć najświeższe nagranie napisałem skrypt python do listowania plików video:

import os

# Pobieranie sciezki do biezacego katalogu
sciezka = os.getcwd()

# Pobranie listy pliku we wskazanym katalogu
#katalogi_i_pliki = os.listdir(sciezka)
pliki = os.listdir('../camera')

#sortowanie
pliki.sort()

# Wydruk listy plikow
#print(pliki)

# ilosc elementow (plikow)
ilosc = len(pliki) - 1

#ostatni wyraz
print(pliki[ilosc])

Chcę stworzyć w HA “wirtualny przycisk” który wykorzystam w Nodered do wysłania po UDP informacji, żeby Rpi “jeżeli coś wyda mi się podejrzane” wysłało ostatni plik video na google drive.
od strony rpi mam już wszystko przygotowane.
Nie wiem tylko jak stworzyć wirtualny przycisk w HA, który połączę z bloczkiem UDP w Nodered. Taki typowy wyzwalacz ala bloczek inject w Node RED.

Dodałem wpis w configuration.yaml

switch:
  - platform: command_line
    udpgdrive:
    command_on: "echo 'TestOn1' | nc -u 192.168.18.102 34567"

Niestety, żadna encja się nie pojawia.