Un sistema di sorveglianza con Raspberry Pi e Python – Seconda Parte

Nella prima parte del tutorial ci siamo occupati della parte hardwhare, abbiamo collegato i pin GPIO del Raspberry Pi alla Breadboard tramite un cavo a nastro da 40 pin e un T- Cobbler, poi abbiamo collegato e codificato il sensore di movimento PIR, abbiamo anche aggiunto un led.

L’unica cosa che abbiamo tralasciato è il modulo della fotocamera, ho dato per scontato che il modulo fotocamera fosse già installato e configurato. Nel caso fosse necessario collegare e abilitare la fotocamera ti rimando a questo tutorial sul sito Projects Raspberry Pi. In questa parte del tutorial ci concentreremo sulle azioni che dovranno essere eseguite quando viene rilevato un movimento.

Cosa faremo

  • Creazione di un Chatbot Telegram
  • Recupero del nostro chat id telegram
  • Creazione dello script per la cattura dell’immagine e successivo invio su telegram

Creare un Chatbot su Telegram

Prima di iniziare a utilizzare Telegram per inviare notifiche tramite un chatbot, è necessario creare un chatbot su Telegram e ottenere il token. Ecco come farlo:

  1. Avvia l’app Telegram e cerca il bot chiamato BotFather.
  2. Avvia una chat con BotFather e usa il comando /newbot per creare un nuovo bot. Segui le istruzioni e fornisci un nome per il tuo bot (ad esempio, “MioBotMonitoraggio”) e un nome utente univoco (deve terminare con “bot”, ad esempio, “@MioBotMonitoraggio_bot”).
  3. Una volta creato il bot, BotFather ti fornirà un token. Copia questo token e conservalo in un luogo sicuro. Il token è unico per il tuo bot e verrà utilizzato per autenticarti con l’API di Telegram.

Ora hai creato con successo il tuo chatbot su Telegram e hai ottenuto il token. Sarà necessario utilizzare questo token nello script di monitoraggio dei siti web per inviare notifiche al tuo bot.

Ricorda di sostituire “TUO_TOKEN” nel tuo script con il token effettivo del tuo bot e “ID_CHAT” con l’ID della chat Telegram in cui desideri ricevere le notifiche.

Dove trovo il mio ID su Telegram?

ecco come ottenere il tuo ID_CHAT su Telegram:

  1. Avvia l’app Telegram sul tuo dispositivo.
  2. Nella barra di ricerca di Telegram, cerca un bot chiamato Userinfobot.
  3. Avvia una chat con Userinfobot. Questo bot ti permetterà di ottenere il tuo ID_CHAT.
  4. Una volta che sei nella chat con Userinfobot, puoi inviare qualsiasi messaggio a lui. Non è importante cosa scrivi, poiché Userinfobot ti risponderà con le tue informazioni utente, compreso l’ID_CHAT.
  5. Cerca la riga che inizia con “ID” all’interno della risposta di Userinfobot. Quell’ID numerico è il tuo ID_CHAT. Ad esempio, potrebbe apparire come “ID: 123456789” (il numero reale sarà diverso).
  6. Copia il numero ID_CHAT e conservalo in un luogo sicuro. Questo ID sarà utilizzato nello script di monitoraggio siti web per inviare notifiche alla tua chat Telegram.

Ora hai ottenuto con successo il tuo ID_CHAT, che ti consentirà di ricevere le notifiche alla tua chat Telegram.

Scattiamo una foto

A questo punto abbiamo il nostro file pir-mode.py che si occupa di attivare il sensore di movimento, lasciamo che si occupi solo di questo compito, per le azioni da eseguire quando viene rilevato il movimento, creiamo un nuovo file monitoraggio.py che conterrà tutte le istruzioni da eseguire.

Importiamo le librerie necessarie, rispettivamente:

  • time: Gestisce il tempo
  • datetime: Fornisce funzionalità di data e ora
  • requests: Per eseguire richieste HTTP
  • os: Fornisce funzionalità per l’interazione con il sistema operativo
  • Picamera2 e Preview: Libreria per l’interfacciamento con la fotocamera Raspberry Pi
import time
from datetime import datetime
import requests
import os
from picamera2 import Picamera2, Preview

Definiamo alcune costanti, come il token del bot Telegram, l’ID utente e la directory di destinazione per le immagini (se non esiste verrà creata). Ricorda di sostituire “TUO_TOKEN” nel tuo script con il token effettivo del tuo bot e “ID_CHAT” con l’ID della chat Telegram in cui desideri ricevere le notifiche.

TELEGRAM_BOT_TOKEN = "TUO_TOKEN"
TELEGRAM_USER_ID = "ID_CHAT"

IMAGE_DIR = os.path.expanduser("~/piCamera")

# Crea la directory se non esiste
os.makedirs(IMAGE_DIR, exist_ok=True)

Otteniamo la data e l’ora correnti utilizzando la libreria datetime. Queste informazioni sono formattate nel modo desiderato utilizzando il metodo strftime.

current_datetime = datetime.now().strftime("%d-%m-%Y %H:%M:%S")

Ora inseriamo questo blocco di codice che si occupa rispettivamente di:

  • inizializzare la fotocamera
  • configurare l’anteprima con dimensioni specifiche
  • avviare l’anteprima utilizzando OpenGL
  • avviare la fotocamera e attendere 2 secondi per consentire alla fotocamera di regolarsi.
# Inizializza la fotocamera
picam = Picamera2()

# Configura la fotocamera con un'anteprima di dimensioni 1600x1200
config = picam.create_preview_configuration(main={"size": (1600, 1200)})
picam.configure(config)

