Ro-BOT – Assistente Pessoal utilizando o Telegram & Arduino. [2.0]

Olá sedentos por conhecimento!

Hoje vou explicar um pouco sobre como criar e como utilizar um bot no Telegram. Pra vocês que ainda não conhecem, Telegram é um aplicativo similar ao Whats app (melhor…cof cof) porém com pequenas, e significativas, diferenças. Telegram é código aberto e foi criado com um foco muito forte em segurança e privacidade permitindo ao usuário mandar mensagens criptografadas e criar conversas autodestrutivas, também sendo possível enviar documentos em qualquer formato (O que utilizo bastante para mandar arquivos como .pdf e .gif).

A ideia inicial para criar o bot me apareceu porque eu queria poder conversar com minha casa (Acende a luz!, A porta está fechada?, Como está a temperatura no meu quarto hoje?, DEFCON4 Double take!).  É comum encontrar na internet projetos similares usando arduino com shield wifi ou ethernet mas porque não fazer isso mais comodo e fácil para os usuarios? E é ai que entra o bot! Toda essa conversa de bots e bots…mas afinal o que é um bot? Um bot não é nada mais que uma conta de usuario controlada por um software. Então que tal ter o nosso proprio bot?

Vamos começar!

Começando pelo basico. Você precisa criar uma conta no Telegram. Pra isso basta instalar o aplicativo no seu dispositivo (Playstore/Itunes/TelegramDesktop).
Esse primeiro passo é bem fácil, basta cadastrar o seu numero de telefone, esperar o sms com o numero de confirmação e já podemos ir para o proximo passo.

Uma vez que sua conta esteja pronta devemos falar com BotFather. Pra isso basta acessar esse https://telegram.me/botfather ou buscar por “botfather” nos contatos que ele estará lá disponivel para conversar com você. Quando a primeira conversa for aberta com o BotFather lá em baixo terá um botão “/start”

botfather

Ao clicar no botão BotFather vai enviar as instruções e comandos disponíveis para conversar com ele. Como queremos criar um bot vamos enviar para BotFather

“/newbot”

Após isso basta informar como o bot (1)será chamado e qual o (2)nome de usuário do bot que estamos criando.

newbot

E pronto! Já temos um bot que podemos usar para enviar e receber mensagens.

Agora podemos começar a programar nosso bot. Para esse post vamos utilizar Python e antes de qualquer coisa deveremos instalar as ferramentas necessárias para programar o bot.

Lista de ferramentas necessárias:

$ sudo apt-get install python3
$ sudo apt-get install python3-pip
$ sudo pip3 install telepot
$ sudo pip3 install telepot –upgrade # UPGRADE

Após todas as ferramentas instaladas, mãos a obra. Iremos utilizar telepot ,um framework em python para acessar Telegram Bot API. Para mais detalhes sobre telepot você pode acessar a pagina do github onde será possivel encontrar mais detalhes sobre o framework, documentação e alguns códigos.

Vamos começar com um simples bot que responde “Olá, como você está hoje?” quando recebe um Olá.

#!/usr/bin/python
import telepot, time

def handle(msg):
	content_type, chat_type, chat_id = telepot.glance(msg)

	if (content_type == 'text'):
		command = msg['text']
		print ('Got command: %s' % command)

		if  '/Ola' in command:
			bot.sendMessage(chat_id, "Ola, como voce esta?")

# Cria um bot com a API key disponibilizada pelo BotFather
bot = telepot.Bot('16843XXXX:AAGGq99MLWOknqCx66V5s2XXXXXXXXXXXXX')

# Adiciona a função handle para ser chamada sempre que uma nova mensagem for recebida
bot.message_loop(handle)

# Aguarda por novas mensagens
while 1:
	time.sleep(20)

Salve com o nome de assistente.py.Rode o código utilizando

$ python3 assistente.py

Enquanto o código estiver rodando você é possivel testar o assistente pessoal mandando uma mensagem para o bot que acabamos de criar.

 

Screenshot from 2016-02-03 23:00:47

Nosso bot foi capaz de receber mensagens e responder mensagens pré definidas de acordo com nosso código. Onde na verdade o que aconteceu é que o código em python executou essas tarefas.  O código para gerar o bot é bastante simples e fácil de entender.

Agora que temos nosso pequeno código funcionando, que tal extender as capacidades dele? Utilizando um arudino e um relê eu resolvi testar se meu bot seria capaz de controlar uma lâmpada remotamente na minha casa, e aqui o resultado. Para isso o seguinte esquemático foi utilizado para conectar o arduino o módulo relê e uma lâmpada (negra).

Untitled Sketch 2_bb

O código para o arduino é bastante simples.

const int lightPin=6;
unsigned int data;
void setup() {
  Serial.begin(9600);
  pinMode(lightPin,OUTPUT);
  
}

