Piero V.

Smart plug con Raspberry Pi e Telegram

Recentemente ho lavorato ad un progetto che mette insieme diverse cose che mi piacciono: Telegram, la Raspberry Pi, che insieme possono fornire un’ottima base per creare semplici dispositivi IoT.
In questo caso ho creato una presa intelligente, che può essere accesa e spenta tramite un bot Telegram.

I requisiti sono veramente semplici: di base servono una Raspberry Pi, una scheda con dei relè, delle prese e un po’ di cavi.

Se preferite, potete usare al posto della Raspberry Pi anche altre schede, l’importante è che abbiano un modulo per il GPIO. Per esempio per un altro progetto molto simile io ho usato una Orange Pi Zero, di cui ho già parlato.

Per quanto riguarda i relè, l’importante è che funzionino a 5V, in pratica tutte le schede che funzionano con Arduino vanno bene. Io per esempio ho preso su Aliexpress un paio di schede da 4 relè a meno di 2€ ciascuna. Ce ne sono anche dall’Italia: hanno il vantaggio di arrivare prima, ma costano anche 5 volte tanto.
Questa potrebbe essere l’unica spesa per il progetto, a patto che abbiate già del materiale elettrico di recupero e una Raspberry, almeno questo è stato il mio caso.

Il montaggio nella maggior parte dei casi dovrebbe essere molto semplice e consiste solo in collegare dei semplici fili tra il mini PC e la scheda relè. Per esempio io ho scelto i pin 4 (5V) e 6 (GND) per l’alimentazione e i pin 29, 31, 33 e 35 per comandare i relè, ma la scelta si è basata unicamente sul fatto che lì c’erano diversi pin GPIO vicini. Per ulteriori informazioni vi rimando ai tutorial riguardo il vostri specifici dispositivi.

Il progetto montato

Per la parte software ho usato Python, il modulo RPi.GPIO, la libreria python-telegram-bot e la libreria emoji1.

Di per sè il bot potrebbe essere veramente semplice e si potrebbe ottenere in poco tempo modificando l’hello world, però ho preferito fare un qualcosa di più carino e versatile.

Per migliorare l’usabilità ho usato dei bottoni e abbondato con gli emoji, in aggiunta ai più tradizionali comandi preceduti da /.

Per la versatilità invece, ho creato un sistema di accettazione degli utenti: un super admin va definito in permissions.py, dopodiché questo può aggiungere tutti gli utenti che vuole con il comando /utenti.

Fino a qualche tempo fa Telegram era più restrittivo nei confronti dei bot e l’unico modo per ottenere informazioni sugli utenti era che essi avviassero il bot. Uno degli ultimi aggiornamenti ha rilassato il tutto, però non ho trovato della documentazione al riguardo, o forse la libreria che ho utilizzato non si è ancora adattata.

Fatto sta che un utente, prima di poter essere abilitato, dovrà avviare il bot. In questo modo gli verrà attribuito lo status di utente sconosciuto e comparirà nella lista di utenti che possono essere aggiunti.

Mi piacerebbe aggiungere anche la funzionalità di amministratori: il codice è già in parte predisposto, ma adesso non ho molto tempo per sistemare la funzionalità, quindi per il momento lo rilascio così com’è.

Tutte le interazioni con i GPIO vengono gestite in gpioman.py: in questo modo è possibile adattare il bot ad un’altra scheda con poco lavoro. Inoltre questo file contiene anche delle funzioni fasulle di ripiego che vengono usate qualora il codice non sia avviato nella Raspberry ma su un’altra scheda. Notate che se usate Python 3 e Raspbian, potreste dover installare il pacchetto python3-rpi.gpio. Non ho provato a usare Python 2, però potrebbe funzionare, in quanto non faccio uso di particolari funzionalità di Python 3. Per scelta uso la terza versione del linguaggio, perché ormai la seconda ha il certificato di morte pronto.

Un’altra cosa a cui è necessario prestare attenzione è che l’utente (della Raspberry) che avvia il bot abbia i permessi per interagire con i GPIO. Un vantaggio che ho riscontrato su Raspberry, rispetto ad Armbian su Orange Pi, è che nella prima basta essere utenti del gruppo gpio, nella seconda invece di default solo root può farlo e non c’è un modo pulito per ovviare al problema.

Rendo disponibile il codice del mio bot nel pubblico dominio. Notate che però non si applica alle dipendenze, che hanno licenza LGPLv3 (python-telegram-bot), MIT (RPi.GPIO) e BSD (emoji): raspberry_telegram_smartplug.tar.gz.

Se trovate errori, o anche semplicemente se trovate il progetto utile, non esitate a farmelo sapere 😊 .

Footnotes

  1. Il ruolo di questa libreria è trasformare i nomi mnemonici delle emoji in caratteri Unicode
    ^top