ZoneMinder: Creiamo il nostro sistema di video sorveglianza con riconoscimento degli oggetti e persone – Parte 2: Configurazione

Autore: Vito
999 visite
ZoneMinder Videosorveglianza - Featured image

Nel precedente articolo abbiamo avuto modo di vedere come installare ZoneMinder e tutti i componenti aggiuntivi necessari alla sua corretta esecuzione e messa in sicurezza.

In questo secondo capitolo vedremo come configurare ZoneMinder, i suoi componenti aggiuntivi e come integrarlo in Home Assistant.

Attenzione: Questo articolo si basa sulla versione “1.34.23” di ZoneMinder e “6.1.19” di Event ServerAlcune voci e configurazioni potrebbero variare nel tempo con gli aggiornamenti. É molto importante anche precisare che nonostante questo tutorial sarà molto dettagliato, si presume che l’utente abbia una minima base nell’utilizzo di sistemi operativi Linux e della relativa shell di comandi, oltre ad un minimo di capacità di eseguire del troubleshooting in autonomia.

Sommario

Materiale necessario

Prima di eseguire qualsiasi operazione indicata in questo tutorial, è necessario aver correttamente seguito tutte le indicazioni del precedente articolo.

Scarichiamo quindi questo pacchetto contenente il materiale che utilizzeremo nei vari passaggi:

Le impostazioni

Attenzione: In tutta la fase di configurazione, indicherò solo le voci da configurare differenti dalla configurazione predefinita di ZoneMinder, ma tramite le immagini dimostrative è possibile verificare se eventuali altre impostazioni siano configurate correttamente. Buona parte delle configurazioni presenta un simbolo “(?)” che se premuto mostrerà una breve descrizione della funzione specifica, di conseguenza dove non richiesta una spiegazione approfondita lascio questa all’help integrato. Maggiori dettagli è possibile visionarli nella user guide ufficialeOgni sezione che andremo a configurare all’interno delle opzioni andrà sempre salvata tramite il pulsante in fondo alla pagina.

Eseguire l’accesso al web server di ZoneMinder (locale) tramite il seguente indirizzo (indicando il corretto indirizzo IP e porta scelti in fase di installazione):

http://192.168.0.223:8095/zm/

Dopo aver accettato le policy verrà mostrata console principale :

Partiamo configurando le opzioni di accesso ed autenticazione, accedere quindi alla sezione “Options → Users” e creare gli utenti:

  • EventServer: Verrà utilizzato dal componente aggiuntivo Event Server (se installato);
  • HomeAssistant: Verrà utilizzato per l’integrazione con Home Assistant (se si desidera integrarlo);
  • Utente Personale: É l’utente per l’accesso personale (consiglio di creare un utente per ogni persona fisica che utilizzerà ZoneMinder).

Nella fase di creazione dell’utente è possibile indicare i permessi di accesso, la localizzazione specifica (lingua), la banda massima sfruttabile e se attivare le API.

Per gli utenti sopra indicati abilitare tutte le funzioni ed impostare i permessi massimi disponibili, valutare invece come limitare eventuali altri utenti personali.

Creati ed impostati gli utenti sopra indicati consiglio di eliminare l’utente predefinito “admin”.

Spostarsi nella sezione “Options → System” e configurare le seguenti voci:

  • LANG_DEFAULT: it_it (imposta la lingua predefinita in italiano);
  • OPT_USE_AUTH: Attivo (abilita l’autenticazione tramite utente e password);
  • AUTH_HASH_SECRET: Chiave segreta casuale per l’accesso tramite segreto HASH (crearne una usando un HASH Generator).

Una volta salvate le impostazioni ci verrà richiesto di eseguire l’accesso, utilizzare quindi l’utente personale precedentemente creato.

Eseguito l’accesso, la nostra istanza ora risulterà localizzata in Italiano.

Procediamo con le restanti opzioni di sistema necessarie, recarsi quindi nella sezione “Opzioni → Sistema” e configurare le seguenti voci:

  • AUTH_HASH_LOGINS: Attivo (abilita la possibilità di accedere tramite segreto HASH);
  • OPT_USE_EVENTNOTIFICATION: Attivo (abilita l’esecuzione automatica di Event Server);
  • TIMEZONE: (GMT+02:00) Europe, Rome (da selezionare in base alla propria posizione geografica ed il proprio fuso orario);
  • OPT_FAST_DELETE: Attivo (permette la cancellazione rapida degli eventi lasciando al sistema il compito di eliminarli dall’archivio in background);
  • RUN_AUDIT: Attivo (abilitando la cancellazione rapida degli eventi, esegue delle verifiche in background per eliminare eventuali dati ridondanti); 
  • OPT_TRIGGERS: Attivo (abilita i trigger esterni per eseguire comandi tramite il componente ZMTrigger via telnet).

Puramente secondo le proprie preferenze, configurare:

  • CHECK_FOR_UPDATES: Esegue una ricerca degli aggiornamenti tramite i server di ZoneMinder, ma i nostri aggiornamenti arriveranno dalla repository di installazione. Abilitarlo solo se si vuole avere una notifica immediata di una nuova versione disponibile;
  • TELEMETRY_DATA: Invia dati statistici sull’utilizzo ai server di ZoneMinder. Abilitarlo solo se si vuole che questi vengano inviati.

Tramite la sezione “Opzioni → API” è possibile verificare quali utenti abbiano abilitate le API:

Passiamo quindi alla configurazione dell’interfaccia grafica.

Spostarsi nella sezione “Opzioni → Web” e configurare le seguenti voci:

  • WEB_TITLE_PREFIX: É il titolo mostrato nel browser, ad esempio nel tab della pagina (nelle immagini di esempio è: ZM – Opzioni);
  • HOME_URL: Equivale al proprio URL di accesso a ZoneMinder, che può essere il DNS scelto in fase di installazione o l’host locale del server in caso non sia attivo l’accesso da remoto. Sarà utilizzato per riportare alla pagina principale, ad esempio selezionando la voce “ZoneMinder” in alto a sinistra;
  • WEB_CONSOLE_BANNER: É un testo descrittivo a scelta che verrà mostrato nella parte in alto, sotto le informazioni di sistema, e che può essere ad esempio la descrizione del nostro server di video sorveglianza;
  • WEB_EVENT_DISK_SPACE: Attivo (mostra lo spazio utilizzato sul disco per ogni singolo evento);
  • WEB_ID_ON_CONSOLE: Attivo (mostra l’ID del monitor nella console principale); 
  • WEB_EVENT_SORT_ORDER: desc (definisce l’ordine predefinito per gli eventi, in questo caso decrescente);
  • WEB_EVENTS_PER_PAGE: 100 (il numero massimo di eventi mostrati per pagina, nell’elenco eventi).

Ora configuriamo le impostazioni relative alle immagini fornite dalle telecamere.

Spostarsi nella sezione “Opzioni → Immagini” e configurare le seguenti voci:

  • COLOUR_JPEG_FILES: Attivo (velocizza l’analisi di immagini in scala di grigi in alcune situazioni);
  • ADD_JPEG_COMMENTS: Attivo (aggiunge alle immagini degli attributi e commenti come la data e l’ora);
  • JPEG_FILE_QUALITY: 80 (la % della qualità dell’immagine durante il salvataggio dei file generici degli eventi);
  • JPEG_ALARM_FILE_QUALITY: 80 (la % della qualità dell’immagine durante il salvataggio dei file di allarme degli eventi);
  • JPEG_STREAM_QUALITY: 80 (la % della qualità dell’immagine durante lo streaming in diretta); 
  • OPT_CAMBOZOLA: Attivo (abilita il componente aggiuntivo Cambozola, ma solo se installato come indicato nel precedente articolo);
  • RELOAD_CAMBOZOLA: 60 (il numero di secondi dopo il quale verrà ricaricato lo streaming di Cambozola per evitare il riempimento del disco tramite la sua cache);
  • FFMPEG_FORMATS: mpg mpeg** wmv asf avi mov* swf 3gp (imposta i formati video predefiniti per gli eventi. Con “*” indicare il formato predefinito per i video standard e con “**” quelli per lo smartphone. Selezionare i formati preferiti a piacere o in base a quelli supportati dai propri dispositivi).

Passiamo alla configurazione della gestione dei logdebug.