void loop() {
    while(Serial.available()>0){
      data=Serial.read();
        if(data=='Y')digitalWrite(lightPin,HIGH);
        if(data=='N')digitalWrite(lightPin,LOW);
    }
  
}

 

Nesse código utilizamos a porta serial para receber informações que irão controlar a lâmpada. Caso o arduino receba pela porta serial o caractere “Y” ele define o nível lógico da porta conectada no relê como alto acendendo a lâmpada, caso receba “N” ele desliga o relê desligando também a lâmpada.

Uma vez que o arduino está devidamente conectado vamos atualizar o código que vamos utilizar em nosso bot.

#!/usr/bin/python
import telepot, time, serial
ser = serial.Serial('/dev/ttyACM0', 9600)

def handle(msg):

	userName = msg['from']['first_name']+" "+msg['from']['last_name']

	content_type, chat_type, chat_id = telepot.glance(msg)

	if (content_type == 'text'):
		command = msg['text']
		print ('Got command: %s' % command)

		if  '/hello' in command:
			bot.sendMessage(chat_id, "Ola "+userName+", como voce esta?")

		if '/lamp_on' in command:
			ser.write(b'Y')
			bot.sendMessage(chat_id, "A lampada esta ligada")

		if '/lamp_off' in command:
			ser.write(b'N')
			bot.sendMessage(chat_id, "A lampada esta desligada")

# Cria um  bot com a API key disponibilizada pelo BotFather
bot = telepot.Bot('16843XXXX:AAGGq99MLWOknqCx66V5s2XXXXXXXXXXXXXX')

# Adiciona a função hanldle para ser chamada sempre que uma nova mensagem for recebida
bot.message_loop(handle)

# Aguarda por novas mensagens
while 1:
	time.sleep(20)

Importando a biblioteca Serial podemos comunicar o código em python com nosso arduino dando o controle sobre lampada para nosso bot. É importante notar que na linha #3 é especificada a porta serial que o arduino está conectado, o código deve ser editado de acordo com a necessidade.
Salve o código e execute novamente e estaremos prontos para testar!

Por o Telegram dar suporte a desenvolvedores, há algumas dezenas de bots internet a fora e com o codigo disponivel para que vocês possam se divertir.
Vou deixar linkado aqui por onde começar!

Gostou? Que funcionalidades você adicionaria a um bot? Crie o seu e compartilhe suas experiencias com a equipe do dragão!

Conhecimento vale ouro!

EDIT: Devido a atualização da API para trabalhar com bots, o código do dragão sem chama teve de ser atualizado. O código já está funcional novamente :D

6 thoughts to “Ro-BOT – Assistente Pessoal utilizando o Telegram & Arduino. [2.0]”

  1. Boa noite, parabéns pelo post muito bom porem ao tentar executar o seu código assitente.py ocorreu isso aqui e não estou conseguindo corrigir, lembrando que instalei conforme orientação:

    Traceback (most recent call last):
    File “assistente.py”, line 18, in
    bot.notifyOnMessage(handle)
    AttributeError: ‘Bot’ object has no attribute ‘notifyOnMessage’

    1. Bom dia Rudrigo Lima,

      A API de BOTs foi atualizada desde o post do dragão sem chama, isso pode ter gerado alguma incompatibilidade com o código do dragão. Atualmente estou bastante ocupado com as atividades na universidade, mas logo logo vou atualizar o post por aqui.

      As mudanças para esse código serão as seguintes:
      1) a função glace2() que é utilizada na linha 9 agora é apenas glace()

      2) o método notifyOnMessage() agora é chamado de message_loop()

      Por enquanto, para seu código funcionar basta substituir pelo seguinte código:

      #!/usr/bin/python
      import telepot, time

      def handle(msg):

      userName = msg[‘from’][‘first_name’]+” “+msg[‘from’][‘last_name’]

      content_type, chat_type, chat_id = telepot.glance(msg)

      if (content_type == ‘text’):
      command = msg[‘text’]
      print (‘Got command: %s’ % command)

      if ‘/hello’ in command:
      bot.sendMessage(chat_id, “Ola “+userName+”, como voce esta?”)

      if ‘/lamp_on’ in command:
      ser.write(b’Y’)
      bot.sendMessage(chat_id, “A lampada esta ligada”)

      if ‘/lamp_off’ in command:
      ser.write(b’N’)
      bot.sendMessage(chat_id, “A lampada esta desligada”)

      # Cria um bot com a API key disponibilizada pelo BotFather
      bot = telepot.Bot(‘*******TOKEN*******’)

      # Adiciona a função hanldle para ser chamada sempre que uma nova mensagem for recebida
      bot.message_loop(handle)

      # Aguarda por novas mensagens
      while 1:
      time.sleep(20)

    1. Boa tarde Helio,

      Nâo conhecemos esse kit, portanto, não há como recomendar ou desrecomendar.

      Se você chegar a comprar o kit, deixa aqui um feedback de como ele funcionou para vocẽ o/

Deixe um comentário

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *