Physical computing con Telegram

In questo articolo vengono descritti in dettaglio i contenuti dei seminari sull'uso di Telegram per il controllo di apparati sul campo tramite le schede Linux Embedded RaspBerry Pi o Arietta G25.

Cosa serve per provare in pratica

  • Un PC (Linux o Windows) o un Mac
  • Una Raspberry Pi
  • Una microSD da almeno 2GB almeno classe 4
  • Una alimentatore per Raspberry
  • Una connessione a internet via rete o via WiFi con DHCP attivo

Perché Telegram si presta bene per realizzare dei telecontrolli

Telegram parte dalle funzioni di base introdotte da WhatsApp e le estende all'infinito aprendo le porte alla programmazione di terze parti tramite le Bot API.

Anche per WhatsApp sono uscite delle API per poter interagire con le chat in automatico da progamma ma non sono ufficiali e c'é la possibilità che il servizio venga interrotto nel caso si accorgano che a chattare non è una persona ma un'applicazione.

Scoprire che è possibile telecomandare qualcosa con una applicazione che già conosciamo bene (ricordo che l'operatività di Telegram è praticamene identica a WhatsApp) ci rende molto inclini ad usarla sempre e molto recettivi a capirne le potenzialità.

Le Bot API di Telegram girano benissimo su schede Linux Embedded molto economiche come la Raspberry Pi o Arietta G25 consentendo quindi di avere una finestra sul mondo fisico dalla nostra chat su telefono.

Cosa è un Bot

I Bot sono programmi sviluppati da terze parti per fornire servizi aggiuntivi di ogni tipo.

Si accedono in chat semplicemente cercandoli per nome nel “Campo cerca contatti…” o tramite un link web diretto da siti tipo Telegram Bot Store.

Una volta registrato un nome di un Bot (es MyBot) è poi possibile dare l'accesso o tramite una URL tipo https://telegram.me/MyBot o tramite chat in questa forma @MyBot.

Il nome scelto per il nostro Bot, se accettato da Telegram, è univoco in tutto il mondo.

Per creare un nuovo Bot la procedura è istantanea e si fà direttamente in chat tramite https://telegram.me/BotFather o @BotFather.

Registriamo un nuovo Bot

Installiamo il client Telegram sul nostro PC dal sito Telegram. Il client su PC è molto più comodo del cellulare in quanto ci permette di fare cut & paste di dati tra chat e l'editor ASCII che useremo più avanti.

Vai su https://telegram.me/BotFather.

Quando appare il logo cliccaci su per aprire la chat con la lista dei comandi possibili.

Clicca su /newboot quindi inserisci il nome che hai scelto per il tuo Bot tipo MyBot ed il relativo username.

Lo username è il nome pubblico con cui il Bot sarà accessibile worldwide e deve essere avere una composizione del tipo tipo @nomescelto_bot o @NomesceltoBot.

Si riceverà una coppia ID:CHIAVE denominata Token. Questa coppia andrà usata nella nostra applicazione Python per registrarsi all’avvio del programma.

Ecco un esempio di Token:

  • 162073819:AAFUj0QtqRLhs5Vj9t0ZJaoMZuWkC-pC3SA

Raspberry Pi come gateway verso il mondo reale

Rispetto ad un desktop, un portatile o un server web, le schede Linux Embedded tipo la Raspberry Pi o le schede prodotte da Acme (Aria, Arietta e Acqua), dispongono anche di speciali pin su cui è possibile accedere a segnali elettrici a livello logico 0 o 1 gestiti direttamente dalla CPU.

Le più semplici di queste linee sono le GPIO ovvero le General Purpose Input Output.

Queste linee, assolutamene inadatte per pilotare direttamente qualsiasi oggetto nel mondo reale, sono molto versatili se accoppiate con un'elettronica di interfacciamento sul campo.

Vediamo ad esempio di come pilotarci una lampada a 220 volt. Prendiamo la scheda Relay Click prodotta da Mikroe e visibile qui:

Di seguito vediamone lo schema elettrico parziale di una delle due sezioni estratto da qui:

Per poter utilizzare nella vita reale una singola linea GPIO disponibile sulla Raspberry ad esempio, il segnale variabile disponibile su una GPIO tra 0 volt quando è a riposo (stato logico 0 o basso) a 3.3 volt quando è attivo (stato logico 1 o alto) serve un transistor (Q1 nello schema) che pilota un relé (REL1 nello schema) e quindi ai contatti del relé si possono attestare i cavi della fase che andrebbero direttamente alla lampadina e che in questo modo possono essere interrotti o no per accenderla o spegnerla.

Vedremo più avanti come pilotare queste linee da un Bot e di conseguenza da un messaggio Telegram.

Come generare la microSD per RaspBerry Pi

Scarica dal sito ufficiale Raspberry l'immagine della microSD Raspbian più leggera utile per i nostri scopi.

Una volta scaricata l'immagine ISO decomprimila e segui le istruzioni dal sito ufficiale per scriverla su microSD:

Inserisci la microSD nella Raspberry, collega la rete, un monitor HDMI e una tastiera USB e dai alimentazione.

Quando appare la richiesta di login digita:

login: pi
Password: raspberry

Digita il comando ifconfig per conoscere l'indirizzo IP assegnato alla Raspberry dal DHCP della tua rete.

Prova a verificare se la scheda può accedere ad internet dando ad esempio il comando:

$ sudo ping www.google.it
PING www.google.it (173.194.116.152) 56(84) bytes of data.
64 bytes from fra02s28-in-f24.1e100.net (173.194.116.152): icmp_seq=1 ttl=54 time=65.9 ms
64 bytes from fra02s28-in-f24.1e100.net (173.194.116.152): icmp_seq=2 ttl=54 time=65.4 ms
64 bytes from fra02s28-in-f24.1e100.net (173.194.116.152): icmp_seq=3 ttl=54 time=66.0 ms
...

Per uscire dal comando premi ctrl + c

Da questo punto punto in poi tutte le operazioni possono essere fatte da remoto collegandosi all'indirizzo di rete assegnato.

Per evitare di dover ricollegare monitor e tastiera possiamo installare Avahi che implementa il protocollo Bonjour della Apple che consente di raggiungere la scheda da un PC sulla stessa LAN usando il nome invece che l'indirizzo IP.

Per installare Avahi/Bonjour digita i seguenti comandi:

$ sudo apt-get update
$ apt-get install libnss-mdns

Una volta fatto il reboot la scheda sarà raggiungibile in rete con il nome raspberrypi.local al posto dell'indirizzo IP.

Per settare un nome diverso il file a cambiare è /etc/hostname.

Per farlo puoi usare l'editor ASCII minimale che funziona anche senza interfaccia grafica Nano.

$ sudo nano /etc/hostname

Per propagare il nuovo nome sulla LAN fare il reboot della scheda con il comando:

$ sudo reboot

Connessione remota via LAN

Per accedere alla Raspberry da un PC remoto serve installare sul PC i seguenti tool:

Su Windows:

  • putty.exe Terminale SSH per accedere alla console comandi di Linux

Su Linux:

  • Il programma gterm già installato sui PC Linux consente di aprire una sessione remota con il comando ssh pi@indirizzo_ip

Su Mac:

  • Apri il programma preinstallato Terminal dal launchpad e quindi una sessione remota con il comando ssh pi@indirizzo_ip

Se hai installato Avahi/Bonjour sulla Raspberry puoi accedere anche usando raspberrypi.local al posto dell'indirizzo IP.

Configurazione della tastiera italiana

Di default la Raspberry è configurata per la tastiera inglese, per settare il layout corretto lancia il comando:

$ raspi-config

Seleziona Generic 105-key (intl) PC quindi Italian e "default" su tutte le altre voci.

Questa operazione non è necessaria se stai usando un terminale remoto.

Installazione di python-telegram-bot

Python-telegram-bot è un cosidetto "wrapper", ovvero una libreria per il linguaggi di programmazione Python per interfacciarsi con le funzioni fornite da Telegram per estendere le possibilia di avere servizi di terze parti in modo semplice.

I comandi per installarlo sono:

$ sudo apt-get install python-pip
$ sudo pip install python-telegram-bot

Installazione del client SCP e di un Editor ASCII per sviluppare

A questo punto siamo pronti per provare il codice di esempio del nostro primo Bot Telegram TanzoBot 😉.

Per fare questo abbiamo bisogno di installare sul nostro PC un client SCP per accedere da remoto ai file memorizzati sulla microSD della Raspberry.

Occorrerà installare un Network File Sharing, come Samba, sulla Raspberry Pi (vedi link a fondo pagina).

Ci servirà anche un editor ASCII per poter modificare l'esempio di base a nostro piacimento.

Su Windows:

Su Linux Ubuntu:

  • Client SCP: Possiamo utilizzare Nautilus già installato di default
  • Editor ASCII: Geany o Gedit

Su Mac:

  • Editor Ascii: TextWrangler (Installabile gratuitamente dall'Apple store)
  • Client SCP: FileZilla

Proviamo TanzoBot

Aggiorniamo la microSD

L'immagine della microSD scaricata dal sito Raspberry è una foto dello stato dello sviluppo al momento della sua pubblicazione.

Prima di provare TanzoBot consiglio di aggiornare il tutto all'ultimo grido usando i comandi:

$ sudo apt-get update
$ sudo apt-get install

E' possibile accedere ai sorgenti dei programmi si esempio dal repository GitHub:

Oppure scaricarne uno alla volta dando il seguente comando a console:

$ wget https://raw.githubusercontent.com/tanzilli/TanzoBot/master/tanzobot.py

o infine fare come fanno i veri programmatori tosti ovvero clonare l'intero repository GitHub.

Questo sistema ha il vantaggio che scarica tutti i file del progetto in un'unico comando e può tenerli allineati agli ultimi aggiornamento scaricando solo le differenze.

Per fare questo bisogna installare Git che presto scoprirete essere uno dei programmi più utili mai realizzati. Per la cronaca Git è un altro programma ideato da Linus Torvalds il creatore di Linux.

Una volta scaricati i sorgenti facciamo una copia locale di tanzobot.py e diamogli il nome che abbiamo scelto per il nostro bot. Tipo miobot.py.

Con uno degli editor ASCII che abbiamo scaricato cerchiamo questa riga in miobot.py:

updater = telegram.Updater("Inserisci qui il Token assegnato da BotFather")

inserendoci il token che ci ha assegnato BotFather al momento della registrazione di MioBot.

Salviamo e lanciamo MyBot (ex TanzoBot):

$ python mybot.py

Ora vediamo se risulta visibile da Telegram https://telegram.me/MyBot

Configurare la WiFi

Da console edita con l'editor ASCII nano il file wpa_supplicant.conf dando il seguente comando:

$ sudo nano /etc/wpa_supplicant//wpa_supplicant.conf

Quindi aggiungi le seguenti righe:

network={
    ssid="nome del mio access point"
    psk="password di accesso del mio access point"
}

inserendo il nome della nostra rete WiFi e la passoword di accesso.

Salva e riavvia la rete WiFi con il comando:

$ sudo ifdown wlan0
$ sudo ifup wlan0

Controlla se la wlan0 (il nome della nuova scheda di rete) ha un indirizzo di rete assegnato da DHCP con il comando:

$ sudo ifconfig

Configurare WebCam

Per poter inviare foto Inserire una webcam compatibile UVC video quindi per poter inviare foto installare il programma fswebcam con il seguente comando:

$ sudo apt-get update
$ sudo apt-get install fswebcam

Links

Ringraziamenti

Ringrazio Alessio Camaioni (www.eliografica.com) per il supporto nella stesura di questo articolo.