---
# System prepended metadata

title: IoT Lab 2
tags: [SRM2021]

---

# IoT Lab 2 
###### tags: `SRM2021`


# Part A:  Sending data to a cloud based platform (UBIDOTS)

:::info
**All the code necessary for this Lab session is available here [![](https://i.imgur.com/8f3a7R2.png =100x)](https://www.dropbox.com/sh/dnfdlycjtupv751/AADjgCtLsdaLkE6zGjOjXQdMa?dl=0)**

You can execute the code either in your computer or online:


In your computer:
* You need to have python3 installed, and
* `$ sudo pip3 install paho-mqtt`

Online:
* create an account in https://repl.it
* and create a new python file:
 ![](https://i.imgur.com/oW5EJIc.png)

Click here for ["the documentation of the MQTT Paho API"](https://www.eclipse.org/paho/clients/python/docs/) 
:::


In this block you will experiment about how MQTT can be used to send data to a cloud based platform. This procedure allows you to store your data in a cloud based repository and to analyze your data with software tools made available by the used platform. For these experiments we will use the [Ubidots](https://ubidots.com/) plaftorm.


## Connecting to the Ubidots platform

You will have to first create your free account in the Ubidots platform here: https://ubidots.com/stem/

Then you have to add a **Device** (select first the "Devices" section in the top on the web page):
![](https://i.imgur.com/cmCWh9I.png =x200)
choose:
![](https://i.imgur.com/M7nUX31.png =x100)

and add a name, like (**use the name that you want!!**):
![](https://i.imgur.com/Bry2Axc.png =x200)

You'll get: 
![](https://i.imgur.com/4NAGDF3.png)


Now click on the device name and you'll get to the variables creation section:
![](https://i.imgur.com/ZLZWn9F.png =x300)

click on "Add Variable" and create a "Raw" type variable. **Use the name that you want**:
![](https://i.imgur.com/TbfMs8a.png =x300)


Now you have your web system prepared to receive the data 


## Sending data to Ubidots

Now you will send data to our device **using MQTT with Python**.
Take a look first to the Ubidots MQTT API Reference: https://ubidots.com/docs/hw/?language=Python#mqtt


The name of the broker for educational users is **"things.ubidots.com"**. To interact with it, you will need a TOKEN. To get yours click on “API Credentials” under your profile tab:

![](https://i.imgur.com/StmHEVg.png)

In my case I have:

![](https://i.imgur.com/pCmKyeQ.png)

To connect to the MQTT broker you'll have to use your **``Default Token``** as the MQTT username, and `None` as password.

The **topic** you have to use is **`/v1.6/devices/{LABEL_DEVICE}`** where you have to replace your value for the **API label** `{LABEL_DEVICE}` (e.g., mydevice_pm). 

![](https://i.imgur.com/9hE10mZ.png)


The data must be represented using JSON. The simplest format is, for example: `{"temperature":10}` 


So, for example, to send the value 25 to variable `the_variable` of device ``mydevice_pm`` the code should look like:  

```python=
...
msg_to_be_sent = '{"the_variable":25}'
client.publish("/v1.6/devices/mydevice_pm", 
                payload=msg_to_be_sent, 
                qos=0, 
                retain=False)
...
```

You'll get:

![](https://i.imgur.com/YsboDek.png)

:::danger
1.- Repite los pasos anteriores con tus datos de Ubidots (credenciales y nombre del dispositivo y variable usandos)  y utilizando el codigo del  "producer" (`sipub.py`).
El codigo tiene que enviar cada vez un numero aleatorio entre 0 y 100. Te conviene utilizar un diccionario python y luego pasarlo a JSON.

**Tienes que entregar el fichero python.**
:::

:::info

1) Para generar un numero aleatorio, puedes utilizar esta funcion: `random.randint(0, 100)`
2) Para manejar los datos JSON, Python ofrece la clase `json`. Ejemplo:
```
>>> import json
>>> d = {'sensorId': 25}
Para pasar de un diccionario a un JSON:
>>> dj = json.dumps(d)
Para pasar de JSON a un diccionario:
>>> nd = json.loads(dj)
```

:::


## Creating dashbord elements.

Ubidots allows to visualize the data in various graphical ways.

Go to the Dashboard section and add new widget associated with the variable of your device.
![](https://i.imgur.com/YDQBZ4z.png)

See the alternatives you have and how they can be configured.

:::danger
2.- Crea una dashboard a tu gusto con los datos que has enviado en el ejercicion anterior.
Haz una captura de pantalla de la dashboard resultato y adjuntala al documento a entregar.
:::

## Sending data from TTN 

:::danger
3.- Utilizando como base el codigo del fichero `lab4_ex3.py`, escribe un programa que lee los datos desde TTN, como en la sesion de laboratorio anterior, selecciona una variable (p.ej. la temperatura), y la publica en Ubidots.

Los parametros necesarios para leer datos desde TTN son: 
``` 
Broker: eu1.cloud.thethings.network
Username: lopys2ttn@ttn
Password: NNSXS.A55Z2P4YCHH2RQ7ONQVXFCX2IPMPJQLXAPKQSWQ.A5AB4GALMW623GZMJEWNIVRQSMRMZF4CHDBTTEQYRAOFKBH35G2A
Topic: v3/+/devices/#
``` 
**Tienes que entregar el codigo python desarrollado.**

:::




# Part B: Data to Telegram Bot




In this Lab you'll have to do something similar to the previous one, but this time the data from the TTN have to be accessed using a Telegram bot. The final result should be somehting like this:
![](https://i.imgur.com/r8HM7xw.png =300x)

What you have to do first is create your own Bot. To generate an Access Token, you have to talk to the BotFather following a few simple steps as described here: https://core.telegram.org/bots#6-botfather

Basically, you need a Telegram account and the Telegram app installed in your smartphone or computer.

The "dialogue" will be something like this:

![](https://i.imgur.com/4DRaWKZ.png)


To program the Bot you can use, as a skeleton, the file `lab5.py`. 

You can execute your Bot either in your computer or in repl.it and test it using a smartphone with Telegram.

This package is necessary to program the Bot:
```
https://github.com/python-telegram-bot/python-telegram-bot
```

If you are using your computer, than you'll have to install it using:
```
$ pip install python-telegram-bot 
```

or, if you are using `repl.it`, you have to istall it from the Packages menu:
![](https://i.imgur.com/ecbQt6I.png =x200)
and typing in the search field `python-telegram-bot` and then on the **+** button

You should eventually get to something like this:
![](https://i.imgur.com/sTh1DDY.png)


Fill in the places in `lab5.py` where the text `___FILL_IN_HERE___` is found with the proper values. 


:::danger
4. Comprueba que el Bot funciona. 

Recuerda que los parametros necesarios para leer datos desde TTN son: 
``` 
Broker: eu1.cloud.thethings.network
Username: lopys2ttn@ttn
Password: NNSXS.A55Z2P4YCHH2RQ7ONQVXFCX2IPMPJQLXAPKQSWQ.A5AB4GALMW623GZMJEWNIVRQSMRMZF4CHDBTTEQYRAOFKBH35G2A
Topic: v3/+/devices/#
``` 

Entrega alguna captura de pantalla de su uso. Algo asi:
![](https://i.imgur.com/rWVrO13.png)


:::



:::danger
5. Modifica el Bot para que pueda devolver el valor de temperatura, humedad y luminosidad en función de la petición.

Tienes que obtener algo asi:
![](https://i.imgur.com/VAvnltG.png)


Entrega el fichero python.

:::

