"Sniffando" le onde radio - RF 433Mhz

24/02/2017




E' passato un pò di tempo dal mio ultimo post...vari impegni lavorativi e familiari mi hanno tenuto un pò lontano dai miei esperimenti...in fondo in fondo è un hobby...e in quanto tale ha "bassa priorità" soprattutto quando il tempo libero è poco...

Come forse vi ricorderete (vedi post http://domoticaduino.blogspot.it/2016/03/acquisizione-dati-produzione-impianto.html), la produzione del mio impianto fotovoltaico veniva acquisita tramite il ricevitore wireless OWL CM160 connesso via USB al Raspberry, che era in grado di ricevere i dati inviati via radio dalla pinza amperometrica collegata all'impianto fotovoltaico, a valle dell'inverter.


Purtroppo con il passare del tempo questo sistema si è rivelato instabile, in quanto spesso il driver di connessione USB del dispositivo al raspberry non funzionava correttamente e necessitava di un riavvio del sistema...non molto comodo...

Facendo diverse ricerche su internet ho capito che è possibile intercettare i segnali trasmessi dalla pinza amperometrica tramite un semplice ricevitore Wireless a 433Mhz, come quello attualmente utilizzato per ricevere i dati del sensore del gas, costruito con Arduino (vedi http://domoticaduino.blogspot.it/2015/08/acquisizione-dati-il-ricevitore.html)

Un articolo in particolare mi ha aperto la strada verso questa soluzione...eccolo

https://github.com/onlinux/OWL-CM180

E' basato su un diverso ricevitore, ma la logica è identica.

Questi sistemi utilizzano il protocollo di comunicazione della Oregon Scientific...in particolare il CM160 utilizza la versione 3...

Qui un documento che descrive il protocollo

DOWNLOAD

La trasmissione avviene tramite codifica Manchester OOK (on off keying) alla frequenza di 433 Mhz.

Collegato il ricevitore ad un Arduino UNO e scaricato il codice che permette la codifica del protocollo di comunicazione (scriverlo da zero sarebbe stato un pò lunghetto...), i pacchetti iniziano ad essere visualizzati sulla seriale. Tramite alcune "operazioni" sui bit si riesce in maniera abbastanza semplice a recuperare i dati "nascosti" nei pacchetti trasmessi...et voilà, il gioco è fatto: ecco il dato di potenza trasmesso dalla pinza amperometrica.

Esempi di pacchetti "grezzi" ricevuti in esadecimale

2a8081bf01501a011900 ==> valore di potenza rilevato = 434 W
2a81817f02d0fdf71800 ==> valore di potenza rilevato = 627 W
2a81813f0980f3b71300 ==> valore di potenza rilevato = 2366 W

Output sulla seriale


Adesso non mi resta altro che trasmettere il dato al server centrale per la memorizzazione su db e relativa visualizzazione su web.

Sniffando tutti i pacchetti trasmetti in OOK su 433 Mhz, noto che non sono tutti relativi alla pinza amperometrica; tra i pacchetti ricevuti e non riconosciuti come protocollo Oregon Scientific 3 ci saranno sicuramente quelli trasmessi da un sensore di temperatura esterno alla casa che comunica con un orologio che ho sul comodino...il protocollo è di tipo diverso e attualmente non sono in grado di leggerlo...ma non si sa mai...in un futuro più o meno lontano potrei riuscire a intercettare ed acquisire anche questa informazione...

Acquisizione dati - Diamo uno sguardo ai dati...

10/03/2016



Adesso che il mio sistema è imbastito ed abbiamo già un paio di sensori che permettono una raccolta di dati, è arrivato il momento di vedere qualcosa.

Ho quindi implementato una piccola applicazione web in PHP che permette la lettura e la visualizzazione tramite browser dei dati acquisiti.

Alcuni dettagli tecnici:

- linguaggio di programmazione PHP 5 e rendering in HTML5
- motore database MARIADB (la versione indipendente del famoso MYSQL, ormai acquistato dalla Oracle)
- interfaccia sviluppata con il framework Bootstrap v.3
- libreria Google Charts per l'implementazione dei grafici
- utilizzo delle librerie Javascript jQuery e jQuery-UI

Per adesso l'interfaccia è molto semplice; il suo primo obiettivo è quello di permettermi di verificare che i dati vengano acquisiti correttamente.

Quello che ho sviluppato è una semplice homepage che mostra due grafici che indicano:

- la curva di produzione giornaliera dell'IMPIANTO FOTOVOLTAICO (link)
- gli ultimi minuti di rilevazione del GAS METANO con link a pagina di dettaglio giornaliero (link)

Dal grafico della produzione fotovoltaica si può notare un dato anomale...nelle ore notturne la produzione sembra essere costante e maggiore di 0 (cosa naturalmente impossibile...). A detta dell'assistenza, questo problema sembra essere dovuto alla potenza reattiva dovuta alla scarica dei condensatori dell'inverter

(oggi è stata una buona giornata per i pannelli...si sono raggiunti i 2Kwp)




Sotto ogni grafico viene visualizzato il dato in tempo reale.

La pagina ha una funzione di autorefresh per permettere la visualizzazione realtime dei dati.

Ho iniziato anche ad impostare una pagina di login per implementare delle funzionalità accessibili solo con utente e password


L'applicazione gira sul Raspberry PI, dove è installato il web server Apache 2. E' raggiungibile da rete locale (ovviamente) ma anche da internet tramite un opportuno NAT sul router di casa e con la gestione di un dominio Dynamic DNS per la mappatura dell'indirizzo IP pubblico dinamico della mia rete di casa.

A questo scopo sto utilizzando il servizio offerto da NO-IP, che gratuitamente offre la gestione di 3 nomi dominio. Un punto a favore è dato anche da un client linux che permette in automatico di aggiornare i DNS ogni volta che cambia l'ip pubblico della mia rete.

Acquisizione dati - Produzione impianto fotovoltaico

08/03/2016




Il secondo tipo di dato che voglio acquisire con il sistema di monitoraggio che sto cercando di mettere in piedi con il poco tempo che ho a disposizione (la frequenza di aggiornamento del blog la dice lunga...) è la rilevazione della produzione dell'impianto di pannelli fotovoltaici che ho installato sul tetto di casa.

L'impianto è un 3 kWp composto da moduli svizzeri SUNAGE 250, con inverter AROS SIRIO

Insieme all'impianto mi è stato anche fornito un piccolo impianto di monitoring, composto da una pinza amperometrica e un ricevitore/display wireless. La pinza amperometrica trasmette al display, attraverso un opportuno trasmettitore, il dato di produzione istantanea rilevato dall'inverter; il display, oltre a farlo vedere in tempo reale, lo memorizza in un piccolo database sqlite interno e lo storicizza. Il bello di questo ricevitore è che, tramite connessione usb, può essere interfacciato ad un PC Windows per la visualizzazione e lo scarico dei dati in formato excel.

Il sistema in questione è un prodotto commercializzato e chiamato OWL

http://www.theowl.com/energy-monitors/standalone-monitors/owl-usb/


In particolare il mio è il modello OWL+USB CM160.

Purtroppo questo modello ha il problema di rilevare la potenza reattiva trasmessa dall'inverter quando è spento...quindi quando i pannelli sono "spenti" (di notte, ad esempio) il sistema rileva sempre 240W.

Per il mio scopo ho la necessità di connettere il ricevitore, tramite USB, al Raspberry. Nativamente questo non è supportato e i driver ufficiali non ci sono, ma girando su internet ho trovato questa ottima interfaccia per linux: EAGLE-OWLhttps://github.com/cornetp/eagle-owl

Compilando ed installando il software direttamente sul Raspberry si ha a disposizione un processo in background che permette di rilevare il CM160 connesso all'usb e rendere disponibile il database dei dati acquisiti.

Ecco la shell del Raspberry con i file di Eagle-Owl e i database connessi:


Il processo viene mandato in esecuzione in background all'avvio del Raspberry. Ho quindi creato un piccolo script in php che legge il database CM160 e scrive sul database mysql del mio sistema di monitoraggio. In questo modo posso storicizzare tutti i dati di produzione (il CM160 ha una memoria storica di un paio di mesi...) e renderli disponibili ad esempio ad un'interfaccia web che ne permette la visualizzazione.

Questo script viene mandato in esecuzione ogni minuto dal Raspberry (tramite task cron standard). In questo modo avrò a disposizione il dato di produzione aggiornato ogni minuto.