# Avvia l'anteprima della fotocamera utilizzando OpenGL
picam.start_preview(Preview.QTGL)

# Avvia la fotocamera
picam.start()

# Attendi 2 secondi per permettere alla fotocamera di regolarsi
time.sleep(2)

Ora impostiamo il percorso completo per il file dell’immagine utilizzando la directory di destinazione specificata e il nome del file formato dalla data e ora correnti.

image_path = os.path.join(IMAGE_DIR, f"{current_datetime}.jpg")

Catturiamo l’immagine utilizzando la fotocamera e la salviamo nel percorso specificato. Successivamente, la fotocamera viene chiusa per liberare le risorse.

# Cattura un'immagine e la salva nel percorso specificato
picam.capture_file(image_path)

# Chiude la fotocamera
picam.close()

creiamo la variabile caption_text che include la data e l’ora formattate in modo leggibile. Useremo questa variabile come didascalia dell’immagine inviata su Telegram.

caption_text = f"Data immagine: {current_datetime}"

Ora aggiungiamo questo blocco che si occupa di preparare i dati necessari per inviare un’immagine a Telegram utilizzando una richiesta HTTP POST. L’URL del bot Telegram è costruito concatenando il token del bot al percorso API. I dati includono il file dell’immagine, l’ID della chat e la caption.

Infine, stampiamo la risposta del server Telegram a scopo informativo. Questa risposta potrebbe contenere informazioni sull’invio dell’immagine o eventuali errori.

print(response.json())

Lo script completo

E questo è lo script monitoraggio.py completo:

import time, libcamera
from datetime import datetime
import requests
import os
from picamera2 import Picamera2, Preview

# Definisci il token del tuo bot Telegram
TELEGRAM_BOT_TOKEN = "TUO_TOKEN"

# Definisci il tuo ID utente Telegram (per inviare messaggi a te stesso)
TELEGRAM_USER_ID = "ID_CHAT"

# Directory di destinazione per le immagini (nella home dell'utente)
IMAGE_DIR = os.path.expanduser("~/piCamera")

# Crea la directory se non esiste
os.makedirs(IMAGE_DIR, exist_ok=True)

# Ottieni la data e l'ora correnti con i secondi
current_datetime = datetime.now().strftime("%d-%m-%Y %H:%M:%S")

# Scatta la foto
picam = Picamera2()

config = picam.create_preview_configuration(main={"size": (1600, 1200)})

picam.configure(config)

picam.start_preview(Preview.QTGL)

picam.start()
time.sleep(2)
image_path = os.path.join(IMAGE_DIR, f"{current_datetime}.jpg")
picam.capture_file(image_path)

picam.close()

# Aggiungi una caption con la data all'immagine
caption_text = f"Data immagine: {current_datetime}"

# Invia l'immagine a Telegram utilizzando requests
url = f"https://api.telegram.org/bot{TELEGRAM_BOT_TOKEN}/sendPhoto"
files = {'photo': open(image_path, 'rb')}
data = {'chat_id': TELEGRAM_USER_ID, 'caption': caption_text}

response = requests.post(url, files=files, data=data)

# Stampa la risposta del server Telegram
print(response.json())

Salavate ed eseguite lo script, se tutto funziona correttamente dovresti ricevere una foto sul tuo telegram, A questo punto non ci resta che modificare il file pir-mode.py per dirgli di eseguire il file monitoraggio.py ogni volta che rileva un movimento. Ecco il contenuto aggiornato del file pir-mode.py:

from gpiozero import MotionSensor, LED
import subprocess
import time

#time.sleep(20)

pir = MotionSensor(4)
led = LED(17)

while True:
    pir.wait_for_motion(timeout = 5)
    if pir.value:
        print("Ti sei mosso!")
        led.on()
        subprocess.run(["python3", "/home/tuo_utente/monitoraggio.py"])
        pir.wait_for_no_motion()
    else:
        led.off()

Lo script non è cambiato molto, Abbiamo solo aggiunto l’importazione di subprocess che viene utilizzato per eseguire un altro script Python (monitoraggio.py), che infatti viene eseguito tramite la riga:

subprocess.run(["python3", "/home/tuo_utente/monitoraggio.py"])

Assicurati di sostituire tuo_utente in /home/tuo_utente/monitoraggio.py con il percorso reale del tuo script.

Ho importato anche time che servirà se volete aggiungere un ritardo prima che il sensore inizi a rilevare il movimento. Questo viene fatto tramite la riga #time.sleep(20) che è commentata, per abilitare il ritardo iniziale basta decommentare la riga (togliendo il # all’inizio della riga).

Quindi avviando lo script pir-mode.py se tutto è andato bene, riceverai le foto su telegram quando il sensore rileva il movimento. Ottimo lavoro!

Questo è tutto per questo tutorial, Personalmente mi sono sentito molto soddisfatto per essere riuscito a implementare il mio sistema di sorveglianza fai da te. A questo punto potrai facilmente modificare lo script personalizzandolo secondo le tue esigenze. Potresti anche voler creare un altro file (ad esempio monitoraggio_video.py) che invece di scattare foto registra un breve video.

Inoltre se la camera cattura molte immagini la cartella di destinazione piCamera potrebbe riempirsi presto di immagini e creare problemi di spazio, in questo caso sarebbe utile aggiungere una funzionalità allo script per controllare il numero di foto presenti nella cartella ed eliminare le foto meno recenti mantenendo solo le ultime 50 (per esempio).

Spero ti sia piaciuto questo tutorial, Nel caso fammelo sapere nei commenti. Alla prossima!

Lascia il primo commento

Mettiti in contatto

WordPress Maintenance Form