Antifurto Ajax: come realizzare un indicatore di stato con ESP8266

by maurizio
16 minuti
Antifurto Ajax: come realizzare un indicatore di stato con ESP8266

Un paio di anni fa ho sostituito il vecchio antifurto di casa con un nuovo sistema Ajax con il quale, devo dire, mi trovo molto bene. L'Ajax è interamente wireless, tutti i sensori vanno a batteria ma con durata delle batterie che va dai 2 ai 5 anni (dipende dal dispositivo e da quanto frequentemente si attiva). L'app di controllo dal cellulare funziona molto bene, è facile installarla sui telefoni di tutti i componenti della famiglia, ed è estremamente semplice da configurare.  Ovviamente non posso confrontarlo con strumenti analoghi di altre marche perché non li ho provati, ma in generale devo dire di essere molto soddisfatto del prodotto.

Ho però un problema...sono una persona estremamente distratta. Mi capita infatti abbastanza spesso di entrare in casa dimenticando che l'antifurto è inserito, facendolo suonare a vuoto e recando disturbo sia al vicinato che a tutti i membri della famiglia, ai quali ovviamente suona l'allarme sul cellulare. In particolare, mi accade spesso quando entro in casa passando dal garage, il quale ha una porta interna che lo collega direttamente al resto della casa.

In pratica, parcheggio l'auto in garage (che non è allarmato) e poi entro in casa direttamente senza ricordarmi di avere l'antifurto inserito e... parte la sirena!

Ho maturato quindi la necessità di installare una spia interna al garage, non visibile quindi dall'esterno, che mi avvisi che l'antifurto è inserito, in modo da ricordarmi di disinserirlo prima di entrare (come si dice da queste parti: chi non ha testa, abbia gambe!).

Prima di iniziare però, ecco il solito disclaimer: non ho nessun accordo con Ajax e nessuna convenienza nel pubblicizzare i suoi prodotti. Semplicemente ce l'ho a casa e quindi vi racconto la mia esperienza diretta.

Intercettare lo stato dell'antifurto: che alternative abbiamo?

Solitamente ci sono più modi per arrivare al risultato. 

Ad esempio avrei potuto installare in garage una sirena da interni. Infatti questo componente del sistema Ajax ha un led che può essere programmato per accendersi quando l'antifurto è inserito. Va anche detto che il led che avvisa dell'antifurto inserito è di colore verde e lampeggia molto brevemente con un ritmo piuttosto lento, suppongo al fine di risparmiare le batterie della sirena.

Un'alternativa sarebbe stata quella di acquistare un componente Ajax Relay, e programmare uno scenario per chiudere il relè ad antifurto inserito. Poi sarebbe stato sufficiente qualche componente elettronico e una fonte di alimentazione per accendere un led ad antifurto inserito.

Oppure...avrei potuto scegliere la "via del maker", e fare tutto da zero, come in effetti ho fatto.

L'idea è stata quindi quella di trovare un modo per acquisire dall'Ajax lo stato di antifurto inserito o non inserito, portare questa informazione su un piccolo microcontroller, ad esempio una Wemos D1, e fare in modo che questa piloti un paio di led.

Il concetto è semplice, la sua realizzazione molto meno!

Ho fatto un po' di ricerche e ovviamente la centralina di controllo dell'Ajax, pur essendo collegata alla rete ethernet di casa, per garantire un più alto livello di sicurezza, non offre delle API per poterne interrogare lo stato. 

Una possibile alternativa sarebbe stata quindi quella di interrogare i servizi cloud di Ajax per ricavarne l'informazione necessaria, ma ovviamente il cloud di Ajax non è pubblicamente documentato quindi sarebbe stato necessario un faticoso lavoro di reverse engineering e oltretutto l'idea di usare un accesso che potenzialmente potrebbe essere usato anche per pilotare l'antifurto su un apparecchio situato in una parte non allarmata della casa, non mi entusiasmava.

Quando stavo ormai per rinunciare al progetto, ecco invece la scoperta risolutiva: l'hub del sistema Ajax può comunicare via TCP/IP con una centrale di sorveglianza esterna tramite un protocollo standard denominato SIA-DC09. Quindi se l'hub è collegato all'ethernet di casa e non si sta effettivamente usando quel canale per comunicare con una centrale di sorveglianza, è possibile utilizzare questa funzione per pilotare un sistema esterno comunicando lo stato dell'antifurto.

Il protocollo SIA-DC09

Il primo ostacolo da superare è stato quello di interpretare il protocollo SIA-DC09. Questo protocollo prevede che il server (la presunta centrale di sorveglianza) stia in ascolto su una certa porta TCP, consenta  dall'hub Ajax di connettersi e riceve le sue segnalazioni, alle quali deve rispondere "a tono", ossia inviando messaggi coerenti con quanto ricevuto. 

La parte fondamentale è che DC-09 non è semplicemente una connessione TCP con una stringa dentro: il protocollo definisce anche il formato del frame, il controllo d'integrità, la gestione degli ACK ed eventualmente anche  la cifratura dei messaggi.

Il protocollo inoltre prevede anche il trasporto degli stati per zona allarmata. 

Nel mio caso ho deciso, per semplificare l'implementazione, di rinunciare alla cifratura dei messaggi e di non considerare le zone (anche perché nella mia implementazione non le utilizzo).

Per verificare le informazioni raccolte, ho creato un programma in PHP che girando sul mio PC, si mette in ascolto su una porta e visualizza sulla console ogni messaggio SIA ricevuto e provvede a mandare un ACK. 

Devo dire che sviluppare questo piccolo script è stato abbastanza divertente e, seppur mi ci sia voluto un po' di tempo, mi ha permesso di capire come realizzare un parsing veloce dei messaggi dell'Ajax e da qui ad avere l'idea per risolvere definitivamente il problema, il passo è stato breve.

L'idea

L'idea è quindi quella di creare un dispositivo piccolissimo, ad esempio usando una scheda a microcontrollore D1 Mini, che possa ricevere le segnalazioni inviate dall'Hub Ajax, e possa interpretarle al fine di visualizzare una segnalazione visiva dello stato dell'antifurto tramite uno o più LED.

In pratica il flusso delle informazioni segue il seguente schema:

 

Lo schema 

Quello che serve quindi è un circuito molto semplice, con soli due led per la segnalazione degli stati, uno verde e uno rosso, rispettivamente collegati ai pin D5 e D6 della Wemos, come nel seguente schema.

    Programmare la D1 mini

    Il cuore del progetto è la piccolissima scheda D1 Mini. Una schedina programmabile che costa poco (quella che ho usato l'ho presa su Amazon a 4 euro!) e incorpora a bordo, oltre al microcontrollore ESP8266EX, 4 MB di flash memory,  varie interfacce (digitali, analogiche, UART, SPI, I2C), anche l'interfaccia WiFi a 2,4 GHz (attenzione: non funziona a 5GHz, solo a 2,4).

    Per realizzare il programma da caricare sulla scheda, mi sono avvalso dei più moderni strumenti di sviluppo: in pratica ho aperto OpenCode, ho scritto un po' di documentazione su cosa volessi realizzare, su quanto avevo scoperto sul protocollo SIA DC09, e poi con un singolo prompt lui ha creato il programma che mi serviva.

    Successivamente ho rifinito un po' il codice, ad esempio spostando i parametri di configurazione della WiFi su un file a parte (config.h). In generale però ammetto che OpenCode ha fatto un ottimo lavoro e il mio orgoglio di programmatore con esperienza ultradecennale ne ha sofferto!

    I sorgenti del programma sono disponibili su GitHub con licenza MIT, quindi basta scaricarli, caricare il file .ino sull'ide Arduino, compilarlo, avendo prima cura di selezionare la destinazione corretta (se usate la stessa scheda che ho usato io usate: "LOLIN/Wemos D1 R1") - se siete alle prime esperienze con la piattaforma Arduino/Esp vi consiglio però di guardare prima qualche tutorial su YouTube per iniziare a prenderci confidenza.

    Prima di compilare tutto però, è opportuno configurare i sorgenti per connettersi alla vostra rete WiFi. Per farlo, innanzitutto rinominate il file "config.h.sample" in "config.h" e poi modificate i parametri per adattarli alla vostra rete:

    // Copia questo file in `config.h` e inserisci le tue credenziali WiFi:
    //   cp config.h.sample config.h
    #pragma once

    #define WIFI_SSID "IL_TUO_SSID_WIFI"
    #define WIFI_PASSWORD "LA_TUA_PASSWORD_WIFI"

    // Porta TCP su cui l'Hub Ajax invia gli eventi SIA (deve coincidere con
    // quella impostata sull'Hub).
    #define LISTEN_PORT 8125

    // 1 = DHCP, 0 = IP statico (compilare i campi STATIC_* qui sotto).
    #define USE_DHCP 0

    #define STATIC_IP "192.168.1.50"
    #define STATIC_NETMASK "255.255.255.0"
    #define STATIC_GATEWAY "192.168.1.1"
    #define STATIC_DNS "192.168.1.1"

    E' assolutamente indispensabile che la schedina prenda un indirizzo statico (o almeno abbia una reservation sul DHCP) in modo di sapere quale IP avrà, altrimenti non sarà possibile configurare l'hub Ajax per poter inviare lo stato al nostro monitor. Nell'esempio qui sopra abbiamo impostato come indirizzo 192.168.1.50, ma ovviamente voi dovrete adattarlo alla vostra situazione.

    Una volta creato opportunamente il file di configurazione, potete usare l'arduino IDE per compilare il programma e caricarlo sulla D1 Mini. Una volta fatto, vi consiglio di verificare che la scheda sia raggiungibile, usando il comando ping e l'indirizzo impostato nella scheda. Ad esempio:

    ping 192.168.1.50

    In caso di errore...c'è qualcosa che non va. Ricontrollate i dati del WiFi e verificate l'ip configurato.

    A questo punto il nostro monitor dovrebbe far lampeggiare i due led alternativamente, verde e rosso. Vuol dire che è pronto a ricevere i dati dall'hub Ajax.

    Configurare l'hub Ajax

    Se la scheda D1 Mini risponde al ping, potete procedere a configurare l'hub Ajax in modo che le invii le segnalazioni di stato.

    Attenzione però: se il vostro antifurto è già collegato ad una centrale di sorveglianza, vi sconsiglio fortemente di andare "a pasticciare" nei parametri di configurazione qui descritti, per evitare di compromettere la comunicazione con la centrale stessa e quindi, potenzialmente, generare problemi.

    Se, non avete configurato alcuna centrale di sicurezza, potete invece procedere usando l'icona "Dispositivi" dell'app Ajax, e da li selezionare l'hub (in genere è il primo dispositivo della lista) e quindi premere l'icona dell'ingranaggio in alto a destra per accedere alla configurazione.

    Nell'elenco delle voci occorre cercare e selezionare "Istituti di vigilanza", e successivamente "Centrale di sorveglianza".

    Una volta raggiunta la pagina di configurazione della Centrale di sorveglianza occorre impostare così i parametri:

    Protocollo: SIA DC-09 (SIA-DCS)

    Ethernet: Attivo

    GPRS: NON attivo

    Un indirizzo IP per tutti i canali di allarme: Attivo

    Indirizzo IP: inserite l'IP che è stato impostato sulla D1 Mini

    Porta: 8125 (o qualsiasi altra porta sia stata impostata sul config.h)

    Lasciate pure tutti gli altri parametri al default e poi cliccate sulla freccia per tornare alla pagina precedente per salvare la configurazione.

    Se tutto è andato bene, dovrebbe adesso accendersi solo il led verde fisso, indicando che l'antifurto non è inserito. E quando si inserisce l'antifurto, sia totale che in modalità notte, dovrebbe invece lampeggiare quello rosso.

    Più in dettaglio, la segnalazione dei LED segue questo schema:

    Stato LED Verde LED Rosso
    Boot (nessun segnale) lampeggiante spento
    Disinserito acceso fisso     spento
    Inserito totale / notte spento lampeggiante (500 ms) 
    Allarme attivo   spento acceso fisso
    Comunicazione persa  lampeggiante alternato lampeggiante alternato

    Migliorie e finalizzazione

    Dopo aver realizzato il prototipo con fili volanti e averne verificato il funzionamento, ho deciso di apportare qualche miglioria. In particolare ho deciso di rendere il tutto più compatto usando un singolo led RGB, del quale uso soltanto i colori verde e rosso.Il cablaggio cambia pochissimo, e il risultato è effettivamente più comodo.

    Questa modifica si è resa necessaria perché ho deciso di stampare in 3D il contenitore per il monitor usando un modello che ho trovato già pronto su MakerWorld e che mi è sembrato molto valido. 

    Ho scelto questo perché in primo luogo viene offerto in diverse varianti per spessore, è dotato di una comoda staffa per poterlo appendere e infine il case ha un foro in alto dove passa comodamente un led. Uno solo, non due, da qui la decisione di optare per un singolo led.

    Alcune considerazioni finali sulla sicurezza

    Voglio sottolineare, qualora non fosse chiaro, che quello presentato qui è un progetto personale. Il dispositivo descritto è da considerarsi un indicatore ausiliario, non un componente certificato dell'impianto di sicurezza. 

    Inoltre nel progetto sono state fatte delle scelte "comode" per semplificare le cose, a scapito magari della garanzia della sicurezza in generale. Ad esempio la scelta fatta di non utilizzare la crittografia (che il protocollo SIA DC-09 supporta) è stata attentamente ponderata nel mio caso personale, ma non è detto che sia corretta in ogni caso.

    Infine la configurazione descritta è quella adottata nel mio progetto personale e non deve essere considerata automaticamente adatta a un impianto professionale.

    Conclusioni

    Alla fine, quello che era nato come un piccolo rimedio alla mia distrazione si è trasformato in un progetto maker piuttosto interessante. Grazie alla D1 mini e al protocollo SIA DC-09, sono riuscito a realizzare un indicatore luminoso che riceve dall'hub Ajax le informazioni sullo stato dell'antifurto e le rende immediatamente visibili con un LED RGB.

    Il dispositivo è alimentato tramite USB, occupa pochissimo spazio e si trova accanto alla porta che collega il garage al resto della casa. Una soluzione semplice, economica e costruita su misura per una mia esigenza concreta.

    Naturalmente, si tratta di un indicatore ausiliario: se la comunicazione si interrompe, è importante riconoscere la segnalazione di errore e verificare lo stato dell'impianto tramite l'app Ajax. Inoltre, la configurazione descritta presuppone di poter utilizzare il canale di comunicazione con la centrale di sorveglianza, quindi va valutata con attenzione se l'impianto è già collegato a un servizio di vigilanza.

    Resta da verificare la cosa più importante: riuscirà questa spia a impedirmi di far suonare inutilmente l'antifurto? Ai posteri l'ardua sentenza!

    :-)

    Currently there are no comments, so be the first!