Archivi tag: python

Davis Instruments ed rtl-sdr

Da qualche tempo è comparsa, sul tetto dell’Università, una stazione meteo piuttosto carina: Davis Vantage Pro 2. Il sensore è installato sul tetto della torre a quota 195, la stazione nel piano sottostante. Le due unità comunicano “wireless”. I dati della stazione mi interessano per diversi motivi:
– mi piace sapere quanto fa caldo/freddo al lavoro;
-mi interessa correlare questi dati con i dati AIS in modo da valutare la propagazione troposferica in funzione del tempo atmosferico.

I dati della stazione meteo è difficile ottenerli in modo “ufficiale”: la stazione è collegata ad un portatile che non è accessibile dalla rete. Inoltre non ho idea di chi la abbia installata. Pertanto c’è un solo modo: i dati “me li prendo”. Sfortunatamente il programma rtl_433 non riesce a demodulare queste informazioni:
– rtl_433 demodula ASK mentre le Davis usano FSK;
– rtl_433 non interpreta il protocollo Davis;

La soluzione è arrivata da rtldavis, un programma scritto in go lang, che effettua le seguenti operazioni:
– accesso alla chiavetta rtl-sdr;
– algoritmi DSP per la demodulazione del segnale;
– algoritmi per la decodifica del protocollo.
Peccato che l’autore abbia terminato lo sviluppo del codice senza terminarlo (la parte di di decodifica del protocollo non è terminata). Inoltre il codice è studiato per le stazioni americane e deve essere modificato per lavorare nella banda ISM italiana.

Modifica al codice go lang: il file è “protocol.go“. Le informazioni sulla frequenza dei canali usate in Europa ho provato a ricavarle con una chiavetta SDR ma occorre essere piuttosto precisi. Fortunatamente ho trovato questo articolo in cui ci sono parecchie informazioni. In America si usano 51 canali, in Europa 5. Il codice è il seguente:

p.channels = []int{
868066711, 868181885, 868297119, 868412292, 868527466,
}

p.hopPattern = []int{
0, 2, 4, 1, 3,
}

Compilato il codice in “go”, l’output è piuttosto “criptico”:
600222FFC3004DD9
8002241FBB00C0B9

Ho provato a realizzare l’interprete del protocollo in go, ma ammetto che non ho ricavato nulla: non sono stato in grado, in tempi brevi, di trovare informazioni tali da permettermi di implementare delle funzioni facilmente. Ho deciso per un approccio alternativo: scrivere un interprete in Python che esegua queste funzioni:
– ricevere in input il protocollo raw;
– decodificare il protocollo;
– inserire i dati in mysql;
Le specifiche del protocollo sono perfettamente specificate in questo sito.
Nelle parti maggiormente criptiche mi sono fatto aiutare da questo codice, realizzato per arduino ma… sempre buono.

Output del programma:

Data 2019 02 17 Ora: 12 51
91030 500283FF710086F8

Input Lenght 2
Colonna
500283FF710086F8
Output Lenght 8
[’50’, ’02’, ’83’, ‘FF’, ’71’, ’00’, ’86’, ‘F8’]
Element 0 50
Element 1 02
Element 2 83
Element 3 FF
Element 4 71
Element 5 00
Element 6 86
Element 7 F8

Summary
Station id 0
Message Type 5
Message Type Rain Rate

Wind Velocity 3.21
Wind Direction 183.35
Wind Gust 0
Humidity 0
Rain 0.0
Rain Rate mm/h 0.0
Temperature C 0
Solar Radiation 1798.36
UV Index 0
SuperCap 0

Debug inserimento dati nel DB
Debug – anno: 2019
Closing down

Cosa scaricare:
– programma originale in “go” dell’autore Douglas Hall
– si compila e si mette in /usr/local/bin/
– Script in python:
– versione 2 — funziona da riga di comando: rtldavis 2>&1 | python weather_decoder_2.py
– versione 3 — Avvia automaticamente rtldavis come subprocess.
Il pacchetto completo si può scaricare da questo link.


rtl_433 parte seconda

