ÍNDICE DE CONTEÚDO
No dia 5 de Novembro de 2015 aconteceu o Intel Innovation Week 2015, evento organizado pela Intel no Brasil para divulgar novas tecnologias, estudos e tendências do mercado, além de novos produtos e soluções tanto da própria Intel como de seus parceiros. Para este evento fui convidado para apresentar uma demonstração de aplicação de Internet das Coisas com a Intel Edison. Em um ambiente onde fazemos tanto uso de mídias sociais, pensei… Por que não juntar mídias sociais com Internet das Coisas? Isso nos levaria a algo como Social Things, já pensou?
Assim, meu exemplo tratou de demonstrar um bot implementado em Telegram capaz de controlar elementos da Intel Edison, fazer leitura de sensores, contar a quantidade de pessoas em vista e até mesmo atuar como sistema de segurança por imagem.
Nesse artigo irei então apresentar um tutorial de como criar o bot com Telegram na Intel Edison, nos moldes do que eu apresentei no Intel Innovation Week 2015. Não irei aprofundar muito, senão o artigo ficaria demasiadamente extenso. Dessa forma, apresentarei os conceitos em partes.
O motivo fundamental de eu ter escolhido o Telegram é que o mesmo possui uma API bem aberta e bem documentada, facilitando a integração do mesmo com linguagens tais como Python, Java, C#, dentre outras. Além disso, o Telegram também já possui uma estrutura específica para trabalhar com bots!
Embarcados Experience 2024: Evento Presencial
Participe do Embarcados Experience 2024 em São Paulo. Conhecimento técnico, palestras, workshops e oportunidade de networking com profissionais experientes.
Bot com Telegram
Um bot é basicamente uma aplicação capaz de simular ações humanas, e até mesmo interagir por meio de sistemas de mensagens instantâneas, tal como Telegram, e assim responder a perguntas, comandos, e desempenhar ações específicas. O interessante da estrutura do Telegram para bots é que eles não dependem de números de celular para operarem. Basicamente você realiza um processo de registro, obtém uma chave de acesso e utiliza essa chave para controlar o seu bot. Isso será melhor apresentado adiante.
Todo o mecanismo de criação e gestão de bots em Telegram pode ser visto em detalhes na área de bots do Telegram. Inclusive, eles mesmos já fornecem toda uma base de códigos-fontes com exemplos para interação com bots Telegram em diversas linguagens neste link.
Para criar um bot no Telegram, é preciso falar com o “The Botfather“! Uma icônica alusão ao Poderoso Chefão. E aqui fica uma consideração pessoal: Além de terem uma API aberta, ainda possuem uma boa dose de humor!
The BotFather
Outra coisa legal do Telegram é que o mesmo não tem limitações quanto à forma de acesso. Ou seja, você pode acessar sua conta do Telegram pelo seu navegador mesmo com seu celular desligado, pelo link do Web Telegram. Isso, obviamente, depois de ter validado o seu computador com o sistema. Com isso, pude fazer todo o setup do bot conversando com o The Botfather pelo navegador, em meu computador. Para conversar com o The BotFather, você deve acessar este link, estar logado no Telegram, e assim que a janela foi propriamente carregada, inicie o processo com o comando /start, a partir do qual o BotFather irá então exibir uma lista dos comandos suportados para dar início à criação e setup do seu bot Telegram. Veja como é na Figura 4.
Viu então os comandos listados? Para você criar seu bot, então precisa agora digitar o comando /newbot e enviar. Com isso, ele irá lhe pedir o nome do seu novo bot. Coloquei para o meu o nome edisongram, pois pensei em uma mistura de Edison com Telegram. E após enviar o nome desejado, ele irá lhe pedir então o username do seu bot, e lhe avisa que o username deve finalizar com a palavra bot. No meu caso, ficou edisongram_bot. Veja o “bate-papo” na Figura 5.
Feito isso, seu bot está configurado e ele irá então lhe informar um token, uma chave de acesso que você deverá usar com a API do Telegram para fazer interface com o seu bot, e assim poder ler e enviar mensagens por meio dele, tal como mostrado na Figura 6.
Guarde o token de acesso em um arquivo *.txt. Ele será usado na Intel Edison para o devido funcionamento do bot com o Telegram.
Configurando sua Edison para Python com Telegram
Como linguagem para a escrita do programa do bot, será usado Python pelo fato de ser uma linguagem elegante. Simples, objetiva e direta, além de intuitiva. Para continuar daqui pra frente, garanta que a sua Intel Edison esteja devidamente configurada com Poky Linux. Em caso de dúvida, veja o material de imagens da Intel para instalar em sua Edison neste link e também o Intel Edison – Guias e Truques, escrito pelo Diego Sueiro aqui no Embarcados.
Considerando agora que sua Intel Edison está com Poky Linux instalado e configurado, e com acesso à internet, esteja também com acesso ao terminal da mesma, tanto via USB ou via SSH. Vamos instalar o Python PIP para gestão de pacotes Python com o seguinte comando:
1 |
# opkg install python-pip |
Terminado o processo, agora vamos instalar uma biblioteca de suporte para uso do Bot Telegram, por meio do seguinte comando:
1 |
# pip install python-telegram-bot |
O repositório oficial dessa biblioteca está neste link do GitHub, onde são fornecidos detalhes mais aprofundados e todo o código-fonte e estrutura da biblioteca, além de algumas dicas de utilização e exemplo de bot implementado com ela. Esse material me ajudou bastante durante o processo.
Seu primeiro Bot com Telegram na Edison
Então, após instalada a biblioteca via Python-PIP, podemos criar um primeiro código de exemplo para testar o bot. Vamos então criar um exemplo simples, do tipo echo, em que a mensagem que for enviada ao bot será desenvolvida para você.
Para escrever o código na Intel Edison, digite o seguinte comando para iniciar o editor vi com um nome de arquivo sugerido como edisonGram.py:
1 |
# vi edisonGram.py |
Obs: Caso preferir, use outro editor de sua preferência que já esteja instalado no Linux da Intel Edison, tal como Nano ou o próprio Vim, por exemplo.
No editor, coloque então o seguinte código Python apresentado abaixo. Coloquei em cada linha de código comentários acerca da funcionalidade de cada trecho. Espero que assim fique mais intuitivo. Neste código, coloquei o meu Token de acesso, que foi obtido anteriormente na conversa com o BotFather, para servir de base. Mude para o Token gerado pela sua conversa com o The BotFather. (Após esse post eu criei outro Token, então não haverá problemas em termos de segurança a exibição deste dado).
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 |
# primeiro importamos a biblioteca telegram, instalada pelo Python-PIP import telegram # e tambem importamos a biblioteca sleep de time, para poder criar # "delay" no codigo Python. from time import sleep # Faz os imports de bibliotecas para tratar erros de conexao URL. try: from urllib.error import URLError except ImportError: from urllib2 import URLError # Criamos uma rotina main para gerir o codigo principal def main(): # Variavel update_id - usada pelo Telegram update_id = None # Criamos um objeto bot inserindo o Token fornecido # pelo The BotFather bot = telegram.Bot('144082936:AAGDrwQJWpdrMeRhC0WFUnw1mcZ9e3dasTg') print 'Bot Telegram iniciado...' # Loop infinito - programa em execucao while True: try: update_id = edisonGramBot(bot, update_id) except telegram.TelegramError as e: # Se ocorrer algum problema, lentidao, por ex: if e.message in ("Bad Gateway", "Timed out"): sleep(1) # Espera 1 segundo... else: # Caso contrario, lanca excessao. raise e except URLError as e: # Ha problemas de rede na execucao... sleep(1) def edisonGramBot(bot, update_id): # Requisita atualizacoes depois da ultima id de update - update_id # bot.getUpdates(offset, timeout) - offset eh o ponto de partida em # que comeca a procurar novas atualizacoes de mensagens, timeout eh # tempo minimo de espera para retorno da requisicao de resposta. for update in bot.getUpdates(offset=update_id, timeout=10): # o chat_id eh a id do chat de comunicacao Telegram # eh necessaria para o bot identificar a conversa e # gerar e enviar a resposta chat_id = update.message.chat_id # atualiza o indice update_id - para ref novas mensagens update_id = update.update_id + 1 # Captura a mensagem de texto enviada ao bot no dado chat_id message = update.message.text if message: # Envia a mensagem para o chat_id especifico, com a mensagem # parametrizada. bot.sendMessage(chat_id=chat_id, text=message) # retorna o ultimo update_id para servir de referencia return update_id # Rotina essencial para executar a rotina main() quando o codigo python # eh executado. if __name__ == '__main__': main() |
Vamos testar a aplicação? Então salve o código e saia do editor vi ou qualquer outro editor que você estiver usando. Assim, para executar o nosso código Python devemos proceder com o seguinte comando:
1 |
# python edisonGram.py |
Se tudo correr certo, a aplicação será iniciada e você poderá então também iniciar a conversa com o seu Bot via Telegram. Veja adiante o meu exemplo para este código-modelo. Primeiro, eu exibo o console de acesso ao terminal Linux da Intel Edison. E depois eu mostro a janela de conversa com o Bot, que basicamente irá me retornar tudo que eu enviar para ele, ou seja, simplesmente é um “echo”.
Algumas considerações adicionais
Somente a funcionalidade de “echo” não agrega nada, não é mesmo? Só serviu para testarmos que a aplicação escrita é capaz de ler e enviar mensagens. Agora vamos agregar mais um pouco de funcionalidade. Podemos tratar os textos recebidos pelo Bot e programar ações específicas para determinadas mensagens. Pense nas seguintes situações:
- Temperatura – O Bot responde a temperatura do ambiente, obtida por meio da leitura do correpondente sensor;
- Luminosidade – O Bot responde a luminosidade do ambiente, também obtida por meio da leitura do correspondente sensor;
- Acender luz – Imagine que um relé esteja ligado a uma lâmpada, por exemplo. Com este comando, a Edison poderia então acionar o relé e acender a lâmpada;
- Apagar luz – Correspondentemente, poderia também apagar a lâmpada.
Dentre outros. As possibilidades são infinitas.
Para isso, temos que tratar a parte de código que recebe a mensagem, de modo a analisar o conteúdo da mensagem para então proceder com comandos/ações específicos.
Uma das coisas bem interessantes a respeito do Telegram é a possibilidade de mandar Stickers, que são imagens bem humorísticas baseadas em personagens consagrados da história, tais como Einstein, Tesla, Freddie Mercury, dentre outros. Para isso, existe a função da biblioteca sendSticker capaz de enviar uma imagem Sticker em formato *.webp.
E se quiser enviar uma foto, uma imagem? Basta usar a função sendPhoto devidamente parametrizada, passando o caminho do arquivo de foto/imagem a ser enviado.
Um Bot mais aprimorado
De modo a agregar um pouco mais de funcionalidade ao Bot modelo, irei agora mostrar como exibir a mensagem enviada ao Bot no display LCD do Kit Groove da Intel Edison, além de 2 easter eggs, ou seja, surpresas no código. Caso queira reproduzir o código abaixo em sua Intel Edison, lembre-se de substituir o Token pelo seu próprio, e também de estar com o Display LCD do Kit Groove devidamente conectado na porta I2C. Coloque o código no mesmo arquivo, edisonGram.py, usando seu editor favorito (vi, nano, etc).
Observação: Para reproduzir fielmente o exemplo abaixo, garanta que o arquivo de imagem *.png da logo do [wpdm_asset id=’10’] e o arquivo de [wpdm_asset id=’11’] *.webp estejam no mesmo diretório do arquivo-fonte python do bot para execução!
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 |
# primeiro importamos a biblioteca telegram, instalada pelo Python-PIP import telegram # importamos tambem a biblioteca para controle do display lcd groove import pyupm_i2clcd as lcd # e tambem importamos a biblioteca sleep de time, para poder criar # "delay" no codigo Python. from time import sleep # Faz os imports de bibliotecas para tratar erros de conexao URL. try: from urllib.error import URLError except ImportError: from urllib2 import URLError # Inicializacao do display LCD groove. myLcd = lcd.Jhd1313m1(0, 0x3E, 0x62) # Cor Verde. myLcd.setColor(0, 255, 0) # Limpa display myLcd.clear() # Cursor em ponto inicial myLcd.setCursor(0,0) # Variavel global para indice # de requisicoes. LAST_UPDATE_ID = None # Criamos uma rotina main para gerir o codigo principal def main(): # Referencia a variavel global. global LAST_UPDATE_ID # Criamos um objeto bot inserindo o Token fornecido # pelo The BotFather bot = telegram.Bot('144082936:AAGDrwQJWpdrMeRhC0WFUnw1mcZ9e3dasTg') # Puxa o ultimo indice de requisicao. try: LAST_UPDATE_ID = bot.getUpdates()[-1].update_id except IndexError: LAST_UPDATE_ID = None # Loop infinito - ira funcionar enquanto o programa estiver executando while True: try: edisonGramBot(bot) except telegram.TelegramError as e: # Se ocorrer algum problema na comunicacao com Telegram - lentidao, por ex: if e.message in ("Bad Gateway", "Timed out"): sleep(1) # Espera 1 segundo... else: # Caso contrario, lanca excessao. raise e except URLError as e: # Ha problemas de rede na execucao... sleep(1) def edisonGramBot(bot): # Referencia a variavel global. global LAST_UPDATE_ID # Requisita atualizacoes depois da ultima id de update - update_id # bot.getUpdates(offset, timeout) - offset eh o ponto de partida em # que comeca a procurar novas atualizacoes de mensagens, e o timeout eh o # tempo minimo de espera para retorno da requisicao de resposta ao Telegram. for update in bot.getUpdates(offset=LAST_UPDATE_ID, timeout=10): # o chat_id eh a id do chat de comunicacao Telegram # eh necessaria para o bot identificar a conversa e # gerar e enviar a resposta chat_id = update.message.chat_id # Captura a mensagem de texto enviada ao bot no dado chat_id # Agora com encode UTF-8 message = update.message.text.encode('utf-8') if message: # Se ha mensagem, entao... if(message.lower() == 'tecnologia?'): # Responde Embarcados! bot.sendMessage(chat_id=chat_id,text='Embarcados!') # E manda a imagem-logo do Embarcados bot.sendPhoto(chat_id=chat_id, photo=open('embarcados.png','rb')) elif(message.lower() == 'intel?'): # Responde Edison! bot.sendMessage(chat_id=chat_id,text='Edison!') # E manda Sticker do Freddie Mercury bot.sendSticker(chat_id=chat_id, sticker=open('queen.webp','rb')) else: # Vamos mostrar a imagem no display LCD 16x2. # Ou seja, a imagem nao pode extrapolar limites! if(len(message) <= 16): myLcd.clear() #limpa display myLcd.setCursor(0,0) #posiciona myLcd.write(message) #exibe msg elif(len(message) > 16 and len(message) <= 32): myLcd.clear() #limpa display myLcd.setCursor(0,0) #posiciona 1a linha myLcd.write(message[0:16]) #exibe myLcd.setCursor(1,0) #posiciona 2a linha myLcd.write(message[16:len(message)]) #exibe # E de todo jeito, faz echo da mensagem! bot.sendMessage(chat_id=chat_id, text='LCD: '+message) # Por fim, atualiza a referencia de requisicao. # +1 para continuar a atender as proximas. LAST_UPDATE_ID = update.update_id + 1 # Rotina essencial para executar a rotina main() quando o codigo python # eh executado. if __name__ == '__main__': main() |
Para executar o código, basta seguir o procedimento padrão, chamando o interpretador Python seguido do nome do arquivo:
1 |
# python edisonGram.py |
E o resultado vemos a seguir:
E logo adiante o resultado no display LCD da Intel Edison:
E como citei, e não deveria faltar: 2 “easter eggs” sensacionais!
Em breve pretendo também apresentar um artigo mostrando com detalhes como implementar um Bot de monitoramento com Intel Edison, capaz de tirar fotos, contar pessoas em vista, etc. Fique atento!
Não aguenta esperar até lá? Bom, então veja o código-fonte completo no repositório GitHub do EdisonGram neste link. Bom proveito!
O tutorial serve pro galileo tambem?