Spisu treści:
2025 Autor: John Day | [email protected]. Ostatnio zmodyfikowany: 2025-01-13 06:58
Pomysł polega na przesyłaniu zdjęć i filmów wykonanych za pomocą kamery aktywowanej ruchem podłączonej do Raspberry Pi, aby przesłać pliki do chmury. Oprogramowanie „Motion” obsługuje przesyłanie na Dysk Google przez PyDrive. W tym artykule „Motion” służy do przesyłania do Zdjęć Google.
Sprzęt komputerowy:
Raspberry Pi 3B+
Kamera internetowa USB Logitech C920
Wybór sprzętu nie był określony, po prostu wziąłem to, co było pod ręką.
Wymagania wstępne:
Dla wygody Raspberry pi powinno znajdować się w Twojej sieci lokalnej – aby sterować nim bez monitora/klawiatury i przesyłać/pobierać pliki. W tym celu powinieneś mieć agenta ssh na swoim komputerze (np. Putty).
Wielkie dzięki dla ssandbac za świetny tutorial. Jeśli potrzebujesz więcej informacji na temat konfiguracji środowiska, zapoznaj się z tym artykułem. Pożyczyłem z niego instalację ruchu i kroki konfiguracyjne oraz dodałem kilka zmian. W szczególności, zamiast wysyłać e-mailem pliki i alerty, ten przykład używa przesyłania do google udostępnionego albumu i otrzymuje powiadomienia w rodzaju „dodanych zdjęć” w pasku powiadomień.
Oto kroki:
Krok 1: Zainstaluj Linux Motion na Raspberry
Szczególnie w tym przykładzie wykorzystano motion v4.0.
1.1 Aktualizuj pi
pi@raspberrypi:~ $ sudo apt-get update
pi@raspberrypi:~ $ sudo apt-get upgrade
1.2 Pobierz ruch
pi@raspberrypi:~ $ sudo apt-get install motion
1.3 Teraz edytuj ten plik z następującymi zmianami
pi@raspberrypi:~ $ sudo nano /etc/motion/motion.conf
# Uruchom w trybie demona (w tle) i zwolnij terminal (domyślnie: wyłączone)
demon włączony
# Użyj pliku do zapisywania komunikatów logów, jeśli nie zdefiniowano, używane są stderr i syslog. (domyślnie: niezdefiniowane)
plik dziennika /var/log/motion/motion.log
# Szerokość obrazu (w pikselach). Prawidłowy zakres: zależny od kamery, domyślnie: 352
szerokość 1920
# Wysokość obrazu (w pikselach). Prawidłowy zakres: zależny od kamery, domyślnie: 288
wysokość 1080
# Maksymalna liczba klatek do przechwycenia na sekundę.
liczba klatek na sekundę 30
# Określa liczbę wstępnie przechwyconych (buforowanych) zdjęć sprzed ruchu
przed_przechwytywaniem 5
# Liczba klatek do przechwycenia, gdy ruch nie jest już wykrywany
post_capture 5
# Wysyłaj „normalne” obrazy po wykryciu ruchu (domyślnie: włączone)
wyjście_zdjęcia wyłączone
# Jakość (w procentach) używana przez kompresję jpeg
jakość 100
# Użyj ffmpeg do kodowania filmów w czasie rzeczywistym
ffmpeg_output_movies wyłączone
# lub zakres od 1 do 100, gdzie 1 oznacza najgorszą jakość, a 100 oznacza najlepszą.
ffmpeg_variable_bitrate 100
# Podczas tworzenia filmów, czy ramki powinny być powielane w kolejności?
ffmpeg_duplicate_frames fałszywe
# Bool, aby włączyć lub wyłączyć extpipe (domyślnie: wyłączone)
use_extpipe włączone
extpipe ffmpeg -y -f rawvideo -pix_fmt yuv420p -video_size %wx%h -framerate %fps -i pipe:0 -vcodec libx264 -preset ultrafast -f mp4 %f.mp4
katalog_docelowy /var/lib/motion
# Polecenie do wykonania, gdy plik filmowy
; on_movie_end sudo python3 /var/lib/motion/photos.py %f.mp4 &
Na razie pozostaw ostatni średnik (z komentarzem), aby odkomentować po upewnieniu się, że nagrywanie wideo i przesyłanie działa.
1.4 Następnie zmień
pi@raspberrypi:~ $ sudo nano /etc/default/motion
pi@raspberrypi:~ $ start_motion_daemon=tak
Krok 2: Skonfiguruj interfejs API Zdjęć Google dla Pythona
2.1 Zalecane jest utworzenie nowego konta w tym celu, aby udostępnić album swojemu głównemu, aby otrzymywać powiadomienia o dodaniu nowych plików, a także więcej miejsca do przechowywania. Włącz interfejs Google Photos API dla konta, którego zamierzasz używać do przesyłania.
Powinieneś mieć plik poświadczenia.json po tym.
2.2 Konfiguracja środowiska Python
Zasadniczo konfiguracja środowiska jest wymagana tylko na malinach. Ale wymaga autoryzacji Oauth, która jest wygodniejsza do wykonania na komputerze. Aby to zrobić na raspberry, musisz podłączyć do niego monitor/klawiatura lub skonfigurować interfejs zdalnego pulpitu. Właśnie zainstalowałem to samo środowisko na komputerach PC i Raspberry. Tak więc kroki 2.2.1.2.2.3 zostały wykonane na PC, 2.2.1, 2.2.2, 2.2.5, 2.2.6 na Rpi
2.2.1 zainstaluj Pythona 3
2.2.2 Zainstaluj pakiety google api zgodnie z instrukcją* (patrz 5.1)
Na PC
pip3 instalacja --uaktualnij klienta google-api-python google-auth-httplib2 google-auth-oauthlib
Na malinach
pi@raspberrypi:~ $ sudo pip3 zainstaluj --uaktualnij klienta google-api-python google-auth-httplib2 google-auth-oauthlib
2.2.3 Sprawdź wgrywanie skryptu do zdjęć google.. Jest on umieszczony na moim githubie. Umieść go w tym samym katalogu z poświadczeniami.json.
2.2.4 Zrób zdjęcie i przetestuj przesyłanie
python3 photos.py obraz.jpg
Zainstaluj brakujące zależności, jeśli są, i spróbuj ponownie. W rezultacie powinieneś pobrać token.pickle w katalogu skryptu, a także nowy udostępniony album utworzony w interfejsie internetowym Zdjęć Google z obrazem.jpg. Ponieważ otrzymujesz token.pickle, nie potrzebujesz już pliku poświadczeń.json dla photos.py w tym samym katalogu.
2.2.5 Udostępnij album na koncie, o czym chcesz otrzymywać powiadomienia o dodanych nowych mediach. Dodaj to konto do swojego telefonu.
2.2.6 Umieść photos.py i token.pickle w /var/lib/motion na raspberry. Użytkownik „pi” nie może pisać do katalogu „motion”, więc najpierw prześlij do /home/pi
scp photos.py token.pickle pi@IP:/home/pi
Następnie zaloguj się do Raspberry i przenieś pliki pod sudo
ssh pi@IP
pi@raspberrypi:~ $ sudo mv photos.py token.pickle /var/lib/motion
2.2.7 Sprawdź, jak działa wgrywanie na Raspberry. Zrób zdjęcie za pomocą fswebcam i spróbuj je przesłać
pi@raspberrypi:~ $ sudo fswebcam /var/lib/motion/image.jpg
pi@raspberrypi:~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/image.jpg
W albumie „helloworld” znajdzie się image.jpg, a na pasku telefonu powiadomienie.
Krok 3: Test
3.1 Uruchom usługę Motion
pi@raspberrypi:~ $ początek ruchu usługi sudo
Możesz zmienić polecenie na „stop” lub „restart”
3.2 Włącz dzienniki ruchu
pi@raspberrypi:~ $ ogon -f /var/log/motion/motion.log
3.2 Wyświetl wyjście kamery na innym urządzeniu podłączonym do tej samej sieci lokalnej. Wpisz w przeglądarce:
IP:8081
3.3 Patrząc na logi poczekaj, aż wykryje ruch i plik NAZWA.mp4 zostanie zapisany w /var/lib/motion. Następnie uruchom ręcznie przesyłanie skryptu
pi@raspberrypi:~ $ sudo python3 /var/lib/motion/photos.py /var/lib/motion/NAZWA.mp4
Sprawdź ślady Pythona. Poczekaj, aż event_end pojawi się w motion.log. Następnie przejdź do albumu „helloworld” w swoich zdjęciach Google i sprawdź, czy jest przesłany film.
3.4 Jeśli przesyłanie się powiedzie, odkomentuj w /etc/motion.conf linię:
pi@raspberrypi:~ $ sudo nano /etc/motion.conf
# Polecenie do wykonania, gdy plik filmowy jest gotowy
on_movie_end sudo python3 /var/lib/motion/photos.py %f.mp4 &
pi@raspberrypi:~ $ synchronizacja
pi@raspberrypi:~ $ restart ruchu usługi sudo
3.5 Przeglądając dzienniki ruchu i w albumie sprawdź, czy film został załadowany automatycznie.
3.6 Opcjonalnie udostępnij album swojemu głównemu kontu, aby otrzymać powiadomienie o dodaniu nowego filmu lub zdjęcia.
Krok 4: Opcjonalnie: Skonfiguruj dostęp do Internetu do kamery strumieniowej w czasie rzeczywistym
Ten krok jest oparty na samouczku Parreno Michela. Po prostu wybrałem FreeDNS zamiast NoIP, zgodnie z zaleceniami tutaj.
4.1 Skonfiguruj autoryzowany dostęp do serwera ruchu strumieniowego wideo:
pi@raspberrypi:~ $ sudo nano /etc/motion/motion.conf
# Ustaw metodę uwierzytelniania (domyślnie: 0)
# 0 = wyłączone
#1 = Uwierzytelnianie podstawowe
# 2 = skrót MD5 (bezpieczniejsze uwierzytelnianie)
stream_auth_method 2
# Uwierzytelnianie strumienia. Składnia nazwa użytkownika:hasło
# Domyślnie: niezdefiniowane (wyłączone)
webcontrol_authentication nazwa użytkownika:hasło
# Maksymalna liczba klatek na sekundę dla strumieni strumieniowych (domyślnie: 1)
stream_maxrate 30
# Ogranicz połączenia strumieniowe tylko do hosta lokalnego (domyślnie: włączone)
stream_localhost wyłączony
Jeśli nie zamierzasz korzystać z interfejsu kontroli sieci z sieci zewnętrznej, pozostaw go wyłączony (domyślnie)
# Ogranicz połączenia kontrolne tylko do hosta lokalnego (domyślnie: włączone)
webcontrol_localhost włączony
Ponadto, skoro malina przechodzi do sieci, polecam zmienić domyślne hasło malinowe
pi@raspberrypi:~ $ hasło
Chociaż ssh port 22 nie jest przekierowany na malinowy, nadal.
4.2 Przejdź do strony FreeDNS
4.3 Zarejestruj się
4.4 Dodaj subdomenę (Dla członków -> Subdomeny)
4.5 Wybierz klienta DNS do zainstalowania na Raspberry (Dla członków -> Dynamiczny DNS -> Synamiczne zasoby DNS -> Dynamiczne klienci DNS)
Wybrałem wget_script update.sh od Adama Deana (na dole strony)
Istnieją symbole zastępcze _YOURAPIKEYHERE_ i _YOURDOMAINHERE_. Aby je zdobyć, przejdź do (Dla członków -> Dynamiczny DNS)
A na poniższej stronie znajdziesz przykłady skryptów z Twoim APIKEY i DOMAIN (ta dodana w 4.4). Wziąłem te wartości z Wget Script i zastąpiłem _YOURAPIKEYHERE_ i _YOURDOMAINHERE_ w update.sh
4.6 Następnie uruchom update.sh na raspberry. Może wymagać dnsutils dla nslookup. Zainstaluj go następnie:
pi@raspberrypi:~ $ sudo apt-get dnsutils
4.7 Następnie skonfiguruj router tak, aby przekierowywał żądania ze świata zewnętrznego na port 8081 do ip maliny
4.8 Zarezerwuj adres IP dla MAC Twojej Maliny w ustawieniach DHCP, aby Rpi zawsze miał ten sam adres IP
4.9 Następnie wpisz w przeglądarce na urządzeniu niepodłączonym do sieci lokalnej:
twojadomena:8081
Wprowadź swoje dane uwierzytelniające zdefiniowane w motion.conf.
Sprawdź, jak działa wideo.
4.10 w celu aktualizacji DDNS automatycznie skonfiguruj zadanie cron. Zobacz quick_cron_example na (Dla członków -> Dynamiczny DNS)
Krok 5: Wskazówki
5.1 Bądź uważny podczas instalowania pakietów Pythona na Raspberry. Spędziłem dzień na debugowaniu tego – problem polegał na tym, że z konsoli skrypt działał dobrze, ale wywoływanie z wywołania zwrotnego zdarzenia ruchu nie. Co gorsza, ślady ze scenariusza były niedostępne w tym drugim przypadku.
Powodem było to, że zgodnie z instrukcją zainstalowałem pakiety dla użytkownika "pi" (który domyślnie znajduje się w katalogu /home/pi i jest ograniczony dla innych użytkowników), ale aby uruchomić skrypt jako dziecko usługi "motion", pakiety muszą być dostępne również dla użytkownika 'motion'. Więc w końcu naprawiłem to instalując pakiety jako
sudo pip3 …
To nie jest właściwy sposób, nadal działa. Instalacja bez sudo jako pip3 --system z jakiegoś powodu dawała mi błędy.
Odpowiednio skrypt jest wywoływany również pod sudo (zobacz motion.conf).
Podczas tego rozwiązywania problemów dokonałem wielu niepotrzebnych zmian i nie byłem pewien, co jest konieczne, a teraz jest zbyt leniwy, aby cofać je stopniowo i zobaczyć, kiedy przestanie działać. W szczególności nadane uprawnienia administratora wniosku:
pi@raspberrypi:~ $ ruch grup
ruch: ruch adm sudo użytkownicy audio wideo netdev pi
pi@raspberrypi:~ $ kot sudo /etc/sudoers.d/010_pi-nopasswd
pi ALL=(ALL) NOPASSWD: ALL
motion ALL=(ALL) NOPASSWD: ALL
Zmieniał także właścicieli plików i uprawnienia podobne do przesyłania na Dysk Google. Prawdopodobnie może ci to pomóc w przypadku podobnego problemu.
5.2 Interfejs API Zdjęć Google umożliwia dodawanie plików do albumów udostępnionych, aby każdy, kto ma do niego link, mógł uzyskać do niego dostęp. Nie udostępniaj go przez link i usuwaj stare filmy lub przenoś je do kosza lub z albumu. W drugim przypadku pozostają na koncie.
5.3 Asystent Google Photos wykrywa twarze, co jest bardzo przydatne, jeśli jakość aparatu jest dobra. Jako bonus tworzy fantazyjne medialne kompilacje i gify itp.
5.4 Próbowałem użyć modemu USB 4G LTE do dostępu do Internetu i oto moje wyniki. 5.4.1 Huawei E3372h-153 działa z Raspberry bez problemów i dodatkowego oprogramowania 5.4.2 Włączono również hotspot, więc Rasperry udostępniał połączenie internetowe przez wifi. Istnieje https://howtoraspberrypi.com/create-a-wi-fi-hotspot-in-less-than-10-minutes-with-pi-raspberry/ naprawdę prosty przewodnik, jak to zrobić za pomocą RaspAP. 5.4.3 Dynamiczny DNS nie działał w sieci 4G mojej Carrie. Jest wyjaśnienie, dlaczego
5.5 Po kilku tygodniach korzystania z tego systemu okazało się, że chociaż filmy są wygodniejsze do przeglądania i przesyłania, Zdjęcia Google działają lepiej ze zdjęciami. Np. umożliwia grupowanie rzeczy/twarzy tylko analizując obrazy, a dopiero potem szukanie twarzy/rzeczy z obrazów w filmach, ale nie odwrotnie. Więc zamierzam przetestować zdjęcia wrzucając raczej filmy.