Tutte le informazioni su un display

Display e-ink
closeQuesto articolo è stato pubblicato 3 anni 11 mesi 2 giorni giorni fa quindi alcuni contenuti o informazioni presenti in esso potrebbero non essere più validi.

Avere un sistema che memorizza informazioni su un appartamento è poco utile se queste informazioni non possono essere lette o consultate.

Nel mio progetto di domotica ho sviluppato alcune funzioni del bot su Telegram che mi permettessero di leggere i dati dei sensori di temperatura con pochi facili comandi, ma non è proprio una cosa comoda, in più i dati numerici dicono poco se non sono rappresentati almeno con un piccolo grafico.

Allora ho installato Home Assistant, gli ho fatto prendere i dati dal DB e li ho fatti presentare in un modo un po’ più fruibile.

La grafica, anche se semplice, è più accattivante di un messaggio di testo, ma c’è sempre il problema che per poterli vedere devo avere un PC sotto mano o devo tirare fuori il telefono dalla tasca.

Così ho aperto il cassetto della disperazione, quello dove noi nerd/maker mettiamo tutto quello che compriamo, le “cose che sono bellissime e che prima o poi useremo”, e ho tirato fuori due componenti:

  • Un Raspberry Pi 3 (ma per il progetto vanno bene dal 2 in poi, basta che abbia il connettore a 40PIN) con gli accessori base: alimentatore e scheda SD (il link sponsorizzato porta al 4, attualmente in commercio)
  • Un display e-ink da 4” fatto apposta per il Raspberry e venduto, che io sappia, solo da Pimoroni

Adoro i display e-ink, per questo avevo quel bellissimo display, comprato in un momento in cui il sito Pimoroni faceva gli sconti al 20%

La prima cosa da fare è stata, ovviamente, scaricare l’immagine di Raspbian, scriverla sulla scheda con Balena Etcher e avviare il Raspberry Pi, in modo da poterci lavorare. Tralascio tutta la questione di installazione e configurazione del sistema operativo e della rete, ci sono guide ovunque e se siete assidui lettori di questo blog, vostro malgrado, avrete sicuramente almeno una schedina Raspberry accesa a casa, vero?

Il display arriva già preassemblato, quindi basta solo collegarlo al Raspberry facendo bene attenzione a collegare il connettore nel modo giusto. E’ facile e non si può sbagliare.

Da tenere a mente

Questo display si integra con il sistema domotico presentato in questo blog, quindi molti dei dati li recupero dal mio DB dove li memorizzo dopo averli acquisiti dai sensori. Nessuno vi vieta, anzi fatelo, di mettere dentro i dati che più vi aggradano.

Preparare la scheda

Prima di poter lavorare con il display, è necessario installare e configurare un po’ di componenti software, in modo che si possano usare durante la realizzazione del progetto. Assicuratevi di conoscere l’indirizzo IP del Raspberry e di poter accedere via SSH, sono due condizioni indispensabili. E’ indispensabile saper padroneggiare un po’ di console di Linux, senza dubbio.

Prima cosa: cambiare la password dell’utente “pi”, memorizzarla e non perderla. Per cambiarla si può usare la comoda utility

$ sudo raspi-config

Poi è bene aggiornare il sistema operativo

$ sudo apt update
$ sudo apt upgrade

Lavoreremo in Python 3, per gestire i pacchetti è necessario installare PIP, il gestore di pacchetti e librerie di Python. Python dovrebbe già essere installato nel sistema operativo.

$ sudo apt install pip3

Ci serviranno molte librerie per poter gestire lo schermo e prendere i dati qua e là per la rete (di casa e Internet). Iniziamo dal necessario per il display, partendo dalla libreria specifica di questo e-ink

$ sudo pip3 install inky

Poi ci servono le librerie per poter disegnare sul display

$ sudo apt install libjpeg-dev
$ sudo apt install zlib-dev
$ sudo pip3 install Pillow

E alcune altre librerie a corredo

  • NumPy serve per alcuni calcoli matematici
  • Libopenjp2-7 e libtiff5 sono delle librerie per la gestione delle immagini
  • Ephem serve per per calcolare alba e tramonto del sole (e altre molle cose)
  • Holydays per i giorni festivi, che non sembra, ma calcolare il giorno della Pasqua è davvero un casino
  • sqlite3 è un DB piccolo, leggero, a prestazioni limitate, per memorizzare e recuperare dati
  • sshfs lo uso per fare un accrocchio, monta un sistema Linux remoto usando i protocollo SSH invece dei più comuni SMB o NFS, ci dedico un paragrafo più avanti
  • snmp è il protocollo usato per leggere i dati dei consumi di traffico sul router

Qui di seguito tutti i comandi per installare i componenti

$ sudo apt install python3-numpy
$ sudo apt install libopenjp2-7
$ sudo apt install libtiff5
$ sudo pip3 install ephem
$ sudo pip3 install holidays
$ sudo apt install sqlite3
$ sudo apt-get install sshfs
$ sudo apt install snmp

Per memorizzare gli eventi da visualizzare ho fatto una semplice tabella su SQLite che riempio a mano a seconda di quello che mi serve. Io ci metto i compleanni e le ricorrenze importanti. I giorni festivi sono invece calcolati dalla libreria apposita. Nessuno vieta di evolvere la cosa facendo parlare il sistema con un calendario su Internet, tipo quello di Google.

Per creare un DB su SQLite 3 il comando è semplicissimo, il DB viene creato e si è nella console del database. Con lo stesso comando, se il DB è già stato creato, si entra semplicemente in console. Niente autenticazione e niente cose difficili. SQLite è un DB piccolo, facile, da usare solo in locale

$ sqlite3 eventi.db

Una volta dentro si può creare la tabella che serve da calendario (per i puristi del DB: lo so e accetto tutte le obiezioni, è una tabella assimilabile a un file di testo e fate i buoni.)

CREATE TABLE Eventi (Data, evento);

Per inserire un evento basta fare una banale query di insert

INSERT INTO Eventi (Data, Evento) VALUES ('02-23', 'Compleanno Fra');

La data si inserisce nel formato MM-GG e ci deve essere una sola riga per giorno dell’anno, se nello stesso giorno ci sono più eventi metteteli sulla stessa riga.

da dove prendo i dati

Il display visualizza dati, questi dati arrivano da più fonti, sia interne al mio sistema che da servizi web.

Temperature di casa

Tutte le temperature di casa sono all’interno di un DB SQLite sul mio Intel Nuc che fa da centralina. Visto che SQLite non permette accessi remoti come potrebbero fare MySQL o PostgeSQL, ho fatto un accrocchio (semplicemente perché non mi andava di migrare tutto il mio sistema su un altro DB, almeno non al momento).

Per collegarmi al DB, quindi, mi collego dal Raspberry del display alla mia centralina, che è sempre Linux, usando un tool che monta cartelle remote via SSH così non ho neanche dovuto installare e configurare Samba o NFS sulla stessa centralina.

Forse non è l’idea migliore, ma per quel che mi serve funziona. Il comando per fare il mount della cartella è questo:

sudo sshfs -o allow_other -o password_stdin [utente]@[indirizzo]:/cartella/del/db /home/pi/db_remoto <<< '[password]'

dove

  • [utente] è l’utente del server al quale devo collegarmi
  • [indirizzo] è l’indirizzo IP (o il nome) del server al quale devo collegarmi
  • /home/pi/db_remoto è una cartella che ho creato sul Raspberry del display,che deve restare vuota e che fa da mount point
  • [password] è la pasword per accedere via SSH al server

Il tutto, ovviamente non ha alcun livello di sicurezza, questo è chiaro, se si vogliono fare le cose fatte bene, il DB remoto deve essere un DB vero e la connessione avviene sulla corretta porta direttamente sul DB, non escludo di farlo, prima o poi.

Per far funzionare il tutto, il lancio del programma di update del display è preceduto dal comando sshfs, è seguito dal comando du umount ed è eseguito dal crontab di root (sì, lo so, anche questa non è una bella cosa da fare in un sistema Linux). Il piccolo script è un po’ più avanti in questo articolo

Una volta che ho il DB a disposizione posso leggere i dati dei sensori che mi servono, le query le trovate nel codice su GitHub, è tutta roba molto banale. Ho notato che con questo modo di collegamento poco ortodosso, la risposta alle query è buona se sono collegato con il cavo di rete, il tempo cresce in maniera esagerata, tipo 10 volte, se uso la WiFi.

Temperatura esterna

Mettere un sensore di temperatura sul balcone è sempre stato un problema, quando questo viene colpito dal sole le temperature si fanno roventi nel vero senso del termine e ovviamente la lettura si sballa. Oltre a questo un sensore fuori, a batteria, in estate, inverno, con pioggia o siccità, è un problema da gestire.

