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
- Connecting of hardware
- Setting up IBM Bluemix IoT Platform
- Register for twilio
- Setup raspberry pi (Plant Monitoring Device) node red
- 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
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-starterEnter 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
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
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
- You should be in your IOT Platform console.
- From the left sidebar, click on the devices icon
- Click on “Device Types” from the top
- Click on “Add Device Type” from the top right corner
- Enter the following information:
- Type: Device
- Name: raspberrypi
- Description: Raspberry Pi
- Click on Next, then click on Done
- Click on “Browse” from the top
- Click on “Add Device”
- Enter the following information:
- Select existing device type: raspberrypi
- DeviceID: pms1
- Click next till you reach the summary
- Click on done
- 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
- Go back to your bluemix console (https://console.bluemix.net/dashboard/apps)
- Click on the cloudantNoSQLDB service under the Cloud Foundry Services
- On the side, click on Service Credentials
- Click on the New Credential Button
- Click Add
- Click View Credentials in the Action column of your newly created service credentials
- Take note of these credentials. You will need them later for modification of the app.py code
Step 5: Register for Twilio
- Register for a new twilio account at https://www.twilio.com/
- Upon registration, you will be prompted to name a project. In my case, i named it Plant Monitoring system.
- From the sidebar, click on all products and services and click on programmable SMS.
- Click on “Get Started” As you do not have a twilio number, click on “Get a number”
- A pop up with a number will show. Click on “use this number”
- Take note of this twilio number, you will need it later.
- Go to the console dashboard
- Take note of your account SID and Auth Token
Step 6: Install Required Packages on Plant Monitoring Device
- Install Node red
sudo npm install -g --unsafe-perm node-red - Install paho
sudo pip install paho-mqtt - Install Watson IoT node for node red
sudo npm i -g node-red-contrib-ibm-watson-iot - Install BCM2835
- wget http://www.airspayce.com/mikem/bcm2835/bcm2835-1.52.tar.gz
- tar zxvf bcm2835-1.52.tar.gz
- cd bcm2835-1.48
- ./configure
- make
- sudo make check
- sudo make install Install
- Node DHT-Sensor
sudo npm install node-dht-sensor - Install Node Contrib DHT Sensor
sudo npm install --unsafe-perm -g node-red-contrib-dht-sensor - 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
- Log into your bluemix account and go to the dashboard (https://console.bluemix.net/dashboard/apps)
- Click on the link to your application which is found under the "Route" Column of the list of your Cloud Foundry Apps
- 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 v3.3.7
https://github.com/twbs/bootstrap/releases/download/v3.3.7/bootstrap-3.3.7-dist.zip - FontAwesome v5.0.1
https://use.fontawesome.com/releases/v5.0.1/fontawesome-free-5.0.1.zip - jQuery v3.1.0
https://blog.jquery.com/2016/07/07/jquery-3-1-0-released-no-more-silent-errors/ - Morrisjs v0.5.0
https://github.com/morrisjs/morris.js/archive/0.5.0.zip - Raphael v2.2.0
https://api.github.com/repos/DmitryBaranovskiy/raphael/zipball/v2.2.0
Bootstrap
- Open downloaded zip file (bootstrap-3.3.7-dist.zip)
- Open the bootstrap-3.3.7-dist folder
- Extract all contents to Application/static/bootstrap
FontAwesome
- Open downloaded zip file (fontawesome-free-5.0.1.zip)
- Open the fontawesome-free-5.0.2 folder
- Open the web-fonts-with-css folder
- Extract all contents to Application/static/font-awesome
jQuery
- Download jquery-3.1.0.js and jquery-3.1.0.min.js
- Put both javascript files in Application/static/jquery
Morrisjs
- Open the downloaded zip file (morris.js-0.5.0.zip)
- Open the morris.js-0.5.0 folder
- Extract all contents to Application/static/morrisjs
Raphael
- Open the downloaded zip file (raphael-2.2.0.zip)
- Open the raphael-2.2.0 folder
- 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