Telegram Bot Control with Orange Pi Lite Wifi and AXE056 board with Picaxe 18M2

opl0

What are Telegram bots?

Bots are third-party applications that run inside Telegram. Users can interact with bots by sending them messages, commands and inline requests. You control your bots using HTTPS requests to Telegram’s bot API.

What can one do with Telegram bots?

To name just a few things, you could use bots to:

  • Get customized notifications and news. A bot can act as a smart newspaper, sending you relevant content as soon as it’s published.
    Forbes Bot, TechCrunch Bot
  • Integrate with other services. A bot can enrich Telegram chats with content from external services.
    Image Bot, GIF bot, IMDB bot, Wiki bot, Music bot, Youtube bot, GitHub bot
  • Create custom tools. A bot may provide you with alerts, weather forecasts, translations, formatting or other services.
    Markdown bot, Sticker bot, Vote bot (NEW), Like bot (NEW)
  • Build single- and multiplayer games. A bot can play chess and checkers against you, act as host in quiz games, or even take up the dungeon master’s dice for an RPG.
    Trivia bot
  • Build social services. A bot could connect people looking for conversation partners based on common interests or proximity.
    HotOrBot
  • Do virtually anything else. Except for dishes — bots are terrible at doing the dishes.

How do bots work?

At the core, Telegram Bots are special accounts that do not require an additional phone number to set up. Users can interact with bots in two ways:

  • Send messages and commands to bots by opening a chat with them or by adding them to groups. This is useful for chat bots or news bots like the official TechCrunch and Forbes bots.
  • Send requests directly from the input field by typing the bot’s @username and a query. This allows sending content from inline bots directly into any chat, group or channel.

Messages, commands and requests sent by users are passed to the software running on Telegram’s servers. Their intermediary server handles all encryption and communication with the Telegram API for you. You communicate with this server via a simple HTTPS-interface that offers a simplified version of the Telegram API. Telegram calls that interface their Bot API.
A detailed description of the Bot API is available on this page »

How does one create a bot?

There’s a… bot for that. Just talk to BotFather (described below) and follow a few simple steps. Once you’ve created a bot and received your authorization token, head down to the Bot API manual to see what you can teach your bot to do.
You may also like to check out some code examples here »

 

 

How are bots different from humans?

  • Bots have no online status and no last seen timestamps, the interface shows the label ‘bot’ instead.
  • Bots have limited cloud storage — older messages may be removed by the server shortly after they have been processed.
  • Bots can’t initiate conversations with users. A user must either add them to a group or send them a message first. People can use telegram.me/ links or username search to find your bot.
  • Bot usernames always end in ‘bot’ (e.g. @TriviaBot, @GitHub_bot).
  • When added to a group, bots do not receive all messages by default (see Privacy mode).
  • Bots never eat, sleep or complain (unless expressly programmed otherwise).

BotFather

BotFather is the one bot to rule them all. It will help you create new bots and change settings for existing ones.

On Telegram, open the @BotFather profile, and start to talk with “him”. You can open the conversation by clicking here. If the screen remains empty, update your Telegram client, or write “/start

The BotFather will ask you to read a manual, but it’s not necessary!

Use the /newbot command to create a new bot. The BotFather will ask you for a name and username, then generate an authorization token for your new bot.

The name of your bot will be displayed in contact details and elsewhere. Say we call it ‘OrangePi Picaxe’

The Username is a short name, to be used in mentions and telegram.me links. Usernames are 5-32 characters long and are case insensitive, but may only include Latin characters, numbers, and underscores. Your bot’s username must end in ‘bot’, e.g. ‘tetris_bot’ or ‘TetrisBot’. In this tutorial give an appropriate name such as ‘PicaxeBot’.

BotFather will give you an HTTP API token, such as:

87782160:AAGWyE1JSEa8qNqvv4EZzcQQ4kWo7rokMKM

The token is required to authorize the bot and send requests to the Bot API.

If your existing token is compromised or you lost it for some reason, use the /token command to generate a new one.

Edit settings

The remaining commands are pretty self-explanatory:

  • /setname – change your bot’s name.
  • /setdescription — changes the bot’s description, a short text of up to 512 characters, describing your bot. Users will see this text at the beginning of the conversation with the bot, titled ‘What can this bot do?’.
  • /setabouttext — changes the bot’s about info, an even shorter text of up to 120 characters. Users will see this text on the bot’s profile page. When they share your bot with someone, this text will be sent together with the link.
  • /setuserpic — changes the bot‘s profile pictures. It’s always nice to put a face to a name.
  • /setcommands — changes the list of commands supported by your bot. Each command has a name (must start with a slash ‘/’, alphanumeric plus underscores, no more than 32 characters, case-insensitive), parameters, and a text description. Users will see the list of commands whenever they type ‘/’ in a conversation with your bot.
  • /setjoingroups — determines whether your bot can be added to groups or not. Any bot must be able to process private messages, but if your bot was not designed to work in groups, you can disable this.
  • /setprivacy — determines which messages your bot will receive when added to a group. With privacy mode disabled, the bot will receive all messages. We recommend leaving privacy mode enabled.
  • /deletebot — deletes your bot and frees its username.