Quindi che ho fatto? Sono andato sul sito dell’Arpa Piemonte a cercare una centralina di temperatura in città, sicuramente loro hanno i sensori piazzati meglio per poter avere una giusta lettura della temperatura. Sono partito dalla cartina del Piemonte e ho selezionato una centralina vicino casa. Nel dettaglio si possono vedere i dati dei vari sensori, a me interessava solo la temperatura.

Visto che Arpa non fornisce un servizio decente con dati JSON o altro formato da Open Data, ho banalmente fatto lo scrapring della pagina web, sono andato a cercare la stringa prima della temperatura e da quella ho estratto i caratteri tra i quali c’è l’informazione. Fatta un po’ di pulizia di spazi e caratteri non gestibili, ho estratto il numero che mi interessava.

Visto che il mio sensore per esterni non era affidabile, ho anche deciso che, visto che ho il DB disponibile, questa lettura da Arpa sostituisse il sensore da esterni, così ho una batteria in meno da gestire e ho una lettura decente dei dati di temperatura esterna.

Il valore dei PM10

L’inquinamento dell’aria è un argomento sempre attuale, sopratutto in inverno, se i PM10 superano i 50 allora si attivano i blocchi delle auto. Volevo avere un grafico dell’andamento di questo valore, visto che il dato ufficiale lo fornisce sempre Arpa, sono andato sul sito dove ci sono i dati e ho cercato il modo di scaricarli, visto che sono presentati come Open Data

Diciamo che in teoria sono Open Data, in pratica li scarichi aprendo un JNLP oppure li prendi da un CSV che devi generare con tre click sul loro sito. Insomma, una vera schifezza.

Quindi ho fatto la stessa procedura che ho usato per la temperatura esterna: apro la pagina, cerco la stringa, pulisco i dati e la visualizzo, oltre che salvarla sul DB così ho anche lo storico.

Energia elettrica consumata

Tra i vari sensori che ho progettato e costruito c’è quello che misura in tempo reale quanto sto consumando, la misurazione è indicativa, ma abbastanza efficace, la lettura viene memorizzata nel Db dal quale estraggo, con tre query distinte le seguenti informazioni:

  • Consumo della giornata fino al momento della lettura, in Wh
  • Consumo degli ultimi 30 giorni
  • Consumo orario a partire da mezzanotte del giorno corrente
Dati usati sulla connessione

Normalmente tutti i router hanno la possibilità di interrogare alcuni valori tramite il protocollo SNMP, se letti nel modo corretto, questi valori restituiscono quanti dati stanno transitando da una determinata porta. Il valore che viene restituito dalla lettura è un intero che indica il numero di byte passati dall’ultimo reset. Quindi se interrogo il dispositivo ogni secondo so, in quel secondo, quanti dati sono passati.

A casa ho un Mikrotik e ho scoperto qual è l’identificativo da interrogare per avere i dati in upload e download della porta di WAN. Il display si aggiorna ogni ora, salva la lettura e quindi a questo punto è facile fare i conti di quanti dati sono passati in upload e download in un’ora o in intervalli più lunghi.

Previsioni meteo

Esistono dei servizi Internet, gratuiti se non li si interroga troppo spesso, che forniscono dati atmosferici e previsioni. Uno di questi è Opeweathermap, le cui API restituiscono un bellissimo file JSON con le previsioni ogni 3h dei successivi 5 giorni, a me interessa solo oggi e domani, quindi filtro da quel JSON solo i dati che mi interessano.

Per usare le loro API è necessario iscriversi e ottenere la chiave, da mettere nel codice, per poter fare la chiamata.

Nelle API del servizio meteo, viene indicata anche l’icona da usare per la previsione, questa è identificata da un numero di due cifre e una lettera, “d” per gorno e “n” per notte. Io uso un solo set di icone, quindi prendo solo i primi due caratteri. Le icone, le mie sono in formato PNG, devono essere in una cartella sul raspberry, devono avere una dimensione di 30×37 e devono essere fatte solo in due colori, visto che il display rende meglio in questo modo e non in scala di grigi.

Effemeridi

È sempre stata una mia passione quella di sapere quando sorge e tramonta il sole, tra i milioni di librerie disponibili per Python, Ephem fa questo, oltre tutta un’altra serie impressionante di calcoli sui corpi celesti.

Eventi

Gli eventi sono recuperati da due fonti, la prima è il DB che si compila a mano, come indicato all’inizio di questo post, il secondo è la libreria apposita che conosce e calcola le festività di tutte le varie nazioni.

VIsualizzazione

