> For the complete documentation index, see [llms.txt](https://theiotlearninginitiative.gitbook.io/internetofthings101/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://theiotlearninginitiative.gitbook.io/internetofthings101/wrap-up/challenge.md).

# Challenge

## Challenge

With this step by step challenge you will have a parallel learning experience of Internet of Things and continue with the implementation of functionality on top of the project you have built during the workshop.

1. Data Reporting, System Data, Device ID
2. Data Reporting, System Communications Protocols, Device ID
3. Data Reporting, System Communications Protocols, RESTFul API
4. Data Reporting, Cloud Computing Services, freeboard.io & dweet.io
5. Data Reporting, Cloud Computing Services, adafruit.io
6. Data Reporting, Cloud Computing Platforms, IBM Watson IoT Platform
7. Physical Sensors (Seeed Studio Grove Kit)
8. Software Version Control System Pushing Code

## 01 Data Reporting, System Data, Device ID

Section [System Data](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/Data.html)

**Instruction**

> Define a global variable "DeviceID" to serve as a Unique Device Identification to your Internet of Things Device

## 02 Data Reporting, System Communications Protocols, Device ID

Section [System Communications Protocols](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/platform/Protocols.html)

**Instruction**

> Include your "**DeviceID**" global variable under your MQTT Publish and Subscribe Topics IoT101/**DeviceID**/#

Code in 2 functions needs to change:

* functionDataSensorMqttPublish
* functionDataActuatorMqttSubscribe

Here it is how new code might look like:

```python
#!/usr/bin/python

import paho.mqtt.client as paho
...
def functionDataActuatorMqttSubscribe():
...
    mqttclient.subscribe("IoT101/DeviceID/DataActuator", 0)
...
def functionDataSensorMqttPublish():
...
        topic = "IoT101/DeviceID/DataSensor"
...
```

## 03 Data Reporting, System Communications Protocols, RESTFul API

Section [System Communications Protocols](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/platform/Protocols.html) Flask-RESTful Lab

**Instruction**

> Incorporate a RESTFul API named "sensor" using Flask-RestFul to send data taken from the Simulated Sensor under functionDataSensor Python function.

Once implemented, run your main.py program and access the network resource using a web browser, you should get the data taken from the the Simulated Sensor:

```bash
    root@edison:~/TheIoTLearningInitiative/InternetOfThings101# python main.py
     ...
     ...
     * Running on http://127.0.0.1:5000/ (Press CTRL+C to quit)
     * Restarting with stat
     * Debugger is active!
     * Debugger pin code: 331-202-890
     ...
     ...
```

Connect to your boardipaddress:5000/sensor in a web browser, data shall be displayed

```bash
    127.0.0.1 - - [28/Dec/2015 15:07:38] "GET /sensor HTTP/1.1" 200 -
    127.0.0.1 - - [28/Dec/2015 15:07:40] "GET /sensor HTTP/1.1" 200 -
```

## 04 Data Reporting, Cloud Computing Services, freeboard.io & dweet.io

Section [Cloud Computing Services](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/platform/Services.html)

**Instruction**

> Create a [freeboard.io](https://freeboard.io/) dashboard and send the data taken from the Simulated Sensor using [dweet.io](http://dweet.io/) Python library

Do not hesitate to google and see this link [BoardEdison en Freeboard con dweet](http://statusorel.ru/technology/boardedison-en-freeboard-con-dweet.html)

## 05 Data Reporting, Cloud Computing Services, adafruit.io

Section [Cloud Computing Services](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/platform/Services.html)

**Instruction**

> Create an [adafruit.Io](https://io.adafruit.com/) dashboard and send the data taken from the Simulated Sensor using Adafruit MQTT Python Library

Do not hesitate to google and see this link [Learn Adafruit IO](https://learn.adafruit.com/adafruit-io/overview)

## 06 Data Reporting, Cloud Computing Platforms, IBM Watson IoT Platform

Section [Cloud Computing Platforms](https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/platform/Platforms.html)

**Instruction**

> Implement code to publish the data taken from the Simulated Sensor to the IBM Watson IoT Platform

Remember to reuse the code seen under "System Cloud Platforms IBM Watson IoT Platform Quickstart Physical Device", file [IBM IoT Quickstart](https://github.com/ibm-messaging/iot-gw-solutions/releases/download/1.03/ibm-iot-quickstart.zip)

## 07 Physical Sensors Seeed Studio Grove Kit

**Instruction**

> Implement code to replace existing functionality/logic under functionDataActuator and functionDataSensor by using a physical actuator and sensor from the Seeed Studio Grove Kit

Code in 2 functions needs to change:

* functionDataActuator
* functionDataSensor

Remember UPM library give you Python bindings to easy use of your Grove Sensors

* <https://github.com/intel-iot-devkit/upm/tree/master/examples/python>
* [Sensor Grove Light](https://github.com/intel-iot-devkit/upm/blob/master/examples/python/grovelight.py)
* [Actuator Grove Relay](https://github.com/intel-iot-devkit/upm/blob/master/examples/python/groverelay.py)

Here it is how new code might look like:

```python
#!/usr/bin/python

import paho.mqtt.client as paho
...
def functionDataActuator(status):
    # Implement logic to drive Actuator / Grove Relay
...
def functionDataSensor():
    # Use Sensor / Grove Light to replace psutil.net_io_counters()
    ...
    return data
...
```

## 08 Software Version Control System Pushing Code

Section [Software Version Control System](<https://theiotlearninginitiative.gitbooks.io/internetofthings101/content/documentation/ControlVersionSystem.html >)

**Instruction**

> Confirm every code under your local "TheIoTLearningInitiative" git repository, "InternetOfThings101" directory is uploaded to your remote "TheIoTLearningInitiative" github repository

ToDo Diretory Structure