Please note, that it may take a few minutes for changes to take effect.

opl9

So your bot is now ready.

Telepot, a Telegram client for Python

Telepot is a Python client which is the REST wrapper for Telegram API. Using it we can take commands from user and compute something and give back results to the user.

We are going to install Telepot on Orange Pi Lite  (OPL) Wifi, assuming that you have OPL duly functioning with latest Armbian Jessie desktop, and with Wifi connected to your router.

Orange-Pi-Lite-With-Wifi-Antenna

Let us build a Personal Assistant

First we need to install the sufficient libraries for constructing the Personal Assistant.
opl6

 

Next:

opl7

 

Once Telepot is installed we are ready to write our first bot code.

The following simple bot does nothing but accepts two commands:
– `/roll` – reply with a random integer between 1 and 6, like rolling a dice.
– `/time` – reply with the current time, like a clock.

Write the code at command prompt:

import time
import random
import datetime
import telepot

def handle(msg):
    chat_id = msg['chat']['id']
    command = msg['text']

    print 'Got command: %s' % command

    if command == '/roll':
       bot.sendMessage(chat_id, random.randint(1,6))
    elif command == '/time':
       bot.sendMessage(chat_id, str(datetime.datetime.now()))

bot = telepot.Bot('Token obtained previously')
bot.message_loop(handle)
print 'I am listening ...'

while 1:
    time.sleep(10)

Run diceyclock.py at command prompt python diceyclock.py and response will be I am listening…:

opl10

 

You can now try the two commands /roll and /time on Telegram:

opl11

Preparing AXE056 board with Picaxe 18M2

We want the Picaxe18M2 to be able to communicate by serial connection with Orange Pi Lite Wifi

Wrtie and upload the following code in Picaxe 18M2:

main:
    setfreq m8
    serin C.7, T9600_8, b0
    
    if b0 = "a" then                 'looks for "a"
    high B.1                         'turns on the output 
    
    
    else if b0 = "b" then            'looks for "b" (off)
    low B.1                          'turns off the output 
    
    else if b0 = "c" then             'looks for "c"
    high B.2                          'turns on the output 
    
    
    else if b0 = "d" then            'looks for "d" (off)
    low B.2                          'turns off the output 
    
    else if b0 = "s" then            'looks for "s" (status)
    gosub get_status                 'calls up "get_status" subroutine below
    
    endif
    goto main
 
    get_status:
    
    let b0 = pinB.1                   'checks status of pin B.1
    let b1 = pinB.2                   'checks status of pin B.2 
    
    gosub get_temp                   'calls temp subroutine below
    gosub get_lumin                  'calls lumin subroutine below
    
    serout B.7, T9600_8, (#b0, 32, #b1, 32, #b2, 32, #b3, 13, 10)                                 					
    return
 
    get_temp:
    readtemp 2, b2                   'reads the temperature
    return
 
    get_lumin:
    readadc 0, b3                     'reads adc value on In2
    return

We will now add connections to HC-05 Bluetooth Module. For this we use Inputs Test Points and Output Test Points with headers  (image shows the headers already soldered):
opl12 opl13

Now connect up HC-05 module to the board as shown:

opl14

Adding Bluetooth to Orange Pi Lite Wifi

We have used LogiLink USB Bluetooth V4.0 dongle but it can be any other as most seem to be recognised by Armbian’s Debian Jessie OS for Orange Pi Lite Wifi.

opl19

A possible result duly boxed is as follows (I also added a heat-sink on the ARM microcontroller as it tends to heat up):

opl16

Armbian’s is already Bluetooth-ready. You can chech the Buletooth dongle has been recongised by following command, and a possible response is shown below:
opl20

opl21

We now test the status of Bluetooth:

opl22

 

A possible and likely result will be:

opl23

 

 

 

 

We are now to pair our dongle to HC-06 module on AXE056 board.

The command bluetoothctl will allow us to pair to HC-05

opl24

 

Now run the following sequence of commands:

power on
and next:
scan on

You will see all the Bluetooth devices in neighborhood including HC-05. Copy the MC address of HC-05:

opl25

 

 

 

And now the following sequence:

agent on
default-agent
pair <MAC address of HC-05>

A typical response will be:

opl26

 

 

 

 

Note that MAC address has been blurred.  Pin code of H-05 is 1234 (this can be changed but we are not going to show here how, you can find information on the Internet how to do it

trust    <MAC address of HC-05>
exit

Now create a RFCOMM configuration file  in command prompt

opl27

# RFCOMM configuration file.
rfcomm0 {
# Automatically bind the device at startup
bind yes;
# Bluetooth address of the HC-05
device XX:XX:XX:XX:XX:XX;
# RFCOMM channel for the connection
channel 1;
# Description of the connection
comment "HC-05";
}

We are now ready to bind this at startup by editing and writing into rc.local with the following command:

opl28

 

Add just before exit 0

rfcomm bind 0 xxxxxxxxxxxx 1

Where xxxxxxxxxxxx is the MAC address of HC-05.

Now reboot the Orange Pi Lite Wifi with command reboot, and afiter rebooting if you check under dev:

opl29

 

You will see RFCOMM0

opl30

Writing new Python code for Personal Assistant

Write pa.py with command nano pa.py


# pa.py
import telepot, serial, time
ser = serial.Serial('/dev/rfcomm0',
                    baudrate=9600,
                    timeout=0
                    )
degree = unichr(176)

def handle(msg):
       chat_id = msg['chat']['id']
       command = msg['text']
       if command == '/hello':
           bot.sendMessage(chat_id, "Local status @Aliatron")
       elif command == '/status':
           ser.flushInput()
           ser.flushOutput()
           ser.write(b's')
           time.sleep(1)
           data = ser.readline()
           processed_data = data.split(' ')
           data1 = str(processed_data[0])
           data2 = str(processed_data[1])
           data3 = str(processed_data[2])
           data4 = str(processed_data[3])
           if data1 == '1':
              data10 = "Fan ON"
           elif data1 == '0':
              data10 = "Fan OFF"
           if data2 == '1':
              data20 = "Alarm ON"
           elif data2 == '0':
              data20 = "Alarm OFF"
           bot.sendMessage(chat_id, data10 + " ; " + data20 + " ; Temp: " + data3 + degree + "C ; Lumi: " + data4)

       elif command == '/fanon':
           ser.flushInput()
           ser.flushOutput()
           ser.write(b'a')
           time.sleep(0.25)
           bot.sendMessage(chat_id, "Fan: ON")

        elif command == '/fanoff':
            ser.flushInput()
            ser.flushOutput()
            ser.write(b'b')
            time.sleep(0.25)
            bot.sendMessage(chat_id, "Fan: OFF")

        elif command == '/alaon':
            ser.flushInput()
            ser.flushOutput()
            ser.write(b'c')
            time.sleep(0.25)
            bot.sendMessage(chat_id, "Alarm: ON")
         elif command == '/alaoff':
            ser.flushInput()
            ser.flushOutput()
            ser.write(b'd')
            time.sleep(0.25)
            bot.sendMessage(chat_id, "Alarm: OFF")

         else:
            pass

# Bot API
bot = telepot.Bot('Token obtained previously')
# bot.notifyOnMessage(handle)
bot.message_loop(handle)
print 'I am listening ...'
# Listen to the messages
while 1:
       time.sleep(10)

Now run the Personal Assistant with the command python pa.py and response will be I am listening…:

opl10

 

 

You can now try the several commands /fanon, /fanoff, /alaon, /alaoff /status on Telegram:

opl31

AXE056 board will show LEDs 1 (yellow) and 2 (red) switching ON and OFF according to the commands you will send with Telegram.

The command /status will tell the state of the LEDs, and will give you extra information on local temperature read by DS1820 and luminosity read by LDR on the same AXE056 board.

To run pa.py as a daemon, you can use the following command:

nohup python pa.py &

opl32

 

The response will be similar to:

opl33

and then write exit

Acknowledgments

A special  thank you to the Telegram Messaging team for offering us all Telegram services, and most recently the usage of Telegram Bots!

Armbian offers Debian Jessie for Orange Pi Lite Wifi. There was nothing special, and very easy, to get the Debian Jessie OS on Orange Pi Lite. As a thank you, I donated a small amount to the Armbian.

Also a thank you to for inspiration of this project to:

Addenda

I have added a heatsink and a fan to the Orange Pi Lite Wifi set up. It was heating up before to temperatures as high as 64ºC (of course in plastic box without ventilation).

Now Orange Pi Lite Wifi works at arounf 29ºC.

I know it is a bit of overkill. The following images depict what has been done.

opl36

opl34

Conclusions

We have connected Telegram to a real world device (a PIC micrcontroller, Picaxe is after all a PIC) allowing  us to use it to control, and find status of the pins on the PIC device.  We can add lots of others features to this basic Personal Assistant bot such as:

  1. Tracking time
  2. Running a scheduler and alerts
  3. Taking notes
  4. Controlling remotely our home/office, garage door, etc
  5. etc. imagination is the limit

It is not necessary Orange Pi Lite Wifi to do this project. You can do it easily with Raspberry Pi, or Banana Pi.

If I can be any assistance in your project with Telegram inspired on my project, please write here in comments, and I will do my best to reply. Also, if you do anything different with Telegram inspired on my work, please share links here.

Also if there is anything wrong with this please let me know too.

Advertisements

About Tayeb

Electronics engineer, part-time webmaster and owner of "Aliatron", a tech-oriented company registered in Portugal and Mozambique.
This entry was posted in Uncategorized. Bookmark the permalink.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s