#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> 😉. 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.
2018 Ⓒ TanzoLab