Introduction: IoT Plant Monitoring System (With IBM IoT Platform)

Overview

The Plant Monitoring System (PMS) is an application built with individuals who are in the working class with a green thumb in mind.

Today, working individuals are busier than ever before; advancing their careers and managing their finances. Working hours are ever longer, leaving these people less time to do things which they enjoy.

This creates a problem for people who have green thumbs, work extra long hours and do not have any domestic helper at home to tend to their plants.

Thus, the PMS was created to assist such individuals in providing better care, yet ensuring optimum growth for their plants at home while they work.

Summary of steps

The following is a summary of the steps that will be done

  1. Connecting of hardware
  2. Setting up IBM Bluemix IoT Platform
  3. Register for twilio
  4. Setup raspberry pi (Plant Monitoring Device) node red
  5. Setup bluemix node redSetup Webserver

Step 1: Connect Hardware

Hardware Requirements

  • 2 Raspberry Pis
  • 1 Breadboard
  • 1 GPIO Ribbon Cable
  • 1 GPIO Extension Board (T-Cobbler Kit)
  • 1 MCP3008 ADC (Analog Digital Converter)
  • 1 DHT_11 Sensor
  • 2 10k Ohm Resistors
  • 1 Light Dependent Resistor
  • 1 Soil Moisture Sensor (YL-69)
  • 1 Water Level Sensor
  • 26 Cables (16 Male to Male, 10 Male to Female)

Connect the parts!

Refer to the 2nd Image of this step for the fritzing diagram and connect the parts accordingly

Step 2: Create IoT Platform Resources

  1. Log in your Bluemix account and proceed to the IoT BoilerPlates Starter Page section
    https://new-console.ng.bluemix.net/catalog/starters/internet-of-things-platform-starter

  2. Enter your app name and host name Wait for Bluemix to setup your app and the status shows “Your app is running” If it is still not running after 10 minutes, you may have to restart your app by clicking the restart button located at the top right corner

  3. From the side bar, click on “Connections” Click on the iotf service link from the listed connections You will be redirected to the IOT service configuration Click on the “Launch” button to be redirected to the iotf console

  4. Take note of the link you are redirected to for example: https://suwdek.internetofthings.ibmcloud.com/dashboard/ The 6 letters infront of “.internetofthings.ibmcloud.com/dashboard/” is your organization ID. Take note of it.

Step 3: Create Device Type and Device

  1. You should be in your IOT Platform console.
  2. From the left sidebar, click on the devices icon
  3. Click on “Device Types” from the top
  4. Click on “Add Device Type” from the top right corner
  5. Enter the following information:
    1. Type: Device
    2. Name: raspberrypi
    3. Description: Raspberry Pi
  6. Click on Next, then click on Done
  7. Click on “Browse” from the top
  8. Click on “Add Device”
  9. Enter the following information:
    1. Select existing device type: raspberrypi
    2. DeviceID: pms1
  10. Click next till you reach the summary
  11. Click on done
  12. You will be redirected to the Device Credentials page. Please take note of your device details. This is important as the authentication token cannot be recovered