Trovate tutto nel codice, che cerco di fornirvi in modo pulito e ben commentato, ovviamente (tutto con licenza GPL, quindi potete prenderlo, usarlo, copiarlo e modificarlo senza farvi problemi), ci vanno solo alcune piccole note per comprendere il funzionamento.

Il display e-ink, per sua caratteristica, passatemi il termine, “funziona anche da spento”, nel senso che una volta aggiornato, io lo posso staccare da qualunque fonte di alimentazione e la sua visualizzazione resterà quel che è dopo l’ultimo refresh, per sempre.

Collegarlo a un Raspberry che è sempre acceso è, in effetti, uno spreco di energia. La giusta modalità d’uso sarebbe che ogni tot tempo accendo il Raspberry, lui fa tutti i conti e i collegamenti che deve, aggiorna il display e si spegne. Gestire questa cosa su una cheda che ha un sistema operativo non è banale e si rischia, spegnendolo più colte al giorno per molti giorni, di fare danni alla scheda hardware o alla scheda SD. Si dovrebbe progettare un circuito esterno che lo accende, attende tutta la procedura, poi la lo shutdown del sistema operativo e infine lo spegne.

In questo progetto il Raspberry è acceso che non fa nulla per la maggior parte del tempo, un comando nel crontab, lo schedulatore di Linux avvia la procedura che:

  • monta il disco del DB della centralina
  • fa tutto quel che deve
  • aggiorna il display
  • smonta il DB

Fatto questo torna ad oziare.

Se avete un Paspberry che fa altro, com la VPN, Home Assistant, PI-Hole o quel che avete deciso di fargli fare, se ha il connettore GPIO libero, potete aggiungere il display e questo non inficerà sulle prestazioni di nessun altro servizio che avete già attivo.

Per il codice e i commenti vi mando su GitHub, come sempre.

Lo script per aggiornare il display

Lo script per aggiornare il display è un banale script in bash con 3 righe. È necessario ovviamente crearlo

$ nano script.sh

Una volta dentro l’editor di testo è necessario inserire le tre righe che servono

!/bin/bash
# script per aggiornare il display eink

# prima monta la cartella con SSHFS
sshfs -o allow_other -o password_stdin [utente]@[indirizzo]:/cartella/remota/ /home/pi/cartella <<< '[password]'

# poi esegue lo script per aggiornare il display
python3 /home/pi/what/eink-display.py

#poi smonta la cartella
umount /home/pi/cartella

E’ ovviamente necessario creare la cartella dove verrà montata quella remota

$ mkdir cartella

E poi si deve rendere eseguibile lo script

$ chmod +x script.sh

Per inserire lo script da eseguire nel crontab è necessario lanciarlo con i diritti di root

$ sudo crontab -e

Inserire poi le sue righe per l’esecuzione, una dopo il reboot del sistema e l’altra ogni ora

# aggiorna il display ogni ora
10 * * * * /home/pi/script.sh

# aggiorna il display al reboot
@reboot /home/py/script.sh

Se si vuole aggiornare il display a mano, e in fase di sviluppo viene fatto mille volte al giorno, basta essere nella cartella e usare il comando

$ sudo ./script.sh

Risorse aggiuntive

per far funzionare il display, è necessario aggiungere alcuni file al Raspberry, nello specifico, un font e alcune immagini, per le previsioni del tempo.

Il font Arial, che ho usato io, lo si trova su qualsiasi sito di font gratis, volendo anche nel vostro PC. Io ho messo il file nella cartella dove c’è lo script in Python.

Le immagini per il meteo, come già indicato, devono essere in 2 colori, PNG, 30×37, ci va un po’ di “tocco magico” con un editor di immagini (quelle che ho usato io me le ha fatte un amico), potete iniziare da qui

Il progetto è rilasciato con licenza GPL V.3 (Open Source), quindi puoi prenderlo, fartelo a casa, modificarlo e pubblicarlo a nome tuo. Se lo condividi modificato devi citare questo sito (www.iltucci.com) come fonte principale.

Nota importante, da leggere prima di commentare

Questo è un blog scritto per passione, non fornisco quindi risposte di tipo professionale, se avete bisogno di un aiuto tecnico rivolgetevi ad un professionista di fiducia, non offendetevi se mi astengo dal rispondere. Vi ringrazio per la comprensione.

Lascia un commento

Il tuo indirizzo email non sarà pubblicato. I campi obbligatori sono contrassegnati *

Questo sito usa Akismet per ridurre lo spam. Scopri come i tuoi dati vengono elaborati.