Finalmente ho avuto un pochino di tempo per rivedere lo script python che prende i dati dal rtl_433 e li mette nel database.
Inoltre ho terminato la scrittura del codice PHP che, in maniera davvero triviale, genera una pagina web con i dati di tutti i sensori.

Il codice python è disponibile a questo link.
Il codice php si può scaricare con questo link.
Entrambi sono stati sviluppati con APTANA, strumento che trovo davvero delizioso per le mie (discutibili) doti di programmatore (anche se rognoso da fare funzionare).

rtl_433

RTL_433 è un progetto che ho scoperto per caso, navigando senza rotta in giro per la rete. Il sito di riferimento è su github. Si tratta di un simpatico programmino che rileva la presenza di una chiavetta SDR lo sintonizza a 433,920 MHz e si mette in ascolto su una finestra di 250kS/s. In questa fetta di spettro sono allocati sensori e telecomandi a bassa potenza. In particolare le stazioni meteo che hanno sensori wireless usano la modulazione ASK per trasmettere i dati al concentratore.

Universal Radio Hacker alle prese con il segnale in banda base.

Il programma rtl_433 riesce a demodulare i segnali dei sensori ed a interpretare il protocollo ed i dati da esso trasmessi. La cosa è molto interessante soprattutto considerando che i sensori sono dispositivi di debole potenza ed il loro raggio di azione è molto limitato. Pertanto, a meno di installazioni piuttosto bizzare, i dati ricevuti rispecchiano le condizioni meteo della zona in cui sono posizionati.
Il programma si presta bene a “sostituire” una stazione meteo, sfruttando quella di qualche ignaro vicino o consente di confrontare la propria stazione con quelle commerciali.

L’installazione del sistema è banalissima, basta compilare il sorgente scaricato da github ed eseguire il binario rtl_433. Nella mia installazione ho dovuto aumentare la frequenza di campionamento in quanto mi sono reso conto che c’erano diversi sensori “lontani”. Pertanto adesso il sistema lavora a 1024kS/s.

Posizione dei sensori nella banda 433MHz.

Collegata la chiavetta ad una antenna diskona, è iniziata la festa. I segnali dei sensori sono decodificati facilmente ed il programma restituisce un sacco di informazioni utili, anche dal punto di vista comunicazionisitico: SNR – RSSI – NOISE.

A questo punto l’appetito viene mangiando: come fare per immagazzinare i dati ricevuti in un database (MariaDB) in modo da potere rendere in forma grafica alcuni parametri?
In rete ho trovato questo interessante progetto in Python. Ho quindi preso spunto da questo script per cercare di combinare qualche cosa in Python. Ne è venuto fuori uno script che immagazzina tutti i dati nel database e registra i dati grezzi in formato JSON su un file. A corollario di questo ho anche scritto una serie di script php che consentono di accedere ai dati in forma tabulare e di rappresentare l’andamento dei parametri fisici (temperatura, umidità) e radioelettrici (rssi,snr,noise) in funzione del tempo.

Sensori ricevuti e parametri, in forma tabulare.

Grafico dei parametri fisici e radioelettrici:

Andamento della temperatura.

Questa immagine è molto interessante. Mostra l’andamento della temperatura nel tempo. Il fatto è che… le minime sono coerenti con quanto misurato anche da altri sensori. Le massime sono completamente sballate (a gennaio è improbabile raggiungere i 36 gradi). Morale della favola? Il sensore è probabilmente installato al sole, in un contenitore di plastica.

RSSI nel tempo.

Da casa riesco a ricevere una stazione “dignitosa” marca Fine Offset. Penso sia una cosa di questo tipo. Posso confrontare la temperatura rilevata dalla stazione commerciale e la mia: c’è un ottimo accordo di notte. Di giorno c’è qualche discrepanza: 11.7 mia contro 8.8 commerciale ma non conosco l’esatta ubicazione della stazione. Sicuramente il mio schermo solare deve essere perfezionato: apertura sul fondo in primis, ventilazione forzata in secundis.
Chissà cosa viene fuori ad installare il sistema sulla torre di ingegneria?