Usare SDR su Raspberry per ottenere dati

Introduzione

Questa è una guida per costruire un sistema a basso costo che raccolga dati da un qualsiasi numero di sensori wireless. I passi in questa guida utilizzano una SDR USB collegata a un Raspberry Pi, che raccoglie dati dai sensori di temperatura e umidità Acurite. Questo approccio funzionerà con molti altri tipi di sensori di altri produttori e funzionerà su altri tipi di computer e sistemi operativi.

Ogni sensore utilizza 2 batterie AA e in genere durano un paio d'anni a temperature normali. Il Raspberry Pi ha un orologio in tempo reale ed è connesso a un router domestico tramite Ethernet. Non è richiesta una connessione di rete per eseguire il sistema, ma è necessario scaricare il software.

Occorrente
OCCORRENTE ESEMPIO
USB SDR NooElec
Raspberry Pi 3B+
Scheda Micro SD SanDisk Ultra 64
Case Qualsiasi
Alimentatore Samsung 5V 2A Micro USB
Sensore di temperatura/umidità Acurite 06002M
Termometro Acurite 606TX
Sensore di temperatura/umidità FineOffset WH31

Attenzione all'Acurite 606TX! L'identificatore per quel sensore cambia quando viene spento e riacceso. Quindi se lo usi, dovrai riconfigurare Weewx ogni volta che cambi le batterie.

Passi da seguire

Configura il Raspberry Pi

Sono disponibili molte guide per il bootstrap di un Raspberry Pi. Sono disponibili anche molte guide per l'installazione e la configurazione di un orologio in tempo reale nel Raspberry Pi. Fallo!

Il resto di questa guida richiede solo l'accesso alla riga di comando. Quindi puoi eseguire i passaggi seguenti accedendo da remoto tramite SSH o in una finestra di terminale con una tastiera e un monitor collegati.

# install operating system on sdcard, use it to boot the rpi

# install a real-time clock and enable it

# configure the rpi for remote access and headless operation

# get rid of fake clock
sudo apt-get remove --purge fake-hwclock

# ensure the correct timezone
sudo dpkg-reconfigure tzdata

Installa i prerequisiti per la creazione di rtl-sdr e rtl_433

sudo apt-get install cmake libusb-1.0-0-dev build-essential autoconf libtool pkg-config

Installa rtl-sdr

git clone git://git.osmocom.org/rtl-sdr.git
cd rtl-sdr
mkdir build
cd build
cmake -DINSTALL_UDEV_RULES=ON ..
make
sudo make install
sudo ldconfig

Installa rtl_433

git clone https://github.com/merbanan/rtl_433
cd rtl_433
mkdir build
cd build
cmake ..
make
sudo make install

Installa Weewx

Quando installi Weewx, seleziona Simulator quando richiesto per il tipo di stazione. Lo cambierai in SDR più tardi quando eseguirai il comando wee_config --reconfigure.

# install Weewx
wget -qO - http://weewx.com/keys.html | sudo apt-key add -
wget -qO - http://weewx.com/apt/weewx.list | sudo tee /etc/apt/sources.list.d/weewx.list
sudo apt-get update
sudo apt-get install weewx

# shut down Weewx
sudo /etc/init.d/weewx stop

# install weewx-sdr extension and enable the driver
git clone https://github.com/matthewwall/weewx-sdr.git
sudo wee_extension --install weewx-sdr
sudo wee_config --reconfigure

Configuralo

Ora che tutti i pacchetti sono installati, è il momento di dire a Weewx quali dati raccogliere. Questo viene fatto partendo dal livello più basso, rtl_433, fino a weewxd. Per prima cosa eseguirai rtl_433 per verificare che funzioni e per vedere quali segnali raccoglie. Potresti essere sorpreso da quanti dispositivi nella tua casa (o nella casa dei tuoi vicini!) inviano segnali radio che puoi rilevare. Quindi il passo successivo è identificare quale di questi segnali ti interessa. Infine, creerai un sensor_map nella tua configurazione Weewx che mappa nomi e valori dai campi del database che sono usati in Weewx.

# see what devices are broadcasting data - let this run for awhile
sudo rtl_433

# or run it like this to see the output in JSON format
sudo rtl_433 -M utc -F json

Identifica i sensori uno alla volta. Metti le batterie nel primo sensore, quindi osservalo apparire nell'output rtl_433. Metti un pezzo di nastro adesivo sul sensore, quindi etichettalo con l'identificatore hardware: l'identificatore hardware viene in genere chiamato id nell'output. Quindi inserisci le batterie nel sensore successivo e osservalo apparire. Ti ritroverai con una pila di sensori, ciascuno con il suo identificatore hardware chiaramente contrassegnato. Quindi puoi facilmente tenere traccia dei sensori quando mappi gli identificatori hardware nei campi del database e le posizioni effettive dei sensori.

Quindi dovresti eseguire direttamente il driver weewx-sdr. Questo verificherà che possa catturare l'output da rtl_433 e ti mostrerà i nomi completi per ogni osservazione. Ti serviranno per dire a Weewx come acquisire i dati. Notare l'opzione --cmd. Se dovessi specificare altre opzioni per rtl_433, assicurati di aggiungerle all'opzione --cmd quando invochi sdr.py.

# see how the sensor data from rtl_433 are mapped to fully-qualified names
sudo PYTHONPATH=/usr/share/weewx python /usr/share/weewx/user/sdr.py --cmd="rtl_433 -M utc -F json"

