venerdì 14 Agosto 2020
Home / Domotica / Datalogger atipico con Raspberry Pi

Datalogger atipico con Raspberry Pi

Cos’è?
Un datalogger è un registratore di dati, acquisiti solitamente da uno o più sensori e memorizzati in una memoria interna.
Sembra quindi un compito perfetto per la nostra scheda preferita, con in più alcune funzioni che saltano subito alla mente: intrefaccia web per la visualizzazione dei dati, anche in forma grafica, anche da remoto.
E in effetti la guida su come creare un datalogger, prima o poi la si trova su ogni blog o forum Raspberry.
Considerando le premesse fatte su, il buon programmatore ha già in mente cosa fare: programma Python per gestire le misure, database MySQL per l’archiviazione, Apache per il server web e php per creare la pagina web che visualizzi i dati. Poi, per accedere anche dall’ esterno della propria rete locale, occorrerà impostare un servizio di DNS dinamico come No-IP, inoltrare le porte sul router, ecc.. E tutte le guide o tutorial, più o meno, sono realizzati su questa falsariga.
Un po’ complicato, no?

“Famolo strano..”
Fortunatamente (oppure no?!) qui su Raspberryitaly.com siamo un po’ diversi dal resto del mondo: io non sono un programmatore puro, anzi non sono nemmeno un programmatore, quindi il mio approccio sarà decisamente meno professionale, sarà diverso, sarà decisamente più atipico e farà storcere il naso a chi sa programmare, ma ritengo che spesso, le soluzioni “accademiche” siano spropositate per l’uso hobbistico che ci prefiggiamo e portino spesso complicazioni evitabili: il mio obiettivo è usare un solo programmino in python,il più possibile universale, evitare database e web server, e affidarmi a un servizio web per l’archivio e la collezione dei dati registrati.
Questo approccio, secondo me, apporta diversi vantaggi:

  • impatto più semplice per chi non conosce database, programmazione web e simili
  • evitare le continue scritture sulla SD, cosa che ne accorcia la vita
  • possibilità di accedere ai propri dati da qualsiasi posto nel mondo senza dover impostare accessi dall’ esterno alla propria rete casalinga
  • capire come muoversi nell’ universo IoT (vedere spiegazione più avanti)

e sicuramente qualche svantaggio, rispetto alla soluzione classica:

  • I dati non sono sul mio dispositivo: il servizio web potrebbe non essere sempre disponibile e avere dei dati on-line comporta una minore sicurezza dal punto di vista della privacy.

Quindi la scelta di un approccio, piuttosto che un altro, è da valutare a seconda dell’ uso specifico, ma a meno che non dobbiate registrare i dati vitali di un anziano capo di stato, forse il fattore privacy non è così importante.

datalogger-classico-atipico
Più semplice, no?

Un datalogger generico serve a tutto e a niente.. ho in mente qualche applicazione più specifica che può essere molto utile, ma a titolo didattico, vediamo come implementare una registrazione generica di dati, ma usando l’approccio che ho qui denominato “atipico”.
Vediamolo nel dettaglio.
Un programma scritto in Python si occuperà di rilevare uno (o più) dati ogni tot tempo (questo intervallo, naturalmente dipende dall’ applicazione specifica e da quanto rapidamente varia la grandezza da misurare) e effettuerà l’invio di questi dati a un servizio web.
Questo servizio, manterrà i dati in memoria e li presenterà in grafico secondo le nostre preferenze, impostabili direttamente dal sito web. E’ possibile rendere pubblico il risultato (chiunque ha l’indirizzo web specifico, è in grado di visualizzarli) oppure privato (per visualizzare i dati occorrerà anche accedere con user e password).

Il cuore di tutto, naturalmente, è il servizio web.
Tra i vantaggi del mio approccio prima ho scritto “capire come muoversi nell’ universo IoT”, perchè questi servizi web, nascono con lo scopo di interfacciare tra loro le “cose” del famoso IoT (Internet of Tings, cioè l’ “internet delle cose”). In un futuro prossimo, infatti, saranno sempre di più i dispositivi connessi, ma probabilmente non avranno tutte le possibilità di un computer o del RaspberryPI, proprio perchè non saranno computer: magari non si potranno installare software come un server web o un database, spesso sono privi di dispositivi di memorizzazione (già oggi, non ci pensiamo, ma questi oggetti sono nelle nostre case: smart TV, decoder, player multimediali, console da gioco.. si possono connettere alla rete ma non hanno tutte le funzioni di un computer). Per gestire questi oggetti e farli comunicare e fargli fare quello che desideriamo, occorre un cambio di mentalità, dal vecchio macchina->programma che gira su quella macchina a una programmazione per un ambiente digitale eterogeneo, in cui un programma non impegna solo un dispositivo, ma sfrutta le potenzialità specifiche di ogni apparecchio e del web per ottenere il risultato.
Nascono quindi siti web che offrono dei servizi che permettono di “remotizzare” quelle funzionalità che sarebbe impossibile (o molto difficile per la persona normale) implementare anche su questi dispositivi limitati.
Vediamone alcuni:
Thingspeak
Fluentd
Xively
Plotly

Ecco un esempio minimale di visualizzazione con Thingspeak, che è quello che userò per questo esempio:
Thingspeak
È il risultato del programma Python pubblicato sotto.
Ha dele API anche per i grafici, quindi, l’aspetto, volendo, è totalmente personalizzabile e si può inglobare anche nel vostro sito personale.
ecco un grafico dinamico incorporato nella pagina.