Spostarsi nella sezione “Opzioni → Logging” e configurare le seguenti voci:

  • LOG_LEVEL_SYSLOG: None (abilitarlo solo se necessario);
  • LOG_LEVEL_FILE: None (abilitarlo solo se necessario);
  • LOG_LEVEL_WEBLOG: Warning (fondamentale per il funzionamento di Fail2ban, ma solo se installato come indicato nel precedente articolo);
  • LOG_LEVEL_DATABASE: None (abilitarlo solo se necessario);
  • RECORD_EVENT_STATS: Non attivo (disabilita il salvataggio di eventi per le statistiche velocizzando il sistema).

Spostarsi nella sezione “Opzioni → Rete” e configurare seguenti voci:

  • HTTP_VERSION: 1.1 (abilita il protocollo HTTP/1.1, ma in caso di problemi verrà automaticamente utilizzato il protocollo HTTP/1.0).

Molto importante è la configurazione dei parametri per l’invio delle email, che sfrutteremo più avanti per farci notificare gli eventi.

Per inviare le email è necessario aver correttamente installato e configurato Postfix o un altro MTA compatibile come indicato nel precedente articolo.

Spostarsi nella sezione “Opzioni → Email” e configurare seguenti voci:

  • OPT_EMAIL: Attivo (abilita la possibilità di inviare gli eventi tramite “email complete”);
  • EMAIL_ADDRESS: L’indirizzo email di destinazione per le “email complete”;
  • EMAIL_SUBJECT: Disponibile nello specchietto sottostante, è l’oggetto dell’email (verificare i parametri disponibili nella documentazione ufficiale);
  • EMAIL_BODY: Disponibile nello specchietto sottostante, è il contenuto dell’email (verificare i parametri disponibili nella documentazione ufficiale);
  • OPT_MESSAGE: Attivo (abilita la possibilità di inviare gli eventi tramite “messaggi”, ovvero l’equivalente di un’email brave);
  • MESSAGE_ADDRESS: L’indirizzo email di destinazione per i “messaggi”;
  • MESSAGE_SUBJECT: Disponibile nello specchietto sottostante, è l’oggetto del messaggio (verificare i parametri disponibili nella documentazione ufficiale);
  • MESSAGE_BODY: Disponibile nello specchietto sottostante, è il contenuto del messaggio (verificare i parametri disponibili nella documentazione ufficiale);
  • FROM_EMAIL: L’indirizzo email del mittente (indicare tra parentesi un’eventuale descrizione del mittente);
  • URL: Equivale al proprio URL di accesso a ZoneMinder, che può essere il DNS scelto in fase di installazione o l’host locale del server in caso non sia attivo l’accesso da remoto. Aggiungere al termine “index.php” (ad esempio: https://zonemindersetup.duckdns.org/zm/index.php).
EMAIL_SUBJECT = %MN%-%EI%
EMAIL_BODY = 
Dettagli Evento:
   Descrizione: %ED%
   Durata: %EL% secondi
   Orario: %ET%

%EI1%
%EIM%

MESSAGE_SUBJECT = %MN%-%EI%
MESSAGE_BODY = Descrizione: %ED% - Durata: %EL% sec. - Orario: %ET%

Infine configuriamo il caricamento degli eventi salvati su un server FTP o SFTP esterno.

Questa sezione può essere configurata senza indicare l’eventuale server, lasciando le restati impostazioni correttamente predisposte.

Spostarsi nella sezione “Opzioni → Upload” e configurare seguenti voci:

  • OPT_UPLOAD: Attivo (abilita la possibilità di eseguire l’upload degli eventi);
  • UPLOAD_ARCH_FORMAT: zip (il formato con il quale verranno archiviati gli eventi);
  • UPLOAD_ARCH_COMPRESS: Attivo (comprime l’archivio. Disabilitarlo per ridurre il consumo del processore aumentando però lo spazio di archiviazione richiesto);
  • UPLOAD_ARCH_ANALYSE: Attivo (aggiunge all’archivio anche i fotogrammi che includono le immagini di allarme con l’analisi evidenziata);
  • UPLOAD_PROTOCOL: ftp (scegliere il protocollo in base a quello supportato dal server di destinazione);
  • UPLOAD_HOST: L’host del server di destinazione;
  • UPLOAD_PORT: La porta di comunicazione del server di destinazione (solo in caso di protocollo SFTP);
  • UPLOAD_USER: L’utente per l’autenticazione verso il server di destinazione;
  • UPLOAD_PASS: La password per l’autenticazione verso il server di destinazione (lasciare vuoto in caso di utilizzo di un certificato);
  • UPLOAD_REM_DIR: Il percorso di destinazione degli eventi archiviati sul server di destinazione;
  • UPLOAD_DEBUG: Attivo (abilita il supporto al debug per i processi di caricamento).

Terminate i precedenti passaggi, il nostro sistema è configurato nella parte relativa alle impostazioni generali di funzionamento. Le restanti configurazioni non citate sono ben spiegate all’interno della user guide ufficiale. Consiglio di dare un’occhiata alle impostazioni di banda per definire il comportamento di ZoneMinder nelle varie situazioni di utilizzo.

I monitor

Ogni monitor equivale ad una telecamera, e prima di configurarli in ZoneMinder è necessario impostare le telecamere affinché trasmettano il flusso video tramite protocollo RTSP, o altro formato compatibile, ma soprattutto in sicurezza con delle credenziali di accesso definite. Molto importante è anche scegliere in anticipo una risoluzione ed il numero di fps desiderati. Per capire come scegliere al meglio questi valori fare affidamento a quanto indicato nel precedente articolo, e maggiori dettagli in merito agli altri valori da scegliere è possibile ricavarli da questo documento.

ZoneMinder supporta svariati protocolli di comunicazione e tantissimi modelli di telecamere, ad esempio è possibile integrare telecamere con protocollo ONVIF o telecamere DIY. Un esempio è l’utilizzo del protocollo MJPEG over HTTP su un Raspberry Pi tramite MotionEyeOS, sfruttando la modalità Fast Network Camera.

Un elenco di telecamere compatibili è disponibile nella wiki ufficiale oppure nei Presets all’interno di ZoneMinder stesso.

In questo tutorial vedremo come integrare una telecamera Hikvision, per la precisione il modello DS-2CD2142FWD-I, tramite protocollo RTSP con una risoluzione HD (1280×720) a 20 fps ed il flusso video codificato in H.264 (Disabilitare le codifiche H.264+ e H.265 non attualmente supportate).

Molte telecamere posseggono multipli flussi video, un esempio di configurazione per il flusso principale è mostrato nell’esempio sottostante.

La corretta trasmissione del flusso video può essere verificata tramite l’utilizzo di un player che supporta le risorse di rete, come ad esempio VLC, mentre il percorso di rete da utilizzare è possibile recuperarlo tramite la documentazione fornita con la telecamera o consultando la wiki ufficiale.

Tramite la console principale aggiungere un nuovo monitor, che nell’esempio in esame inquadrerà la zona garage.

Nella finestra di aggiunta monitor, in alto a destra, sono disponibili 3 voci. La voce ONVIF permette di integrare le telecamere tramite l’omonimo protocollo e Presets di applicare dei modelli pre-configurati.

La configurazione che realizzeremo gestirà il monitor in modalità rilevazione di movimento, ma è possibile gestire altre modalità come la registrazione continua.

Configuriamo quindi le seguenti voci nella sezione “Generale”:

  • Nome: Il nome della telecamera, ad esempio la descrizione dell’area inquadrata;
  • Note: Una descrizione aggiuntiva o delle annotazioni;
  • Tipo Sorgente: Remoto (la tipologia di sorgente con il quale recuperare l’immagine);
  • Funzione: Modect (scegliere in base alle proprie esigenze. Modect registrerà alla rilevazione di un movimento, mentre una spiegazione dettagliata per ogni modalità è disponibile nella user guide ufficiale);
  • Riferimento Miscela Immagine percentuale: Selezionare in base alla posizione della telecamera, ovvero Indoor (interna) o Outdoor (esterna);
  • Alarm Reference Image Blend %ge: 12,5% (identifica la differenza in % rispetto le immagini precedenti, per definire un allarme. Maggiore è il valore e più lentamente verranno rilevati gli eventi di allarme. Una spiegazione dettagliata è disponibile nella user guide ufficiale).

Passiamo poi alla sezione “Sorgente”:

  • Protocollo Remoto:  RTSP (scegliere il protocollo definito sulla telecamera);
  • Metodo RemotoRTP/RTSP (scegliere il protocollo definito sulla telecamera);
  • Nome dell’Host Remoto: user:password@IP (le credenziali definite sulla telecamera. Può variare in base al modello e protocollo utilizzato, consultare la documentazione fornita con la telecamera o la wiki ufficiale);
  • Porta dell’Host Remoto: 554 (la porta di comunicazione definita dal protocollo o dalla telecamera. Può variare in base al modello e protocollo utilizzato, consultare la documentazione fornita con la telecamera o la wiki ufficiale);
  • Percorso dell’Host Remoto: /live/ (il percorso del flusso video fornito dalla telecamera. Può variare in base al modello e protocollo utilizzato, consultare la documentazione fornita con la telecamera o la wiki ufficiale);
  • Target colorspace: colori a 32 bit (la qualità dell’immagine, ovvero la profondità di colore);
  • Capture Resolution (pixels)1280×720 720p (indicare la risoluzione impostata in precedenza nelle impostazioni della telecamera);
  • Use RTSP Response Media URL: Attivo (può variare in base al modello e protocollo, consultare la wiki ufficiale).

Configurate le informazioni principali del monitor, ci spostiamo su quelle ausiliarie utili per la gestione tramite ZoneMinder.

Configuriamo quindi le seguenti voci nella sezione “Storage”:

  • Storage Area: Default (il percorso dove verranno salvati i file relativi agli eventi della specifica telecamera. Possono essere definiti diversi percorsi nelle impostazioni generali, nell’omonima sezione);
  • Save JPEGs: Frames + Analysis images (definisce se salvare anche alcuni fotogrammi dell’evento oltre al video complessivo. In questo caso verranno salvate tutte le immagini, ma è possibile definire ad esempio di salvare solo le immagini di analisi. Minore sarà il numero dei file salvati e minore sarà lo spazio utilizzato sul disco);
  • Video Writer: X264 Encode (il componente che sì occuperà di gestire la generazione dei video. Nel caso ad esempio si usi FFmpeg per gestire l’audio, selezionare l’apposito componente).
Attenzione: Per permettere la registrazione di un flusso audio è necessario utilizzare il passthrough tramite FFmpeg, oltre a fornire il percorso del flusso video compatibile e ad avere una telecamera con un microfono interno/esterno correttamente configurato.
 

Passiamo poi alla sezione “Timestamp”:

  • Formato etichetta timestamp: %N – %d/%m/%y – %H:%M:%S %Q (definisce l’OSD di timestamp sull’immagine della telecamera. Nel caso in esame mostrerà: Garage – 24/04/21 – 24:00:00 – Causa ZMTrigger. Maggiori dettagli sono disponibili nella user guide ufficiale);
  • coordinata X etichetta: Permette di definire la coordinata X di posizionamento del timestamp (può variare in base alla risoluzione dell’immagine);
  • coordinata Y etichetta: Permette di definire la coordinata Y di posizionamento del timestamp (può variare in base alla risoluzione dell’immagine);
  • Font Size: Definisce la dimensione del timestamp (può variare in base alla risoluzione dell’immagine).

Probabilmente “Buffers” è la più importante delle sezioni del nostro monitor poiché permette di definire come questo gestirà gli eventi di allarme ed il suo streaming. Una descrizione più completa ed esaustiva dei valori configurabili è disponibile nella user guide ufficiale.

Per definire correttamente i valori è necessario prendere in esame il dimensionamento dell’hardware, in particolare della memoria RAM, ben spiegato nel precedente articolo. Maggiori saranno i monitor e più sarà necessario stare attenti a non sovraccaricare il sistema. Se la guida di installazione è stata eseguita correttamente, circa il 70% della memoria complessiva sarà dedicato esclusivamente a ZoneMinder.

Altro fattore importante è il numero di fps del flusso video della nostra telecamera, poiché al variare di questo i valori dovranno essere tarati per ottenere il risultato desiderato. 

Attenzione: I valori nell’immagine sottostante sono puramente di esempio, ma tendenzialmente adeguati alla configurazione della telecamera in esame.

Vediamo quindi il loro significato:

  • Grandezza Buffer Immagine (frames): Il numero complessivo dei fotogrammi che rimarranno in memoria (un valore troppo alto può appesantire il sistema); 
  • Immagini Allerta: Il numero dei fotogrammi che verranno processati durante l’avvio di un evento allarme (un valore troppo alto può rallentare l’analisi, mentre un valore troppo basso può generare falsi positivi);
  • Buffer di immagini Pre Evento: Il numero dei fotogrammi precedenti all’evento, che verranno salvati con esso (sarà possibile vedere gli avvenimenti accaduti prima che l’evento sia stato scatenato);
  • Buffer di immagini Dopo Evento: Il numero dei fotogrammi successivi all’evento, che verranno salvati con esso (sarà possibile vedere gli avvenimenti accaduti dopo che l’evento sia finito);
  • Stream Replay Image Buffer: Il numero complessivo dei fotogrammi relativi allo streaming in diretta, permettendo la pausa ed il riavvolgimento di questo. Impostandolo a 0 questa funzionalità verrà disabilitata, mentre quando abilitata questi verranno salvati in locale (può rallentare il sistema in caso di troppi fotogrammi o numero eccessivo di monitor);
  • Allarme Conta frame: Il numero di fotogrammi consecutivi in allarme dopo il quale verrà dato il consenso alla creazione dell’evento. Questo parametro permette di evitare falsi positivi dovuti a rapide transazioni o sfarfallii nell’immagine dovuti alla comunicazione tra il server e la telecamera.

Completiamo quindi la configurazione dei monitor con le funzioni accessorie.

La sezione “Controllo” permette la configurazione per il controllo della telecamera, in particolare quando questa è PTZ.

Essendo ogni telecamera differente è necessario verificare la disponibilità uno script di controllo compatibile con essa, mentre vedremo più avanti come configurare le capacità di controllo. Nell’esempio in questione, non avendo una telecamera PTZ, configurerò il controllo per eseguire soltanto la funzione di “Reset”, ovvero di riavvio del software di questa.

Tutti gli script di controllo sono disponibili nel percorso /usr/share/perl5/ZoneMinder/Control/ dove è possibile modificarli o aggiungerne altri. Maggiori dettagli sulla configurazione del controllo sono disponibili nella user guide ufficiale.

Vediamo quindi come configurare il “Controllo” per l’esempio in questione:

  • Controllabile: Attivo (abilita il controllo sulla specifica telecamera);
  • Tipo Controllo: Lo script di controllo relativo al modello/marchio della telecamera;
  • Dispositivo di controllo: Il valore richiesto dalla telecamera per il controllo (varia in base al dispositivo ed in alcuni casi è possibile ricavarlo tramite i log, attivandoli dall’apposita sezione nelle impostazioni);
  • Indirizzo di controllo: L’indirizzo di accesso del dispositivo (spesso equivale al nome dell’host, comprensivo di credenziali, impostato nella sezione “Sorgente”);
  • Auto Stop Timeout: Il tempo (in secondi) dopo il quale il sistema invierà un comando di “Stop” automatico.

Ed infine, nella sezione “Altro”, configuriamo le informazioni generiche del monitor:

  • Prefisso Evento: Il prefisso per gli eventi che verrà seguito dal numero progressivo affidato a questo. Generalmente è consigliato indicare il nome assegnato al monitor seguito da un separatore;
  • Scala di default: Permette di definire la scala predefinita nelle visualizzazioni di streaming in diretta;
  • Signal Check Points: Il numero di punti casuali da controllare nell’immagine per definire una “perdita di comunicazione” con il dispositivo (essenzialmente utilizzato per telecamere connesse direttamente e non di rete);
  • Signal Check Colour: Tendenzialmente durante una perdita di comunicazione l’immagine rilevata è un colore unico, definibile tramite questo campo;
  • Colore Web: Un colore univoco da assegnare ad ogni monitor per permettere la sua identificazione in alcune visualizzazioni, come la linea temporale;
  • Embed EXIF data into image: Attivo (se disponibili, aggiunge informazioni aggiuntive all’interno dell’EXIF dei fotogrammi salvati).

Configurati tutti i monitor consiglio di creare dei gruppi tramite l’apposita sezione:

Possiamo quindi considerare terminata la configurazione dei monitor per quanto riguarda la loro integrazione, anche se più avanti vedremo come configurare gli elementi che combinati tra loro gestiranno la messa in funzione di questi.

Di seguito un esempio di come apparirà la nostra console, dove sarà presente un resoconto di tutti i monitor, compreso il consumo di rete ed fps in acquisizione:

Il controllo

Come anticipato nel capitolo precedente è possibile definire nel dettaglio il controllo dei monitor nella sezione “Capacità di controllo”, particolarmente utile nel caso di telecamere PTZ.

Non ci soffermeremo troppo su questo argomento poiché varia troppo in base al modello/marchio della telecamera, eventuali maggiori dettagli sono disponibili nella user guide ufficiale.

Tramite la sezione “Controllo” del monitor è possibile accedere alla configurazione delle capacità di controllo, selezionando la voce “Modifica” nella chiave “Tipo Controllo”:

Selezionando uno dei controlli pre-impostati è possibile personalizzarlo in base alle specifiche della propria telecamera.

Essenzialmente, nel nostro caso esempio, andremo solo a definire nella sezione “Principale” i valori generali, e disabiliteremo tutte le altre funzioni a noi non utili.

Per definire cosa eseguirà il controllo è necessario selezionare il tipo di protocollo, che generalmente è “Locale”, ed il protocollo che in questo caso equivale al nome dello script di controllo posizionato nel percorso precedentemente indicato.

Nel nostro caso abiliteremo solo la funzione Puo’ Reset e disabiliteremo tutte le altre funzioni. Molto interessante è il discorso dei preset che permette di gestire delle posizioni preferite generalmente configurabili nell’interfaccia di gestione della telecamera stessa.

 

Come è possibile notare nell’immagine sottostante, nella visualizzazione in diretta della telecamera saranno presenti i vari controlli configurati, come “RESETTA”:

Le zone

Ogni monitor prevede la configurazione di multiple zone, ovvero delle aree logiche configurabili all’interno dell’inquadratura della telecamera, che permettono di definire in quali punti ed in che modalità dovrà essere generato un evento, ad esempio sulla base del movimento rilevato.

Solitamente la configurazione delle zone è quella che richiede più tempo e prove prima della totale messa in funzione di ZoneMinder.

Proverò ad offrire qualche consiglio su come procedere alla loro configurazione, ma questa è differente per ogni singola telecamera ed ogni tipologia di ambiente da monitorare.

É altamente sconsigliato l’utilizzo delle zone con telecamere PTZ configurate in modalità Modect poiché con il movimento di queste, anche poi riportandole in posizione corretta, potrebbero scatenarsi degli eventi involontari. Consiglio l’utilizzo principalmente con telecamere ad ottica fissa e regolabile o di gestire le modalità di funzionamento in maniera intelligente.

Per accedere alle zone di un monitor, selezionare il numero indicato sotto l’omonima colonna (all’estrema destra):

Consiglio di eliminare qualsiasi zona predefinita per procedere alla creazione di nuove zone sulla base delle proprie esigenze.

Di seguito un esempio di configurazione sulla base dell’inquadratura interna del garage:

Nel caso si voglia una spiegazione dettagliata di ogni singolo parametro configurabile, questa è disponibile nella user guide ufficiale, oppure nella wiki ufficiale.

Come visibile nell’immagine precedente, il primo consiglio che posso dare è di dividere l’inquadratura in più zone.

Nell’esempio in questione possiamo notare zone di diverso colore, questo perché ZoneMinder supporta varie tipologie di logiche, e quelle che maggiormente sì usano sono le Active e le Preclusive.

Le zone di tipo Active, come dice la parola stessa, sono attive e di conseguenza in caso di movimento al loro interno verrà scatenato un evento di allarme.

A differenza, le zone Preclusive, inibiscono la creazione di un evento. Sono utilissime per evitare dei falsi positivi relativi a grandi cambiamenti dell’immagine dovuti a fonti d’illuminazione fisse, di fatto come visibile nell’esempio queste 2 aree (in blu) sono posizionate sopra la plafoniera e la griglia di areazione del garage.

Vi è inoltre un altro tipo di zone che potrebbero tornare utili, le Privacy. Essenzialmente permettono di nascondere un’area definita dell’inquadratura per evitare problemi nel caso in cui quel punto non possano essere eseguite delle riprese per motivi di privacy (questo tipo di zone richiedono un riavvio del processo di acquisizione video per essere applicate).

Vediamo un esempio di configurazione delle zone:

Come possiamo notare, la configurazione varia in base sia all’area delimitata che alla tipologia della zona.

Principalmente esistono due metodologie di controllo utilizzate, definibili con il parametro Metodo di Controllo Allarme, quali Blobs ed AlamedPixels. Vediamole:

  • Blobs: Un evento viene generato per Blobs quando l’oggetto rilevato è un agglomerato di pixel adiacenti, per capire meglio basandoci sull’immagine sottostante sono Blobs gli elementi B, C e D poiché i pixel incriminati sono tutti vicini. Possono essere definiti un numero massimo e minimo di blobs;
  • AlarmedPixels: Equivale ad un numero minimo di variazione di pixel dopo il quale viene generato un evento. Basandoci sull’immagine sottostante ed impostando un minimo di 5 pixel, tutte le aree presenti sono valide, mentre aumentandolo a 6 solo A e D lo risulterebbero.

Come possiamo notare dalle zone precedentemente definite, è consigliato utilizzare Blobs dove l’evento è scatenato dal passaggio di persone, animali o oggetti interi come dei veicoli (ad esempio l’interno del nostro garage), mentre è consigliato utilizzare AlarmedPixels ove i cambiamenti dell’area interessata possono accadere con variazioni generiche dell’immagine come il nostro portellone dove in fase di apertura la variazione non sarà generata da masse in movimento.

Subito dopo aver definito la metodologia di controllo, è necessario definire il fattore di unità per i vari parametri. I fattori di unità definibili sono Percent o Pixels:

  • Percent: I parametri configurati verranno analizzati in percentuale (%), ad esempio definendo che un evento debba essere generato con una zona allarmata di minimo “10” vuol dire che il 10% della zona deve risultare occupata. Tendenzialmente impostando una percentuale è possibile ridimensionare leggermente le aree senza dover riconfigurare nulla;
  • Pixels: A differenza della percentuale, tutto avverrà sulla base di un numero di pixel definito. Sono principalmente utili per tarare con più precisione, ma al contempo sono più complessi da gestire poiché è necessario fare un preciso calcolo dei pixel necessari.

Una spiegazione più dettagliata di questi concetti è disponibile nella wiki ufficiale.

Scelta la metodologia di controllo e il fattore di unità, vi sono per ognuno svariati parametri da configurare:

  • Colore Allarme (RGB): Utile nelle zone che possono generare un evento, è il colore con il quale verranno evidenziati gli oggetti che hanno scatenato l’allarme (visibile nelle immagini di analisi);
  • Min/Max Soglia Pixel (0-255): Utilizzato principalmente nel metodo AlarmedPixels, il primo valore è la soglia minima di pixel e il secondo la soglia massima. La soglia minima indica di quanti pixel minimo deve variare l’immagine prima che venga scatenato un allarme, la massima serve ad indicare che se la variazione supera quel numero di pixel l’allarme verrà inibito. Impostare la massima come 0 per accettare qualsiasi allarme sopra la soglia minima;
  • Larghezza/Altezza Filtro (pixels): Questo valore è sempre in pixel anche quando è impostata la percentuale e deve essere sempre un numero dispari, dove generalmente 3×3 o 5×5 sono i valori consigliati. Indica quanti pixel devono circondare un pixel in allarme per definirlo tale;
  • Min/Max Area Allarmata: Il primo valore è la soglia minima di pixel o percentuale ed il secondo la soglia massima. La soglia minima indica quanti pixel minimo o di che percentuale minima deve variare l’immagine prima che venga scatenato un allarme, la massima serve ad indicare che se la variazione supera quel numero di pixel o di percentuale l’allarme verrà inibito. Impostare la massima come 0 per accettare qualsiasi allarme sopra la soglia minima;
  • Min/Max Area Filtrata: Utilizzato principalmente nel metodo FilteredPixels, che non abbiamo approfondito, dove essenzialmente viene aggiunto un ulteriore livello di analisi sull’immagine rilevata dalla logica AlarmedPixels. La configurazione è la medesima di quelle sopra indicate;
  • Min/Max Area di Blob: Utilizzato principalmente nel metodo Blobs, Il primo valore è la soglia minima di pixel o percentuale ed il secondo la soglia massima. La soglia minima indica quanti pixel minimo o di che percentuale minima deve essere una Blobs prima che venga scatenato un allarme, la massima serve ad indicare che se la Blobs supera quel numero di pixel o di percentuale l’allarme verrà inibito. La soglia massima deve essere 0 poiché non c’è una reale utilità ad impostare questo valore;
  • Min/Max Blobs: Utilizzato principalmente nel metodo Blobs, il primo valore è la soglia minima di Blobs ed il secondo la soglia massima. La soglia minima indica di quanti Blobs minimo devono essere presenti prima che venga scatenato un allarme, la massima serve ad indicare che se il numero di Blobs supera quello impostato l’allarme verrà inibito. Impostare la massima come 0 per accettare qualsiasi allarme sopra la soglia minima;
  • Overload Frame Ignore Count: Definisce il numero di fotogrammi da considerare in una variazione eccessiva dell’immagine. Questa funzione è utile per evitare di scatenare un allarme, ad esempio, durante la variazione di illuminazione ambientale poiché potrebbero servire svariati fotogrammi prima che si stabilizzi;
  • Extend Alarm Frame Count: Si applica solo alle zone di tipo Preclusive e definisce per quanti fotogrammi successivi allo scatenarsi di un allarme in questa, rimanga attiva l’inibizione.

Ognuno di questi parametri richiede svariate prove prima di risultare definitivo, quindi Il mio consiglio è di configurare le zone e di provare tutte le combinazioni di movimento possibili.

Nell’immagine in esame, ad esempio, ho eseguito prove di accensione e spegnimento dell’illuminazione interna (plafoniera) ed esterna (grata) sia a portellone chiuso che aperto, ad aprire il portellone solo in parte e richiuderlo, ad aprirlo tutto, ad aprirlo e muovermi passandoci davanti uscendo prima dall’inquadratura, ad aprirlo e muovermi all’interno ed infine a chiuderlo e muovermi all’interno. Dopo svariate regolazioni ho raggiunto l’obbiettivo di generare eventi solo in caso di reale movimento.

In caso di fonti luminose naturali, quindi principalmente all’esterno, consiglio di eseguire le prove anche nelle varie fasce orarie della giornata.

Ricordiamoci che a supporto delle zone sarà presente Event Server che ci invierà notifiche solo in presenza di oggetti o persone definiti all’interno della sua configurazione, ma comunque prima è necessario definire correttamente le zone.

I filtri

I filtri sono dei flussi funzionali che possono essere eseguiti manualmente o in background, e principalmente vengono sfruttati per automatizzare alcuni processi come l’invio via email, l’upload su server esterno o la pulizia degli eventi.

Maggiori dettagli sui filtri è possibile visionarli consultando la user guide ufficiale, ma vedremo come configurarne alcuni dei più comuni.

Attenzione: Per avere gli ID filtro progressivi partendo dall’1, consiglio di non eliminare i filtri predefiniti già presenti, ma di modificarli.

Nei filtri che vedremo alcune delle impostazioni risultano comuni, vediamo quali:

  • Update used disk space: Aggiorna il valore di spazio utilizzato sul disco;
  • Fai upload eventi (FTP): Esegue l’upload degli eventi sul server esterno definito in precedenza nelle impostazioni;
  • Invia dettagli via email: Invia le email con i dettagli degli eventi come definito in precedenza nelle impostazioni;
  • Elimina gli eventi: Elimina gli eventi;
  • Esegui filtro in background: Esegue automaticamente il filtro in background. Verrà aggiunto il simbolo di “*” al nome del filtro;
  • Run filter concurrently: Esegue il filtro in un suo processo separato in parallelo ad altri. Verrà aggiunto il simbolo di “&” al nome del filtro.

I primi 2 filtri si occuperanno essenzialmente di lavorare sugli eventi scatenati con causa Alarm e Motion.

Gli eventi che ho definito Alarm verranno generati tramite il componente ZMTrigger, precedentemente attivato, che permetterà di eseguire comandi da client remoti tramite telenet. Gli eventi Motion invece verranno automaticamente generati tramite la rilevazione del movimento impostato con le zone.

A questi filtri sono state associate delle specifiche condizioni. Nel caso degli eventi Alarm basterà che la causa sia quella indicata poiché saranno generati di proposito, mentre gli eventi Motion possiedono multiple condizioni per avere la sicurezza di eseguire le operazioni solo nel caso in cui l’evento generato soddisfi certe caratteristiche, come ad esempio il numero di fotogrammi totali e di fotogrammi in allarme minimo, la durata complessiva minima ed il punteggio totale minimo.

Questi eventi verranno notificati via email e caricati sul server esterno definito in precedenza nelle impostazioni (se configurato).

Le condizioni di ogni filtro possono essere configurate in AND o OR e raggruppate, tramite l’utilizzo degli elenchi laterali.

Ogni filtro permette di eseguire le operazioni in un preciso ordine, e nei casi in esame verranno processati 10 alla volta (per non sovraccaricare il sistema) e per ID crescente. Per 20 eventi generati verranno gestiti prima i 10 più “vecchi”, ed alla successiva esecuzione del filtro verranno processati i restanti 10.

Nei seguenti filtri invece verrà eseguita la pulizia degli eventi non più necessari.

Nel primo caso verranno cancellati gli eventi più “vecchi” fino a quando la percentuale di utilizzo del disco non scende al 70%, e verranno ignorati gli eventi archiviati manualmente. Nel secondo caso verranno eliminati gli eventi più vecchi di 90 giorni, ed invece di basarci sull’ID crescente la discriminante sarà la data di creazione.

Condivisione

Come abbiamo visto, gli eventi salvati possono essere caricati su un server esterno, ma in alcuni casi potrebbe essere utile poterli visionare tramite altri software di gestione come Home Assistant o semplicemente accedervi tramite il proprio computer.

Per condividerli all’interno della rete locale utilizzeremo il software SAMBA che sfrutta il protocollo SMB integrabile in gran parte dei sistemi esistenti.

Procediamo quindi con l’installazione di SAMBA e poi riavviamo:

# sudo apt-get update
# sudo apt-get install samba

# sudo reboot

Creare quindi degli utenti per accedere. Consiglio di creare un utente “root” ed un utente che equivale a quello impostato in fase di installazione, ma soprattutto di tenere allineate le password tra utente di sistema e utente SMB.

Creati gli utenti, predisponiamo il percorso di condivisione ed il suo contenuto. Come è possibile vedere dai comandi sottostanti, andremo a definire le nostre condivisioni nel percorso /etc/zm/shares/events/ creando un collegamento per ogni monitor. Il primo percorso rispecchia l’ID del monitor, mentre il secondo il nome di questo. Nel nostro caso il monitor con ID “1” è denominato “Garage”.

Creati tutti i collegamenti impostiamo i corretti permessi.

# sudo smbpasswd -a <USERNAME>

# mkdir -p /etc/zm/shares/events/
# ln -s /var/cache/zoneminder/events/1/ /etc/zm/shares/events/Garage
# sudo chown -R www-data:www-data /etc/zm/shares/

Sostituire nel percorso /etc/samba/ il file di configurazione predefinito smb.conf con quello fornito nel pacchetto della sezione materiale necessario.

Attenzione: Per la corretta condivisione, è stato attivato l’accesso via SMB alle directory esterne del percorso scelto. Non utilizzare per altre condivisioni “delicate”.

All’interno del file modificare le seguenti chiavi:

  • workgroup: Presente all’inizio del file, indicare il gruppo di lavoro della propria rete (solo nel caso questo sia stato modificato);
  • valid users: Presente alla fine del file, indicare gli utenti precedentemente impostati (ad esempio: “root”,”vito”);
  • read list: Presente alla fine del file, indicare gli utenti precedentemente impostati (ad esempio: “root”,”vito”).

Terminate le modifiche applicare i corretti permessi, testare la configurazione e riavviare.

La condivisione sarà in sola lettura per evitare danni agli archivi di ZoneMinder, e non automaticamente rilevabile nella rete per aumentarne la sicurezza. Tutti i parametri configurabili all’interno del file smb.conf sono descritti nella documentazione ufficiale.

# chmod 644 /etc/samba/smb.conf
# sudo testparm
# sudo systemctl restart smbd nmbd

# sudo reboot

Terminata la configurazione, la condivisione sarà disponibile con il nome EVENTI, accessibile ad esempio tramite il percorso smb://192.168.0.223/EVENTI/.

Vedremo in un prossimo articolo come sfruttare questa condivisione per la visione degli eventi all’interno di Home Assistant, nel frattempo è possibile testarla tramite il proprio computer:

Event Server

La configurazione di Event Server può sembrare molto complessa, ma in realtà le chiavi ed i parametri da modificare rispetto la configurazione predefinita sono pochi. Se l’installazione è avvenuta seguendo il precedente articolo, sono stati forniti anche dei file pre-configurati che ci semplificheranno le varie configurazioni.

Event Server si occuperà essenzialmente delle seguenti operazioni:

  • L’invio di notifiche per le varie fasi degli eventi, e non solo al termine di questi come invece accade per le email tramite i filtri;
  • L’esecuzione dell’analisi attiva delle immagini per rilevare la presenza di oggetti e persone;
  • L’Integrazione con i client ufficiali tramite WebSocket;
  • L’esposizione delle varie fasi degli eventi verso il Broker MQTT
  • L’esecuzione di script personalizzati;
  • Machine Learning avanzato e la gestione di hardware dedicato come l’Edge TPU del progetto Google Coral.

In merito al riconoscimento degli oggetti e persone, in questo tutorial vedremo essenzialmente come configurarlo per sfruttare la tecnologia YOLO che si basa sull’utilizzo del processore (CPU) per l’analisi attiva delle immagini. Spiegazioni più dettagliate sono disponibili nella user guide ufficiale.

Consiglio di predisporre un account di Pushover come indicato in questo articolo dato che Event Server prevede di base uno script per gestire le notifiche tramite questo servizio. Penso sia consono creare una specifica applicazione relativa alla video sorveglianza, ed è possibile trovare un’icona adeguata nel pacchetto fornito nella sezione materiale necessario.

L’alternativa a Pushover è di sfruttare il client ufficiale, che però trovo decisamente più scomodo e meno flessibile, oppure di gestire le notifiche sfruttando l’integrazione con Home Assistant ed i dati esposti tramite MQTT.

Prima di partire con la configurazione è necessario prendere confidenza con la modalità di debug.

Modificare il file secrets.ini all’interno del percorso /etc/zm/ impostando tutte le chiavi necessarie.

Non penso sia necessaria una spiegazione dettagliata su come configurare queste chiavi poiché arrivati a questo punto dovrebbero essere abbastanza chiari i valori da indicare, ma essenzialmente sono da definire: il percorso di accesso da remoto (DNS) configurato in fase di installazione, le credenziali dell’utente “EventServer” appositamente creato nel capitolo precedente, i token user ed applicazione del servizio Pushover ed infine i dati di accesso al proprio Broker MQTT.

Molto importante è definire la chiave NETWORK_PORT in modo che non vada in conflitto con altre porte utilizzate dai servizi della nostra rete, ed aprirla sul router per il protocollo TCP. Questa porta verrà utilizzata per i WebSocket. La porta predefinita è la 9000, ma consiglio di sceglierne una differente come nell’esempio in questione dove useremo la porta 9005:

Avendo attivato l’opzione per l’esecuzione automatica nelle impostazioni, Il processo di Event Server verrà avviato durante l’inizializzazione di ZoneMinder, di conseguenza per eseguirlo in modalità debug è necessario prima terminare tutti i processi in esecuzione:

# killall -9 zmeventnotification.pl
# sudo -u www-data /usr/bin/zmeventnotification.pl --debug

Attenzione: Può essere necessario eseguire molteplici volte il comando di kill, fino a quando non ci verrà indicato che non ci sono più processi in esecuzione.

Avviata la modalità di debug ci verrà subito fornito un riepilogo della configurazione, ed eseguendo un allarme forzato sul monitor è possibile comprendere se il sistema sta correttamente ascoltando degli eventi generati da ZoneMinder (nei file pre-configurati di esempio è abilitato solo il monitor con ID 1):

Compreso come verificare il corretto funzionamento, e configurate correttamente tutte le chiavi nel file secrets.ini, passiamo alla configurazione dei parametri.

Nel file zmeventnotification.ini, che comprende tutte le impostazioni generiche e relative alla gestione delle notifiche, è possibile definire svariati parametri come l’abilitazione di Pushover, della comunicazione verso il Broker MQTT o del protocollo FCM utilizzato dal client mobile ufficiale.

Vi è una descrizione abbastanza chiara nei commenti relativi ad ogni parametro, e dove sono necessari maggiori dettagli, possiamo fare affidamento sulla user guide ufficiale.

Presupponendo di aver correttamente predisposto tutti i servizi, gli unici parametri che ci interessa modificare sono quelli relativi alla gestione degli eventi, presenti all’interno della sezione hookGli hook non sono altro che degli “elaboratori” che restituiscono un valore 0 (riuscito) o 1 (fallito).

L’hook predefinito è quello per il riconoscimento degli oggetti e persone, ed è possibile sfruttarlo con i seguenti servizi:

  • webWebSocket, usato ad esempio dal client desktop ed in alcuni casi da quello mobile;
  • fcm: Firebase Cloud Messaging (FCM), usato dal client mobile per ricevere le notifiche push;
  • mqttMQTT, per esporre i dati verso il proprio Broker MQTT;
  • apiAPI, sfruttabile da applicativi di terze parti oppure ad esempio dallo script per le notifiche con Pushover;
  • all: Include tutti i servizi sopra indicati;
  • none: Esclude tutti i servizi sopra indicati.

I servizi sopra indicati sono applicabili ai parametri:

  • event_start_notify_on_hook_success: Quando l’elaborazione dell’hook è avvenuta con successo all’avvio di un evento (0);
  • event_start_notify_on_hook_fail: Quando l’elaborazione dell’hook è fallita all’avvio di un evento (1);
  • event_end_notify_on_hook_success: Quando l’elaborazione dell’hook è avvenuta con successo al termine di un evento (0);
  • event_end_notify_on_hook_fail: Quando l’elaborazione dell’hook è fallita al termine di un evento (1).

Nell’esempio sottostante, verranno eseguiti tutti i servizi solo quando all’avvio di un evento l’hook verrà elaborato con successo avendo configurato come “all” il primo parametro. Può essere utile ad esempio impostare solo “mqtt” sui restanti parametri, per poter analizzare eventuali hook falliti o comprendere quando l’evento è iniziato e quando è terminato.

Gli hook saranno elaborati solo se la relativa chiave use_hooks all’interno della sezione customize risulta abilitata. Da considerare anche i seguenti parametri:

  • send_event_start_notification: Definisce se inviare notifiche all’avvio degli eventi (indipendentemente dagli hook);
  • send_event_end_notification: Definisce se inviare notifiche al termine degli eventi (indipendentemente dagli hook).
[customize]
...
# Send event start notifications (default: yes)
# If no, starting notifications will not be sent out
send_event_start_notification=yes
...
# Send event end notifications (default: no)
# Note that if you are using hooks for end notifications, they may change
# the final decision. This needs to be yes if you want end notifications with 
# or without hooks
send_event_end_notification=no
...
# This is a master on/off setting for hooks. If it is set to no
# hooks will not be used no matter what is set in the [hook] section
# This makes it easy for folks not using hooks to just turn this off
# default:no
use_hooks=yes
...
[hook]
...
# Possible channels = web,fcm,mqtt,api
# all is short for web,fcm,mqtt,api
# use none for no notifications, or comment out the attribute

# When an event starts and hook returns 0, send notification to all. Default: none
event_start_notify_on_hook_success=all

# When an event starts and hook returns 1, send notification only to desktop. Default: none
event_start_notify_on_hook_fail=none

# When an event ends and hook returns 0, send notification to fcm,web,api. Default: none
event_end_notify_on_hook_success=none

# When an event ends and hook returns 1, don't send notifications. Default: none
event_end_notify_on_hook_fail=none

Nell’ultimo file da configurare, ovvero objectconfig.ini, sono invece presenti tutti i parametri relativi al riconoscimento degli oggetti e persone.

Come per il precedente, vi è una descrizione abbastanza chiara nei commenti relativi ad ogni parametro, e dove sono necessari maggiori dettagli, possiamo fare affidamento sulla user guide ufficiale.

Attenzione: All’interno del file sono presenti le configurazioni per tutte le modalità e funzioni supportate, ma molte di queste sono state disabilitate poiché superflue e non funzionali al nostro utilizzo.

Essenzialmente le voci da configurare sono le seguenti:

[general]
...
# You can now limit the # of detection process
# per target processor. If not specified, default is 1
# Other detection processes will wait to acquire lock
cpu_max_processes=3
tpu_max_processes=1
gpu_max_processes=1
...
[object]
...
# Yolo v4 on GPU (falls back to CPU if no GPU)
yolo4_object_weights={{base_data_path}}/models/yolov4/yolov4.weights
yolo4_object_labels={{base_data_path}}/models/yolov4/coco.names
yolo4_object_config={{base_data_path}}/models/yolov4/yolov4.cfg
yolo4_object_framework=opencv
yolo4_object_processor=cpu
...
# Monitor 1
[monitor-1]
match_past_detections=no
wait=5
resize=no
object_detection_pattern=(person)
detection_sequence=object
...

Nella sezione general impostare quanti processi di analisi possono essere eseguiti contemporaneamente per ogni tipologia di processore supportato. Il numero dei processi eseguibili in parallelo deve essere considerato in base alla potenza del proprio hardware.

Nella sezione object vi è la possibilità di definire il funzionamento della tecnologia di analisi, in questo caso YOLO in versione 4, dove andremo a definire la tipologia di processore utilizzato per l’analisi, in questo caso quindi la cpu.

Definiti questi parametri generali, arriva la parte più importante, ovvero al configurazione dei monitor.

Il file pre-configurato è predisposto per identificare ogni tipologia di oggetto rilevabile. Per permettere al monitor di gestire l’analisi delle immagini è necessario innanzitutto dichiararlo, e successivamente impostare le chiavi specifiche per esso (che sovrapporranno quelle generali).

Molto importante è definire il pattern, dove nell’esempio in esame rileverà solo le persone. Un esempio per permettere di identificare multipli oggetti è il seguente:

  • object_detection_pattern=(person|car|motorbike|bus|truck|boat)

Indicare il valore “.*” permettere di identificare ogni tipologia di oggetto. Creare ovviamente una sezione per ogni monitor sul quale si desidera abilitare il rilevamento degli oggetti e persone.

Se tutto funziona correttamente, all’avvio di un evento vedremo apparire nella colonna Causa una nota con indicato gli elementi rilevati, ed al contempo riceveremo una notifica e i dati esposti sui servizi scelti. Per generare un evento è necessario che questo venga forzato manualmente, o che le zone precedentemente configurate ne generino automaticamente uno.

A prescindere dalle elaborazioni di Event Server, se le zone sono state correttamente configure, Il sistema provvederà comunque a generare l’evento e ad eseguire i relativi filtri come l’invio dell’email, verificabile sotto il nome dell’evento stesso tramite la sigla “Emailed”.

Nelle immagini elaborate da Event Server verranno “disegnati” dei rettangoli attorno agli oggetti identificati, con una percentuale di affidabilità ed una colorazione relativa a questa. Verranno associati anche dei tag [a], [s] o [x] che definiranno se l’identificazione è avvenuta in un frame di allarme, in uno snapshot o in un frame con punteggio alto (è una funzione di debug utile, e disabilitabile).

Come visibile nell’immagine sottostante, sfruttando uno strumento di analisi del flusso dati MQTT, come ad esempio MQTT Explorer, è possibile verificare che Event Server esponga correttamente i dati verso il nostro Broker MQTT:

ZoneMinder Videosorveglianza - MQTT

I client

Nonostante esistano molteplici client che supportano ZoneMinder, come ad esempio IP Cam Viewer Pro, consiglio di affidarsi al solo client ufficiale zmNinja, disponibile per iOSAndroid e le principali piattaforme desktop (Le notifiche push sono sfruttabili solo sull’app mobile).

Tra la versione desktop e quella mobile dell’applicazione non vi sono particolari differenze nella configurazione, vediamo quindi come impostarla.

Creare un nuovo server all’interno delle impostazioni, quindi indicare le proprie credenziali di accesso e fornire l’URL locale o remoto, di conseguenza gli altri campi si auto compileranno.

Nel caso si volesse, è possibile configurare sia l’accesso locale che quello remoto ed impostare uno come fallback dell’altro e viceversa. Ad esempio è possibile impostare l’accesso locale come principale con fallback sul remoto in modo che all’interno della rete locale venga eseguito l’accesso tramite il primo ed invece quando si è fuori tramite il secondo.

Configurare quindi il server eventi fornendo il proprio indirizzo di accesso remoto seguito dalla porta di comunicazione WebSocket scelta in precedenza.

Spostandosi nella sezione Stato Sistema è possibile verificare la corretta comunicazione con ZoneMinder ed Event Server.

In caso di problemi con Event Serverè possibile verificare che l’applicazione abbia creato il token di comunicazione verificando il file /var/lib/zmeventnotification/push/tokens.txt. Nel caso in cui il token non sia stato creato è necessario verificare l’intera configurazione eseguita, in particolare in merito alla porta di comunicazione WebSocket ed i certificati (il protocollo wss:// equivale a WebSocket Secure).

Ovviamente è possibile vedere lo streaming in diretta delle telecamere, rivedere gli eventi ed eventualmente scaricarne il video. Sono presenti tante altre funzionalità utili come ad esempio la timeline degli eventi e la gestione dei monitor.

Nel caso venissero attivate le notifiche verso il servizio FCM, tramite Event Servervedremmo apparire oltre alle notifiche push stesse una “campanella” con un badge rosso rispecchiante il numero di notifiche ricevute. Sfruttando Pushover o altri servizi consiglio di lasciare attivo l’inoltro verso il servizio FCM, ma di disabilitare tramite le impostazioni del sistema operativo i popup e badge di notifica, permettendo la corretta ricezione da parte dell’applicazione senza però doppie notifiche push visibili.

Home Assistant

L’integrazione di ZoneMinder in Home Assistant permette:

  • La visione in diretta delle telecamere;
  • Di verificare lo stato del sistema;
  • Ricavare il numero degli eventi per ogni monitor;
  • Ricavare la modalità di funzionamento per ogni monitor;
  • Di eseguire registrazioni manuali.

Prima di tutto è necessario aver strutturato il proprio sistema per la gestione dei packages come indicato in questo articolo, ed una volta predisposto il sistema, scaricare il pacchetto fornito nel capitolo materiale necessario.

Definiamo all’interno del file secrets.yaml le credenziali di accesso (indicando l’utente appositamente creato in precedenza tramite le impostazioni) e quelle di comunicazione locale:

# Secrets
...
# ZoneMinder
zoneminder_host: '192.168.0.223:8095'
zoneminder_username: 'HomeAssistant'
zoneminder_password: 'topolino1234'
zoneminder_path: '/zm/'
zoneminder_path_zms: '/zm/cgi-bin/nph-zms'
zoneminder_telnet_host: '192.168.0.223'
zoneminder_telnet_port: '6802'
# -------------------------------------------------------------------------------------------------------------------

Procediamo caricando il package zoneminder.yaml e le personalizzazioni di questo all’interno del file customize.yaml, poi riavviamo Home Assistant.

Attenzione: Il package è stato realizzato per la telecamera esempio presa in esame, di conseguenza sarà necessario modificarlo per supportare i propri monitor configurati. All’interno del pacchetto è presente un file contenente il codice delle card per lovelace, mostrate nell’esempio sottostante.

Al riavvio verranno automaticamente create le varie entità per analizzare lo stato del sistema e di ogni singolo monitor presente:

Tramite la porzione di codice sottostante, presente all’interno del file zoneminder.yaml, è possibile definire le modalità per le entità switch dei singoli monitor.

Nell’esempio in esame, quando l’interruttore Stato Modalità Garage verrà disattivato, la telecamera verrà impostata in modalità Nodect per disattivare la rilevazione del movimento tramite le zone, mentre se attivato passerà in modalità Modect.

Nel caso si volesse eseguire una registrazione manuale, oppure si volesse automatizzare la registrazione delle telecamere ad esempio collegando ad Home Assistant anche il sistema di allarme eseguendole quando vi è un’intrusione, è possibile creare degli switch telnet che sfruttando il componente ZMTrigger avvieranno una registrazione con i parametri forniti.

Nel codice sottostante vi è un comando per avviare la registrazione, ed uno per fermarla:

# Switches
switch:
  # Movimento
  - platform: zoneminder
    command_on: 'Modect'
    command_off: 'Nodect'
  # Registrazione
  - platform: telnet
    switches:
      # Allarme
      # Garage
      zoneminder_manual_record_alarm_garage:
        name: 'Registrazione Manuale Allarme Garage'
        resource: !secret zoneminder_telnet_host
        port: !secret zoneminder_telnet_port
        command_on: '1|on+120|200|Alarm|In Alarm|- Alarm'
        command_off: '1|off|0|Alarm|Cancelled|- Alarm'
        timeout: 0.5
  # -------------------------------------------------------------------------------------------------------------------

Come visibile nelle immagini sottostanti, eseguendo il comando di registrazione manuale tramite gli appositi script, verrà avviata una registrazione di circa 2 minuti con causa “Alarm”. Questi eventi verranno inviati via email e caricati sul server esterno come impostato in precedenza nei filtri. Notare “Emailed” sotto il nome dell’evento.

Modificando la causale sarà ovviamente necessario creare un apposito filtro.

Riproducendo l’evento registrato è possibile notare come nell’OSD del timestamp, all’estrema destra, appaia la causa “Alarm” definita in precedenza tramite la variabile %Q all’interno delle impostazioni di timestamp.

Tenere presente che eseguendo il comando di registrazione vi sarà un ritardo di circa 2 secondi dovuto all’invio dei comandi, compensato però dalle immagini pre e post evento impostate nei buffer del monitor. Se vi è già una registrazione in corso, l’avvio di una nuova registrazione terminerà prima la precedente.

Prendiamo come esempio il comando di avvio registrazione 1|on+120|200|Alarm|In Alarm|- Alarm, ecco come è composto:

  • 1: L’ID del monitor;
  • on+120: Forza lo stato di allarme per 120 secondi (2 minuti), di conseguenza stabilisce la durata dell’evento;
  • 200: Il punteggio (importanza) da fornire all’evento;
  • Alarm: La causa da associare all’evento;
  • In Alarm: Un testo descrittivo da associare alla causa dell’evento;
  • – Alarm: Il testo visibile nel nell’OSD del timestamp (%Q) durante la fase di allarme;

Vi sono ovviamente altri parametri sfruttabili. Maggiori informazioni sull’utilizzo di questo componente sono disponibili nella wiki ufficiale o nel file ZMTrigger Manual.txt fornito con il pacchetto scaricabile nella sezione materiale necessario. Questo componente è sfruttabile anche in altri ambiti tramite dispositivi custom come Arduino.

Per gestire lo stato delle telecamere e del sistema è possibile anche sfruttare le API di ZoneMinder tramite degli script bash integrabili in Home Assistant con l’invio di comandi MQTT verso il server ospitante, come spiegato in questo articolo.

Verifiche di sicurezza

Terminata la configurazione, consiglio di testare ogni singola funzione abilitata prima della reale messa in funzione.

Possiamo ad esempio verificare che facendo scattare un’allarme manuale o di rilevazione movimento in una delle zone configurate, l’email venga correttamente inviata e ricevuta dal nostro smartphone con le foto più significative ed i dettagli impostati. Al contempo sarebbe consono verificare anche che Event Server esegua correttamente il rilevamento di oggetti e persone e che ci invii le notifiche push.

Per verificare la sicurezza consiglio di eseguire dei falsi accessi sia in locale che in remoto e controllare che il componente aggiuntivo Fail2ban esegua un ban dell’indirizzo IP incriminato e che ci venga correttamente notificato via email. Oltre all’accesso a ZoneMinder è possibile testare la sicurezza degli accessi tramite ssh e gli altri servizi impostati (eseguirli con un terminale secondario per evitare di non poter più accedere). Consiglio di verificare anche che il sistema rimuova automaticamente il ban allo scadere del tempo impostato. 

Per questo genere di avvisi consiglio di creare un account email specifico con supporto alla ricezione in modalità push (ad esempio gli account Outlook di Microsoft su Apple iOS), in modo da ricevere le email il prima possibile.

Un’altra cosa importante, nel caso si abbia abilitato l’upload su un server esterno, è di verificare che gli eventi vengano correttamente caricati su questo e di predisporre un sistema che eviti il riempimento del disco, eliminando automaticamente vecchi eventi quando questo raggiunge una determinata soglia di riempimento.

Nel caso gli eventi caricati siano più pesanti di quanto si desidera consiglio di rivedere gli elementi salvati dal monitor o di ridurre risoluzione, fps e qualità del flusso video fornito dalla telecamera.

Conclusione

Arrivare fino a qui è stata dura, ma spero che questo lungo ed intenso tutorial in aggiunta al precedente possa davvero aiutare qualcuno nella realizzazione del proprio sistema di video sorveglianza “fai da te”.

Ricordo a chiunque desideri supportarmi, che nella home vi è buy me a coffee per aiutarmi in questo percorso.

Per chi fosse interessato lascio un’immagine che spiega la complessa struttura di ZoneMinder, meglio dettagliata nella user guide ufficiale.

Al prossimo articolo!

Se ti è stato utile, perché non...
Mi offri un caffè?

Post correlati

12 commenti

mamos76 16 Giugno 2021 - 20:43

ho visto che è uscito l’aggiornamento di ZoneMinder dalla 1.34 alla 1.36. Dal Server di ZoneMinder ho spuntato il flag su check update ma non mi da l’aggiornamento. Anche se provo da SSH ad aggiornare i pacchetti tramite apt update, apt upgrade e apt dist-upgrade mi fa aggiornare altre librerie ma non ZoneMinder. C’e da aggiungere qualcosa per passare dalla 1.34 alla 1.36?

Rispondi
Vito 16 Giugno 2021 - 22:47

Ciao, no la repository è inserita quando disponibile avverrà automaticamente l’upgrade.

Solitamente i pacchetti pronti arrivano dopo.

Se invece vi è un sostanzioso cambio potrebbe essere necessario sostituire i repository…

Rispondi
Vito 17 Giugno 2021 - 10:45

Ciao, confermo va cambiata repo con 1.36.

Cerca pure come rimuovere ppa 1.34 e aggiungere 1.36

Fatti uno snapshot o altro prima dell’upgrade

https://launchpad.net/~iconnor/+archive/ubuntu/zoneminder-1.36

Rispondi
mamos76 17 Giugno 2021 - 18:28

aggiornato ZoneMinder alla 1.36. Rifunziona tutto all’infuori dell’invio Mail. Provato anche dal server ubuntu a inviare il comando sendmail xxxx@xxxx e la mail arriva tranquillamente. Non arrivano le mail degli eventi. Ricontrollato tutta la parte relativa ai filtri e all’invio mail ed è tutto rimasto come da guida. Hai avuto lo stesso problema?

Rispondi
Vito 17 Giugno 2021 - 18:30

Io aspetterei ad aggiornare, in ogni caso guarda il changelog, le email sono state spostate nei filtri

Rispondi
mamos76 17 Giugno 2021 - 18:43

Risolto le impostazione delle mail vanno spostate anche dentro il filtro eventi e allarmi. Ora rifunziona tutto come prima. Grazie

manustar 27 Aprile 2021 - 23:43

Semplicemente GRANDE

Rispondi
Vito 28 Aprile 2021 - 09:04

Fammi sapere se ti funziona tutto!

Rispondi
manustar 28 Aprile 2021 - 15:17

ho implementato quasi tutto (ho tralasciato da homeassistant in poi), la telecamera la vedo e in objectconfig.ini ho inserito questo parametro per provare il riconoscimento object_detection_pattern=(.*), vedendo la consolle di zoneminder non vedo i classici “quadratini” di riconoscimento.

la configurazione iniziale l’ho un po adattata sulla parte certificati dall’esterno.

Rispondi
Vito 28 Aprile 2021 - 15:19

I certificati devono essere realizzati come indicato, soprattutto per il dns indicato (parole del dev eventserver), per quanto riguarda il riconoscimento metti solo .* senza parentesi e riavvia tutto. Devi capire tramite il debug se sta funzionando, l’app ti da ok su eventserver? Nel debug vende gli eventi? Perché a me ha funzionato tutto subito appena configurato. La macchina è abbastanza potente per gestire le cose?

Rispondi
manustar 28 Aprile 2021 - 15:26

io ho già un ddns con certificato lets encrypt che vorrei usare con reverse proxy su porta4443 inoltrata direttamente in locale, poi tramite la procedura ho creato il self-signed (magari questa è una cavolata) l’app non ho provato ancora, e la macchina è un server con esxi (8vCPU e 16 di ram).

Vito 28 Aprile 2021 - 15:28

A livello hw dovrebbe bastare ma ti consiglio di provare self diretto, non saprei come fare con metodi alternativi, il dev consiglia questo. Comunque prova tramite lo strumento di debug, eventualmente dai un occhio anche alla user gudr ufficiale se c’è qualche nota extra. Tendenzialmente se installato e configurato dovrebbe andare, le config sono identiche a quelle sul mio server di prova e tutto ha funzionato 🙂

Lascia un commento

* Utilizzando questo modulo accetti la memorizzazione e la gestione dei tuoi dati da questo sito web.