Markdown source

#Physical computing con Telegram

<div class="row">
	<div class="col-md-2">
		<img src="telegram_bulb.jpg" class="img-thumbnail"/>
	</div>
	<div class="col-md-10">
		<div class="text-success lead">
			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.
		</div>
	</div>
</div>


<span class="text-success lead">
</span>

<img src="telegram_flow.jpg"/>

## 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.

* [Telegram Bot API](https://core.telegram.org/bots/api)
* [Telegram Bot Store](https://storebot.me/)

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](https://www.raspberrypi.org/) o [Arietta G25](http://www.acmesystems.it/arietta)
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](https://storebot.me/).

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

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](https://telegram.me/BotFather) o <b>@BotFather</b>.

<center>
<a href="https://telegram.me/BotFather">
<img src="./botfather.jpg">
</a>
</center>

## Registriamo un nuovo Bot

Installiamo il client Telegram sul nostro PC dal sito <a href="https://telegram.me" target="_blank">Telegram</a>.
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](https://telegram.me/BotFather).

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

<img src="./botfather_help.jpg">

Clicca su <b>/newboot</b> 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](/aria), [Arietta](/arietta) 
e [Acqua](/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](http://www.mikroe.com/click/relay/) prodotta 
da Mikroe e visibile qui:

<a href="http://www.mikroe.com/click/relay/" target="_blank">
<img src="./relay_click.jpg"/>
</a>

Di seguito vediamone lo schema elettrico parziale di una delle due sezioni
estratto da [qui](http://download.mikroe.com/manuals/click/relay/relay_click_manual.pdf):

<img src="./relay_click_schematic.jpg">

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.

<a href="https://www.raspberrypi.org/downloads/raspbian/" target="_blank" title="Vai alla pagina di download della Raspberry">
<img src="./raspbian_download.jpg">
</a>

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

* [Installing operating system images](https://www.raspberrypi.org/documentation/installation/installing-images/README.md)

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:

<pre class="terminal">
login: <b>pi</b>
Password: <b>raspberry</b>
</pre>

Digita il comando <b>ifconfig</b> 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:

<pre class="terminal">
$ <b>sudo ping www.google.it</b>
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
...
</pre>

Per uscire dal comando premi <kbd><kbd>ctrl</kbd> + <kbd>c</kbd></kbd>

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 <b>Avahi</b> 
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:

<pre class="terminal">
$ <b>sudo apt-get update</b>
$ <b>apt-get install libnss-mdns</b>
</pre>

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

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

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

<pre class="terminal">
$ <b>sudo nano /etc/hostname</b>
</pre>

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

<pre class="terminal">
$ <b>sudo reboot</b>
</pre>
 
##Connessione remota via LAN

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

Su Windows: 

* [putty.exe](http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html) Terminale 
SSH per accedere alla console comandi di Linux

Su Linux:

* Il programma <b>gterm</b> già installato sui PC Linux consente di aprire una sessione remota
con il comando <b>ssh pi@indirizzo_ip</b>

Su Mac:

* Apri il programma preinstallato <b>Terminal</b> dal launchpad e quindi una sessione 
remota con il comando <b>ssh pi@indirizzo_ip</b>

Se hai installato Avahi/Bonjour sulla Raspberry puoi accedere anche usando <b>raspberrypi.local</b> 
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:

<pre class="terminal">
$ raspi-config
</pre> 

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

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

## Installazione di python-telegram-bot

<img src="python-telegram-bot.jpg">

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:

<pre class="terminal">
$ sudo apt-get install python-pip
$ sudo pip install python-telegram-bot
</pre>

##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 <b>TanzoBot</b> &#128521;. 

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: 

* Client SCP: [WinScp](https://winscp.net/eng/download.php) 
* Editor Ascii: [NotePad++](https://notepad-plus-plus.org/)

Su Linux Ubuntu:

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

Su Mac:

* Editor Ascii: <b>TextWrangler</b> (Installabile gratuitamente dall'Apple store)
* Client SCP: [FileZilla](https://filezilla-project.org/download.php?type=client) 

 
## 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:  

<pre class="terminal">
$ sudo apt-get update
$ sudo apt-get install
</pre>

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

* [TanzoBot su GitHub](https://github.com/tanzilli/TanzoBot)

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

<pre class="terminal">
$ <b>wget https://raw.githubusercontent.com/tanzilli/TanzoBot/master/tanzobot.py</b>
</pre>

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](https://git-scm.com/) che presto scoprirete 
essere uno dei programmi più utili mai realizzati. Per la cronaca Git è un altro programma ideato da 
[Linus Torvalds](https://it.wikipedia.org/wiki/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:

<pre class="minicom">
updater = telegram.Updater("Inserisci qui il Token assegnato da BotFather")
</pre>

inserendoci il token che ci ha assegnato [BotFather](https://telegram.me/BotFather) al momento della registrazione di MioBot.

Salviamo e lanciamo MyBot (ex TanzoBot):

<pre class="terminal">
$ python mybot.py
</pre>

Ora vediamo se risulta visibile da Telegram [https://telegram.me/MyBot](https://telegram.me/MyBot)

##Configurare la WiFi

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

<pre class="terminal">
$ sudo nano /etc/wpa_supplicant//wpa_supplicant.conf
</pre>

Quindi aggiungi le seguenti righe:

<pre class="minicom">
network={
    ssid="nome del mio access point"
    psk="password di accesso del mio access point"
}
</pre>

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

Salva e riavvia la rete WiFi con il comando:

<pre class="terminal">
$ sudo ifdown wlan0
$ sudo ifup wlan0
</pre>

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

<pre class="terminal">
$ sudo ifconfig
</pre>

##Configurare WebCam

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

<pre class="terminal">
$ sudo apt-get update
$ sudo apt-get install fswebcam
</pre>

##Links

* [Doc della libreria Raspberry-gpio-python](http://sourceforge.net/p/raspberry-gpio-python/wiki/browse_pages/)
* [Doc della libreria Python Telegram Bot](http://python-telegram-bot.readthedocs.org/en/latest/)
* [Repository GitHub della libreria Python Telegram Bot](https://github.com/python-telegram-bot/python-telegram-bot)
* [Telegram Bot API](https://core.telegram.org/bots/api)
* [SambaSetup](https://www.abelectronics.co.uk/kb/article/1057/samba-setup-on-raspberry-pi)


##Ringraziamenti

<a href="http://www.eliografica.com">
<img src="./eliografica.jpg">
</a>

Ringrazio <b>Alessio Camaioni</b> ([www.eliografica.com](http://www.eliografica.com)) per il supporto 
nella stesura di questo articolo.