Utilizzando un servizio web, non c’è garanzia che questo sia sempre on-line e raggiungibile, quindi nel programma ho previsto che, se l’invio on-line del dato fallisce (e solo in quel caso), il valore misurato viene salvato, accompagnato da data e ora, in un file .csv (compatibile con il sito) in modo che i dati non vadano persi, ma sia possibile uploadarli in seguito, quando la connessione torna disponibile.
Per evitare di incappare nel principale difetto di questo tipo di programmi sul RaspberriPi (le troppe scritture su SD), ho pensato di creare un piccolo RAM Disk su cui salvare il file.
Per chi non lo conoscesse, un RAM Disk è una porzione della memoria RAM che viene però vista dal sistema come un disco vero e proprio, quindi potremmo scrivere i nostri file in RAM, invece che sulla SD, preservando quest’ ultima. Lo svantaggio è che se manca alimentazione, si perde il contenuto del RAM Disk.
Ma appena la connessione torna disponibile, i dati salvati in locale potranno essere caricati on-line.
Ho previsto anche un download periodico dal sito dei dati più vecchi per l’archiviazione locale dello storico (con l’account gratuito, alcuni servizi web potrebbero tenere i dati solo per 30 giorni).
Anche qui si scriverà sulla SD, ma meglio una scrittura al mese che una ogni minuto (e comunque è sempre possibile impostare percorso di rete o disco usb).
Per completare il tutto, considerata l’importanza dell’ orologio in una applicazione di questo tipo, in cui i dati vengono memorizzati in base all’ orario, consiglierei anche l’utilizzo di un RTC (Real Time Clock), ossia una piccolo componente dotato di batteria tampone che, aggiunto al RaspberryPi, consente di mantenere data e ora corretti anche se spento e disconnesso dalla rete.

Basta con tutte queste premesse! diamoci da fare!
Ok, ok.. vi fremono le mani..
Partiamo con l’implementazione di esempio stra-classica: misurare la temperatura interna della CPU.
Per prima cosa:

Impostiamo un RAM Disk:
Creiamo prima di tutto la directory in cui verrà montata la partizione:
sudo mkdir /var/ram
Editiamo poi il file fstab (in questo caso, con l’editor Nano)
sudo nano /etc/fstab
e aggiungiamo in fondo la linea
tmpfs /var/ram tmpfs nodev,nosuid,size=2M 0 0
Salvare il file, mantenendo lo stesso nome.
Ora, ricarichiamo i punti di mount dei dischi con
sudo mount -a

Verifichiamo che sia andato tutto bene con il comando
df
Dovrebbe riportare (con gli altri dischi) un tmpfs con 2048 “1k-bloks” (cioè 2M) come /var/ram
Ho scelto 2Mb perchè è sufficiente a memorizzare un dato al minuto per quasi 2 mesi, senza connesione. Così si imposta solo la dimensione massima, la RAM effettivamente occupata sarà inferiore, in base a quanti dati verranno memorizzati nei down di connessione internet.

Registrare un account su Thingspeak.com
Ho scelto di usare questo sito per l’esempio: gratuito e semplice.
Createvi in account su https://thingspeak.com/users/sign_up.
Una volta fatto l’account, create almeno un nuovo canale (serve un canale per ogni grandezza che volete misurare nel tempo). Prendete nota della key del canale e dell’indirizzo della vostra pagina. Tutto qui.

Il programma Python

Zzedlogger
Ecco qui, nemmeno 30 righe, se togliamo i commenti. Scarica il file python qui.
Manca l’implementazione di un paio di funzioni: l’invio al sito del file CSV non appena c’è la connessione (al momento potete caricarlo a mano dal sito) e l’archiviazione dei dati storici.
Per queste 2 funzioni vi chiedo aiuto: parliamone nel forum, io mi sono un po’ bloccato, poi aggiornerò la guida e il programma.
Impostare la key e il percorso del file di salvataggio in base alle vostre esigenze.

Conclusioni?
Più che una conclusione, questo è un inizio. Con ThingSpeak potete settare, direttamente sul sito, alcuni “eventi” tramite quelle che vengono chiamate applicazioni. È possibile inviare messaggi Twitter, ricevere comandi da Twitter, creare POST o GET personalizzati ad altri servizi web per recuperare i dati, svolgere operazioni preimpostate o periodiche.
Questo qui presentato non è che un esempio: si possono usare gli altri servizi web, invece della temperatura della CPU si può misurare o calcolare qualsiasi grandezza (anche più di una) prendendo i dati da sensori esterni collegati con la GPIO o dati on line, sostituendo la funzione thermometer() con una su misura, senza limitare la fantasia: può essere la temperatura della piscina come tutti i dati di telemetria di un macchinario, oppure il livello di un liquido, i vari dati meteo come velocità del vento, pressione, umidità..
Altra possibilità è quella di trasmettere anche le indicazioni di posizione geografica, come latitudine, longitudine e altezza, per tracciare il movimento su una cartina GoogleMap.. Insomma, ancora una volta, l’unico limite, è la fantasia!

A proposito di Zzed

Zzed
Appassionato di informatica alternativa, ma perenne novellino di Linux..

Vedi Anche

MagPi 95 doppia pagina

MagPi in italiano! Numero 95: Pi4: Costruisci una Games Console

Estratto, in italiano, da The MagPi n°95 di Luglio 2020. Scarica il PDF gratuito!

Powered by themekiller.com