Step 4: Create Service Credentials for Cloudant

  1. Go back to your bluemix console (https://console.bluemix.net/dashboard/apps)
  2. Click on the cloudantNoSQLDB service under the Cloud Foundry Services
  3. On the side, click on Service Credentials
  4. Click on the New Credential Button
  5. Click Add
  6. Click View Credentials in the Action column of your newly created service credentials
  7. Take note of these credentials. You will need them later for modification of the app.py code

Step 5: Register for Twilio

  1. Register for a new twilio account at https://www.twilio.com/
  2. Upon registration, you will be prompted to name a project. In my case, i named it Plant Monitoring system.
  3. From the sidebar, click on all products and services and click on programmable SMS.
  4. Click on “Get Started” As you do not have a twilio number, click on “Get a number”
  5. A pop up with a number will show. Click on “use this number”
  6. Take note of this twilio number, you will need it later.
  7. Go to the console dashboard
  8. Take note of your account SID and Auth Token

Step 6: Install Required Packages on Plant Monitoring Device

  1. Install Node red
    sudo npm install -g --unsafe-perm node-red
  2. Install paho
    sudo pip install paho-mqtt
  3. Install Watson IoT node for node red
    sudo npm i -g node-red-contrib-ibm-watson-iot
  4. Install BCM2835
    1. wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz
    2. tar zxvf bcm2835-1.52.tar.gz
    3. cd bcm2835-1.48
    4. ./configure
    5. make
    6. sudo make check
    7. sudo make install Install
  5. Node DHT-Sensor
    sudo npm install node-dht-sensor
  6. Install Node Contrib DHT Sensor
    sudo npm install --unsafe-perm -g node-red-contrib-dht-sensor
  7. Restart your pi
    sudo reboot now

Step 7: Setup Node Red Application for Plant Monitoring Device

Start your node red by opening the Terminal and typing

node-red start
<p>Welcome to Node-RED<br>===================</p><p>20 Feb 07:07:34 - [info] Node-RED version: v0.16.2
20 Feb 07:07:34 - [info] Node.js  version: v7.8.0
20 Feb 07:07:34 - [info] Linux 4.4.50-v7+ arm LE
20 Feb 07:07:36 - [info] Loading palette nodes
{ MODE: { MODE_0: 0, MODE_1: 1, MODE_2: 2, MODE_3: 3 },
  CS: { none: 64, high: 4, low: 0 },
  ORDER: { msb: false, lsb: true },
  Spi: [Function: Spi] }
20 Feb 07:07:42 - [info] Settings file  : /home/pi/.node-red/settings.js
20 Feb 07:07:42 - [info] User directory : /home/pi/.node-red
20 Feb 07:07:42 - [info] Flows file     : /home/pi/.node-red/start
20 Feb 07:07:42 - [info] Server now running at <a href="http://127.0.0.1:1880/"> http://127.0.0.1:1880/
</a>
20 Feb 07:07:42 - [info] Starting flows
20 Feb 07:07:43 - [info] Started flows</p>

Open your browser and connect to the node red application

Click on the hamburger icon, hover over "import" and click on "clipboard" then paste the code provided below in

<p>[{"id":"d9ac3f49.78dc1","type":"tab","label":"Flow 1"},{"id":"9b23dde8.8ae15","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"MCP3008","pin":0,"dnum":0,"x":636.996208190918,"y":148.48046493530273,"wires":[["cc10fa6a.91d7f8"]]},{"id":"cc10fa6a.91d7f8","type":"function","z":"d9ac3f49.78dc1","name":"Store light sensor values","func":"global.set(\"light\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":869.984447479248,"y":146.67577171325684,"wires":[[]]},{"id":"ab38a13c.d6ce7","type":"inject","z":"d9ac3f49.78dc1","name":"Get values","topic":"","payload":"","payloadType":"date","repeat":"3","crontab":"","once":false,"x":107.6093978881836,"y":118.0000171661377,"wires":[["b1fa33c1.cd03"]]},{"id":"55163f38.0f1fb","type":"inject","z":"d9ac3f49.78dc1","name":"Send to bluemix","topic":"","payload":"","payloadType":"date","repeat":"60","crontab":"","once":false,"x":128.00001525878906,"y":274.000036239624,"wires":[["22b20b42.1732f4"]]},{"id":"87b483ab.ccaff","type":"function","z":"d9ac3f49.78dc1","name":"Format the msg","func":"light = global.get('light')\nsoil = global.get('soil')\nwater = global.get('water')\ntemperature = global.get('temperature')\nhumidity = global.get('humidity')\nid = global.get('DeviceId')\nmsg.payload = {'d': {'ip':'169.254.134.248','data':{'lightValue':light,'soilMoisture':soil, 'temperature':temperature, 'humidity': humidity,'waterLevel':water,'timeTaken':new Date().toString()}}};\nreturn msg;","outputs":1,"noerr":0,"x":560.9961547851562,"y":396.6641960144043,"wires":[["62fa8f9a.ef532"]]},{"id":"62fa8f9a.ef532","type":"json","z":"d9ac3f49.78dc1","name":"","x":736.9883003234863,"y":398.515661239624,"wires":[["204a6503.df7aca","8f8d1209.41256"]]},{"id":"de7e0a7a.f3cc68","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"ADC (Water)","pin":"1","dnum":0,"x":646.1000709533691,"y":187.6000156402588,"wires":[["f72a6071.a693e"]]},{"id":"aaa299b.bd09168","type":"pimcp3008","z":"d9ac3f49.78dc1","name":"ADC (Soil)","pin":"2","dnum":0,"x":636.1000709533691,"y":226.6000099182129,"wires":[["3944c728.9166f8"]]},{"id":"f72a6071.a693e","type":"function","z":"d9ac3f49.78dc1","name":"Store water sensor values","func":"global.set(\"water\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":870.0000228881836,"y":184.00001525878906,"wires":[[]]},{"id":"3944c728.9166f8","type":"function","z":"d9ac3f49.78dc1","name":"Store water sensor values","func":"global.set(\"soil\", msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":870.0000228881836,"y":225.00000953674316,"wires":[[]]},{"id":"33acaa7e.373ce6","type":"function","z":"d9ac3f49.78dc1","name":"Store Temperature Value","func":"global.set(\"temperature\", parseFloat(msg.payload))\nreturn msg;","outputs":1,"noerr":0,"x":868.1001281738281,"y":270.60001373291016,"wires":[[]]},{"id":"9d8a6040.48843","type":"rpi-dht22","z":"d9ac3f49.78dc1","name":"","topic":"DHT11","dht":"11","pintype":"0","pin":"19","x":626.1000900268555,"y":282.6000118255615,"wires":[["33acaa7e.373ce6","405fe354.61d30c"]]},{"id":"405fe354.61d30c","type":"function","z":"d9ac3f49.78dc1","name":"Store Humidity Value","func":"global.set(\"humidity\", parseFloat(msg.humidity))\nreturn msg;","outputs":1,"noerr":0,"x":858.1000747680664,"y":315.8000373840332,"wires":[[]]},{"id":"204a6503.df7aca","type":"wiotp out","z":"d9ac3f49.78dc1","authType":"d","qs":"false","qsDeviceId":"","deviceKey":"","deviceType":"","deviceId":"","event":"data","format":"json","qos":"2","name":"","x":897.1001224517822,"y":414.00006198883057,"wires":[]},{"id":"8f8d1209.41256","type":"debug","z":"d9ac3f49.78dc1","name":"","active":true,"console":"false","complete":"payload","x":919.1001224517822,"y":379.20001125335693,"wires":[]},{"id":"f7f3df6d.8a3eb","type":"wiotp in","z":"d9ac3f49.78dc1","authType":"d","deviceKey":"","deviceType":"","deviceId":"","command":"RecordValues","commandType":"g","qos":"2","name":"","x":180.10001373291016,"y":489.60006284713745,"wires":[["c6b07b74.194948","31ba5ffa.4299b"]]},{"id":"89b9f230.889f8","type":"switch","z":"d9ac3f49.78dc1","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"true","vt":"str"}],"checkall":"true","outputs":1,"x":457.10001373291016,"y":174.8000659942627,"wires":[["9b23dde8.8ae15","de7e0a7a.f3cc68","aaa299b.bd09168","9d8a6040.48843"]]},{"id":"c6b07b74.194948","type":"function","z":"d9ac3f49.78dc1","name":"Set recording","func":"global.set(\"RecordValues\",msg.payload)\nreturn msg;","outputs":1,"noerr":0,"x":449.1000108718872,"y":486.8000144958496,"wires":[[]]},{"id":"b1fa33c1.cd03","type":"function","z":"d9ac3f49.78dc1","name":"Get record values setting","func":"msg.payload = global.get(\"RecordValues\");\nreturn msg;","outputs":1,"noerr":0,"x":269.1000061035156,"y":177.8000659942627,"wires":[["89b9f230.889f8"]]},{"id":"f75c8052.b73d8","type":"inject","z":"d9ac3f49.78dc1","name":"","topic":"Set default on start","payload":"","payloadType":"date","repeat":"","crontab":"","once":true,"x":107.10007858276367,"y":72.60006904602051,"wires":[["cd5b2dd8.31093"]]},{"id":"cd5b2dd8.31093","type":"function","z":"d9ac3f49.78dc1","name":"Set recording to true","func":"global.set(\"RecordValues\",\"true\");\nglobal.set(\"DeviceId\",\"pms1\");\nreturn msg;","outputs":1,"noerr":0,"x":393.1000099182129,"y":69.8000020980835,"wires":[[]]},{"id":"22b20b42.1732f4","type":"function","z":"d9ac3f49.78dc1","name":"Get record values setting","func":"msg.payload = global.get(\"RecordValues\");\nreturn msg;","outputs":1,"noerr":0,"x":288.10003662109375,"y":340.8000602722168,"wires":[["a5c1ec24.46f3c"]]},{"id":"a5c1ec24.46f3c","type":"switch","z":"d9ac3f49.78dc1","name":"","property":"payload","propertyType":"msg","rules":[{"t":"eq","v":"true","vt":"str"}],"checkall":"true","outputs":1,"x":468.10005950927734,"y":339.80003452301025,"wires":[["87b483ab.ccaff"]]},{"id":"31ba5ffa.4299b","type":"debug","z":"d9ac3f49.78dc1","name":"","active":true,"console":"false","complete":"payload","x":440.10009002685547,"y":532.2000160217285,"wires":[]}]</p>

Make sure to change the "data" and "RecordValues" IoT watson nodes such that it can connect to your application.

Step 8: Setup Node Red Application for Server

  1. Log into your bluemix account and go to the dashboard (https://console.bluemix.net/dashboard/apps)
  2. Click on the link to your application which is found under the "Route" Column of the list of your Cloud Foundry Apps
  3. You will be redirected to another page, click on "go to your node red editor"

Similar to the previous step, click on the hamburger icon, hover over "import" and click on "clipboard" then paste the code provided below in

<p>[{"id":"5ef69739.4622e8","type":"tab","label":"Flow 4","disabled":false,"info":""},{"id":"ff6a8be6.47bb08","type":"ibmiot in","z":"5ef69739.4622e8","authentication":"boundService","apiKey":"","inputType":"evt","logicalInterfaceId":"","ruleId":"","deviceId":"","applicationId":"","deviceType":"","eventType":"+","commandType":"","format":"json","name":"My RaspberryPi Gateway","service":"registered","allDevices":true,"allApplications":"","allDeviceTypes":true,"allEvents":true,"allCommands":"","allFormats":"","qos":0,"x":150,"y":60,"wires":[["fd7826e.ba07ed8"]]},{"id":"fd7826e.ba07ed8","type":"function","z":"5ef69739.4622e8","name":"Store Pi Payload","func":"var value=msg.payload\nmsg.Value=value\nreturn msg;","outputs":1,"noerr":0,"x":150,"y":160,"wires":[["36d60c30.cf6bf4"]]},{"id":"36d60c30.cf6bf4","type":"cloudant in","z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantNoSQLDB","search":"_all_","design":"","index":"","x":350,"y":160,"wires":[["5ac01466.11499c"]]},{"id":"5ac01466.11499c","type":"function","z":"5ef69739.4622e8","name":"Check if IP Exist","func":"msg.exist=false;\nif(msg.payload.length!=0){\n    for(var i=0;i<msg.payload.length;i++){\n   ="" if(msg.payload[i].pi.ip="=msg.deviceId){\n " msg.exist="true;\n " break;\n ="" }\n ="" }\n="" \n}\nreturn="" msg;","outputs":1,"noerr":0,"x":100,"y":280,"wires":[["423e0c3f.a29a14"]]},{"id":"423e0c3f.a29a14","type":"switch","z":"5ef69739.4622e8","name":"","property":"exist","propertytype":"msg","rules":[{"t":"false"},{"t":"true"}],"checkall":"true","repair":false,"outputs":2,"x":290,"y":280,"wires":[["d8ac7a14.abdca8"],["f1aa9184.9aa62"]]},{"id":"d8ac7a14.abdca8","type":"function","z":"5ef69739.4622e8","name":"create="" document","func":"msg.payload="{'Pi':{'ip':msg.deviceId,'description':'','SendNotiMsg':false,'RecordValues':true,'Data':[msg.Value.d.data]}}\nreturn" msg;","outputs":1,"noerr":0,"x":510,"y":220,"wires":[["8970318.faf35d"]]},{"id":"8970318.faf35d","type":"cloudant="" out","z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantnosqldb","payonly":true,"operation":"insert","x":710,"y":220,"wires":[]},{"id":"f1aa9184.9aa62","type":"function","z":"5ef69739.4622e8","name":"update="" document","func":"var="" doc="" ;\nfor(var="" i="0;i<msg.payload.length;i++){\n " msg.payload[i].pi.data.push(msg.value.d.data)\n ="" }\n}\nmsg.payload="doc\nreturn" msg;","outputs":1,"noerr":0,"x":490,"y":280,"wires":[["c6d00c4b.1133f","bd6f8b88.6d8f58"]]},{"id":"c6d00c4b.1133f","type":"cloudant="" out","z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantnosqldb","payonly":true,"operation":"insert","x":730,"y":280,"wires":[]},{"id":"ab7a1a2c.a693e8","type":"inject","z":"5ef69739.4622e8","name":"check="" db","topic":"","payload":"","payloadtype":"date","repeat":"5","crontab":"","once":false,"oncedelay":0.1,"x":90,"y":497,"wires":[["fa28a205.3b18e"]]},{"id":"fa28a205.3b18e","type":"cloudant="" in","z":"5ef69739.4622e8","name":"","cloudant":"","database":"sensor","service":"sp-1530218-cloudantnosqldb","search":"_all_","design":"","index":"","x":250,"y":497,"wires":[["ab4b353f.73e5c8","350cf9f3.3ac216"]]},{"id":"ab4b353f.73e5c8","type":"function","z":"5ef69739.4622e8","name":"get="" activated="" pi","func":"var="" activatedids="[];\nfor(var" if(msg.payload[i].pi.recordvalues){\n ="" activatedids.push({'payload':msg.payload[i].pi.ip});\n ="" }\n}\nreturn="" [activatedids];","outputs":1,"noerr":0,"x":440,"y":497,"wires":[["6436cfde.857a9"]]},{"id":"a7fc5617.180d58","type":"twilio="" out","z":"5ef69739.4622e8","service":"_ext_","twilio":"","from":"","number":"","name":"","x":930,"y":440,"wires":[]},{"id":"bd6f8b88.6d8f58","type":"function","z":"5ef69739.4622e8","name":"check="" if="" notification="" option="" is="" on","func":"var="" sendmsg="false;\nif(msg.payload.Pi.SendNotiMsg==true){\n " if(msg.value.d.data.lightvalue="">400 || msg.Value.d.data.soilMoisture>600||msg.Value.d.data.temperature>28 || msg.Value.d.data.temperature<25 || msg.Value.d.data.waterLevel>300){\n        sendMsg=true\n    }\n}\nmsg.payload=sendMsg\nreturn msg;","outputs":1,"noerr":0,"x":600,"y":360,"wires":[["cca33d71.c2a21","4af3f470.59702c"]]},{"id":"cca33d71.c2a21","type":"switch","z":"5ef69739.4622e8","name":"","property":"payload","propertyType":"msg","rules":[{"t":"true"}],"checkall":"true","repair":false,"outputs":1,"x":850,"y":380,"wires":[["a0c1e4bf.fa39d8"]]},{"id":"4af3f470.59702c","type":"debug","z":"5ef69739.4622e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","x":870,"y":320,"wires":[]},{"id":"a0c1e4bf.fa39d8","type":"function","z":"5ef69739.4622e8","name":"Set Msg Payload","func":"msg.payload=\"Your current plant environtment is not Condusive.\"\n            +\"\\n This is the current environment details\"\n            +\"\\n Temperature: \"+msg.Value.d.data.temperature\n            +\"\\n Humidity: \"+msg.Value.d.data.humidity\n            +\"\\n Light Value: \"+msg.Value.d.data.lightValue\n            +\"\\n Soil Moisture: \"+msg.Value.d.data.soilMoisture\n            +\"\\n Water Level: \"+msg.Value.d.data.waterLevel\nreturn msg;","outputs":1,"noerr":0,"x":730,"y":440,"wires":[["a7fc5617.180d58"]]},{"id":"6436cfde.857a9","type":"function","z":"5ef69739.4622e8","name":"Set Payload","func":"msg.deviceId = msg.payload;\nmsg.payload = true;\nreturn msg;","outputs":1,"noerr":0,"x":630,"y":497,"wires":[["37eba0a0.59ea4","7a069f4a.6a542"]]},{"id":"37eba0a0.59ea4","type":"ibmiot out","z":"5ef69739.4622e8","authentication":"boundService","apiKey":"","outputType":"cmd","deviceId":"pms1","deviceType":"raspberrypi","eventCommandType":"RecordValues","format":"boolean","data":"true","qos":"2","name":"IBM IoT","service":"registered","x":820,"y":497,"wires":[]},{"id":"7a069f4a.6a542","type":"debug","z":"5ef69739.4622e8","name":"","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"false","x":830,"y":557,"wires":[]},{"id":"350cf9f3.3ac216","type":"function","z":"5ef69739.4622e8","name":"Get Deactivated Pi","func":"var deactivatedIds = [];\nfor(var i=0;i<msg.payload.length;i++){\n   ="" if(!msg.payload[i].pi.recordvalues){\n ="" deactivatedids.push({'payload':msg.payload[i].pi.ip});\n ="" }\n}\nreturn="" [deactivatedids];","outputs":1,"noerr":0,"x":450,"y":557,"wires":[["c88ac813.15e468"]]},{"id":"c88ac813.15e468","type":"function","z":"5ef69739.4622e8","name":"set="" payload","func":"msg.deviceid="msg.payload;\nmsg.payload" =="" false;\n\nreturn="" msg;","outputs":1,"noerr":0,"x":630,"y":557,"wires":[["2335fad3.ebf726"]]},{"id":"2335fad3.ebf726","type":"ibmiot="" out","z":"5ef69739.4622e8","authentication":"boundservice","apikey":"","outputtype":"cmd","deviceid":"pms1","devicetype":"raspberrypi","eventcommandtype":"recordvalues","format":"boolean","data":"false","qos":"2","name":"ibm="" iot","service":"registered","x":820,"y":617,"wires":[]}]<="" p=""></msg.payload.length;i++){\n ></msg.payload.length;i++){\n ></p>

Make sure to change the twilio node so that your twilio credentials and twilio number is configured in the node

Step 9: Setup Pi Web Server

IN YOUR SECOND RASPBERRY PI...

Install required packages

Open the terminal and type in the following commands:

sudo pip install gpiozero

sudo pip install flask

sudo pip install gevent

sudo pip install cloudant

File Structure

Refer to the image of this step for the file structure

Download and add additional static content

In order to ensure that our web applications looks and works as described, we will need to download and add some additional static content for it to work.

Bootstrap

  1. Open downloaded zip file (bootstrap-3.3.7-dist.zip)
  2. Open the bootstrap-3.3.7-dist folder
  3. Extract all contents to Application/static/bootstrap

FontAwesome

  1. Open downloaded zip file (fontawesome-free-5.0.1.zip)
  2. Open the fontawesome-free-5.0.2 folder
  3. Open the web-fonts-with-css folder
  4. Extract all contents to Application/static/font-awesome

jQuery

  1. Download jquery-3.1.0.js and jquery-3.1.0.min.js
  2. Put both javascript files in Application/static/jquery

Morrisjs

  1. Open the downloaded zip file (morris.js-0.5.0.zip)
  2. Open the morris.js-0.5.0 folder
  3. Extract all contents to Application/static/morrisjs

Raphael

  1. Open the downloaded zip file (raphael-2.2.0.zip)
  2. Open the raphael-2.2.0 folder
  3. Extract all contents to Application/static/raphael

Step 10: Add Code for Files in Web Server

Download the following files and add them to their respective directories within pi web server

Remember to change the service credentials in the app.py fileto your cloudant service credentials

NOTE: Due to an issue with uploading the index.html file, I have uploaded it as a .txt file. Please rename it to index.html after downloading it

Step 11: Start It!

In your web server pi, run the following commands:

cd Application
sudo python app.py