# in particular, look at the 'out' and 'parsed' lines like this:
out: ['{"time" : "2019-01-16 11:45:33", "model" : "Acurite tower sensor", "id" : 2453, "sensor_id" : 2453, "channel" : "A", "temperature_C" : 16.700, "humidity" : 31, "battery_low" : 0}\n']
parsed: {'temperature.0995.AcuriteTowerPacket': 16.7, 'dateTime': 1547639133, 'humidity.0995.AcuriteTowerPacket': 31.0, 'status.0995.AcuriteTowerPacket': None, 'battery.0995.AcuriteTowerPacket': 0, 'channel.0995.AcuriteTowerPacket': u'A', 'usUnits': 16}

Ora puoi comunicare a Weewx i nomi completi delle osservazioni di ciascun sensore. In questo esempio, i nomi completi sono temperature.0995.AcuriteTowerPacket o humidity.0995.AcuriteTowerPacket. Devi dire a Weewx come mappare quei nomi ai campi del database che usa per memorizzare i dati. Questo viene fatto nella sezione sensor_map della sezione SDR nel file di configurazione di Weewx.

Ecco un esempio che mostra 4 sensori che ho installato. Gli identificatori del sensore sono -102, 0995, 16B9 e 0ED5, ma ovviamente i tuoi avranno altri valori. I nomi dei campi del database sono inTemp, outTemp, outHumidity, ecc.

# using these names, create the sensor_map in /etc/weewx/weewx.conf
[SDR]
    ...
    [[sensor_map]]
        inTemp = temperature.-102.Acurite606TXPacket # mud room
        inTempBatteryStatus = battery.-102.Acurite606TXPacket
        outTemp = temperature.0995.AcuriteTowerPacket # back porch
        outHumidity = humidity.0995.AcuriteTowerPacket
        outHumidity = battery.0995.AcuriteTowerPacket
        extraTemp1 = temperature.16B9.AcuriteTowerPacket # bathroom
        extraHumidity1 = humidity.16B9.AcuriteTowerPacket
        batteryStatus1 = battery.16B9.AcuriteTowerPacket
        extraTemp2 = temperature.0ED5.AcuriteTowerPacket # kitchen
        extraHumidity2 = humidity.0ED5.AcuriteTowerPacket
        batteryStatus2 = battery.0ED5.AcuriteTowerPacket

Puoi vedere l'elenco completo dei nomi dei campi del database nella sezione dei tipi di archivio della guida alla personalizzazione di Weewx.

Avvia Weewx

Per prima cosa esegui Weewx direttamente per assicurarti che la raccolta dei dati funzioni correttamente e che i dati vengano scritti nel database e nei report. Un minuto o due dopo averlo avviato, dovresti vedere i pacchetti LOOP che contengono i dati dai sensori, associati ai nomi dei campi del database come definiti nel tuo file sensor_map. Ogni 5 minuti dovresti vedere un archivio RECORD segnalato.

# run weewx directly to verify the data collection (ctrl-c to stop)
weewxd /etc/weewx/weewx.conf

Dopo aver verificato che funzioni correttamente, termina weewxd. Ora puoi eseguirlo come demone in modo che continui a funzionare, anche dopo esserti disconnesso dal Raspberry Pi.

# run weewx as a daemon and forget about it!
sudo /etc/init.d/weewx start

Visualizzazione dei dati e personalizzazione dei report

Weewx salva i dati in un database SQLite su /var/lib/weewx.sdb . Puoi sfogliare i dati direttamente invocando lo strumento da riga di comando SQLite sul Raspberry Pi:

sqlite3 /var/lib/weewx.sdb

Nella sua configurazione predefinita, Weewx inserirà i dati in una pagina situata in /var/www/html. Se hai una tastiera e un monitor collegati al Pi, puoi visualizzare il rapporto direttamente in qualsiasi browser web.

È possibile visualizzare il report in remoto installando un server web sul pi, come nginx, lighttpd, o apache. Consiglio vivamente di utilizzare nginx o lighttpd sul Pi, poiché utilizzano molta meno memoria rispetto a Apache.

sudo apt-get install nginx

Quindi puoi visualizzare i rapporti utilizzando un browser Web su qualsiasi computer/tablet/telefono in grado di vedere il Pi:

http://<name-or-addr-of-pi>/weewx

Per personalizzare i report o aggiungerne altri, consulta la guida alla personalizzazione di Weewx:

Risoluzione problemi

Modulo del kernel già caricato

Quando esegui rtl_433, potresti ricevere un avviso su un modulo del kernel già caricato. In tal caso, puoi provare a non caricare esplicitamente il modulo del kernel, quindi inserirlo nella lista nera in modo che non venga caricato accidentalmente.

# ensure that the rtl kernel module is not running inappropriately
sudo modprobe -r dvb_usb_rtl28xxu
echo 'blacklist dvb_usb_rtl28xxu' | sudo tee -a /etc/modprobe.d/blacklist.conf

Il modulo del kernel è in uso

Se ricevi un errore che dvb_usb_rtl28xxu è in uso, scollega il tuo dispositivo SDR, quindi riprova.

La build rtl-sdr non riesce a trovare libusb

Durante la compilazione di rtl-sdr, potresti riscontrare problemi nel collegamento a libusb. In tal caso, prova a eseguire pkg-config come spiegato qui (In Inglese).

Autore: Matthew Wall